我正在开发一个项目,我需要将客户端(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之间有一点时间,那么它可以正常工作,但是需要处理这个异常,因为它会发生几次。
答案 0 :(得分:1)
您需要重新设计协议。这里的主要问题是你没有给出你在消息本身之前发送的消息的大小,因此你不知道从每个消息的输入流中读取多少。
这是一个非常简单的协议的例子。每条消息都包含两个字段:
然后,对于您阅读两次的每条消息。首先,您阅读邮件大小sizeof(unsigned int)
,然后阅读邮件本身(您现在知道它的大小)。
这也消除了消息之间空分隔符的必要性,如果你没有正确地转义消息,它可能会在你的消息中出现,并且可能导致严重的问题。