从服务器处理数据

时间:2013-07-03 19:51:27

标签: objective-c nsstream

我正在开发一个项目,我需要将客户端(iPhone)连接到服务器。我已经使用CFStream,NSStream等完成了这项工作。服务器发送需要在客户端“逐个”处理的数据包。问题是有时服务器一个接一个地发送两个数据包,所以我在客户端收到的信息(通过[inputStream hasBytesAvailable])是两个数据包的串联。

从服务器到客户端的数据包的体系结构是“data”+ b'00000000'(二进制NULL)。我想知道如何让程序知道当有一个'00000000'字节时,它必须处理该数据包并清空缓冲区。

以下是我正在使用的代码:

case NSStreamEventHasBytesAvailable:

    if (theStream == inputStream) {

        uint8_t buffer[1024];
        int len;

        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) {
                    [self processData:output];
                    NSLog(@"OUTPUT: %@", output);
                }
            }
        }
    }
    break;

一个例子。服务器发送: msg1_whatever(连接)b'0000000' 在此之后,它发送: msg2_whatever + b'00000000'

然后,NSLog将显示: msg1_whatever + b'00000000'msg2_whatever + b'00000000'

而不是两个分开的字符串。如果在发送msg1和msg2之间有一点时间,那么它可以正常工作,但是需要处理这个异常,因为它会发生几次。

1 个答案:

答案 0 :(得分:1)

您需要重新设计协议。这里的主要问题是你没有给出你在消息本身之前发送的消息的大小,因此你不知道从每个消息的输入流中读取多少。

这是一个非常简单的协议的例子。每条消息都包含两个字段:

  1. 大小(unsigned int)。
  2. 信息本身。
  3. 然后,对于您阅读两次的每条消息。首先,您阅读邮件大小sizeof(unsigned int),然后阅读邮件本身(您现在知道它的大小)。

    这也消除了消息之间空分隔符的必要性,如果你没有正确地转义消息,它可能会在你的消息中出现,并且可能导致严重的问题。