【问题标题】:iOS NSStream Socket Read TCP erratic and truncatediOS NSStream Socket 读取 TCP 不稳定并被截断
【发布时间】:2014-03-19 18:03:46
【问题描述】:

我正在使用以下代码从服务器套接字中读取数据。一切开始都很好,但是随着事情的进展,返回的数据会被截断并错误地分块。我已经阅读了所有尝试不同的东西,比如更改缓冲区大小和同步代码,但仍然没有运气。一开始我以为是到期了

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

被异步调用所以我尝试同步它,但没有运气。我增加了几次缓冲区,但没有运气......我只想从服务器读取的一整行在每次触发时传递给 messagedReceived。我确信我在这里做了一些愚蠢的事情或忽略了一些对某人来说很明显的事情。

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

switch (streamEvent) {

    case NSStreamEventOpenCompleted:
        DLog(@"Connection Opened!!!");
        [delegate connectionOpened];
        break;

    case NSStreamEventHasBytesAvailable:

        if (theStream == inputStream) {



            uint8_t buffer[1024];
            int len = 0;

            while ([inputStream hasBytesAvailable]) {
                len = [inputStream read:buffer maxLength:sizeof(buffer)];

            if (len > 0) {

                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                    if (nil != output) {
                        DLog(@"%@", output);
                        [self messageReceived:output];

                    }
                }
            }
        }




        break;

    case NSStreamEventErrorOccurred:
        DLog(@"Can not connect to the host!");

【问题讨论】:

    标签: ios iphone objective-c nsstream nsinputstream


    【解决方案1】:

    我最终做的只是自己搜索行尾字符并构建处理它。

    -(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
    
    switch (streamEvent) {
    
        case NSStreamEventOpenCompleted:
            DLog(@"Connection Opened!!!");
            [delegate connectionOpened];
            break;
    
        case NSStreamEventHasBytesAvailable:
    
            if (theStream == inputStream) {
    
    
    
                uint8_t buffer[1024];
                int len = 0;
    
                while ([inputStream hasBytesAvailable]) {
                    len = [inputStream read:buffer maxLength:sizeof(buffer)];
    
                if (len > 0) {
    
                        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
    
                        if (nil != output) {
                             if ([output rangeOfString:@"\n"].location == NSNotFound) {
    
                                line = AS(line, output);
    
                            } else {
    
    
    
                                NSArray *chunks = [output componentsSeparatedByString: @"\n"];
    
                                line = AS(line, chunks[0]);
                                [self messageReceived:line];
                                DLog("M: %@", line);
    
                                line = chunks[1];
    
    
                            }
    
    
    
                        }
                    }
                }
            }
    

    【讨论】:

      【解决方案2】:

      TCP 流只是字节流,它们本质上不是面向消息的,并且可以随意重组、拆分和合并单个网络数据包。唯一能保证端到端的是所有字节都将按照它们发送的顺序到达。您需要自己处理缓冲部分行(或更常见的组合行),方法是将它们拆分为换行符并保存部分结果。

      【讨论】:

        猜你喜欢
        • 2013-03-25
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 2012-08-08
        • 2015-01-13
        • 2017-02-02
        相关资源
        最近更新 更多