我已经构建了一个套接字来在IOS上的客户端和服务器之间传输消息。
if(CFReadStreamSetClient(readStream, registeredEvents, readCallBack, &myContext))
{
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
}
if (!CFReadStreamOpen(readStream)) {
CCLog("Error Open Read Stream");
/* error handling */
}
和readCallBack函数
void readCallBack(CFReadStreamRef stream, CFStreamEventType eventType, void *clientCallBackInfo)
{
switch(eventType) {
case kCFStreamEventHasBytesAvailable:{
UInt8 bufr[10240];
int bytesRead = CFReadStreamRead(stream, bufr, sizeof(bufr));
if(bytesRead >0 ){
NSLog(@"Read: %d", bytesRead);
}
break;
}
case kCFStreamEventErrorOccurred:
NSLog(@"A Read Stream Error Has Occurred!");
case kCFStreamEventEndEncountered:
NSLog(@"A Read Stream Event End!");
default:
break;
}
}
但是当客户端多次向服务器发送多条消息时。
服务器始终将其作为一条消息阅读。
示例:
客户端发送消息1st:Message1
客户端发送第2条消息:Message2
但是当服务器从客户端读取消息时:
结果是:Message1Message2
如何将其拆分为2条消息。 (我不知道每封邮件的大小)
感谢。
答案 0 :(得分:1)
你必须制定自己的协议。例如,客户端可以为每条消息附加\n
,以便服务器可以按\n
拆分消息。但是,如果您的邮件中包含\n
个字符,则可以修改协议,先发送邮件的长度,再按\n
分隔:
客户发送:8\nMessage1
客户发送:14\nAnotherMessage
服务器收到:8\nMessage114\nAnotherMessage
因此,您首先阅读\n
并获取内容长度。然后你读了那么多角色。
请注意字节流和文本流之间的区别。您可以谷歌了解TCP文本流以了解有关它们的更多信息。最好的办法是发送正在发送的字节数,而不是字符数。
请注意,有时候,您不会收到整体信息。例如,以下是可能的:
客户发送:8\nMessage1
客户发送:14\nAnotherMessage
服务器收到:8\nMessage11
服务器收到:4\nAnotherMessage