0

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

-(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!");
4

2 回答 2

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];


                        }



                    }
                }
            }
        }
于 2014-03-20T15:09:07.587 回答
0

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

于 2014-03-19T20:28:21.653 回答