在socket中按顺序读取消息

时间:2014-09-11 02:36:45

标签: ios sockets

我已经构建了一个套接字来在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条消息。 (我不知道每封邮件的大小)

感谢。

1 个答案:

答案 0 :(得分:1)

你必须制定自己的协议。例如,客户端可以为每条消息附加\n,以便服务器可以按\n拆分消息。但是,如果您的邮件中包含\n个字符,则可以修改协议,先发送邮件的长度,再按\n分隔:

客户发送:8\nMessage1

客户发送:14\nAnotherMessage

服务器收到:8\nMessage114\nAnotherMessage

因此,您首先阅读\n并获取内容长度。然后你读了那么多角色。

请注意字节流和文本流之间的区别。您可以谷歌了解TCP文本流以了解有关它们的更多信息。最好的办法是发送正在发送的字节数,而不是字符数。

请注意,有时候,您不会收到整体信息。例如,以下是可能的:

客户发送:8\nMessage1

客户发送:14\nAnotherMessage

服务器收到:8\nMessage11

服务器收到:4\nAnotherMessage