Ios GCDAsyncSocket在传输数据时更改数据

Ios GCDAsyncSocket在传输数据时更改数据,ios,tcp,nsdata,gcdasyncsocket,Ios,Tcp,Nsdata,Gcdasyncsocket,我正在制作一个多人iOS游戏,遇到了以下问题:我发送了一个字典,里面有一组自定义对象。这些自定义对象符合NSCoding。我将字典转换为NSData,如下所示: NSData *data = [NSKeyedArchiver archivedDataWithRootObject:packet]; 那就寄吧 [asyncSocket writeData:data withTimeout:-1 tag:tag]; 接收 [sock readDataWithTimeout:-1 tag:tag]

我正在制作一个多人iOS游戏,遇到了以下问题:我发送了一个字典,里面有一组自定义对象。这些自定义对象符合
NSCoding
。我将字典转换为
NSData
,如下所示:

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:packet];
那就寄吧

[asyncSocket writeData:data withTimeout:-1 tag:tag];
接收

[sock readDataWithTimeout:-1 tag:tag];
试着去解放自己

NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
一切看起来都非常简单,但应用程序在取消归档数据时崩溃,我收到以下错误

[NSKeyedUnarchiver initForReadingWithData:]:不可理解的存档(0x62、0x70、0x6c、0x69、0x73、0x74、0x30、0x30)'

我查看了发送和接收的数据的描述,发现发送到接收设备的数据1)被修改,2)被截断

当我通过GameKit协议、Game Center和bluetooth发送完全相同的数据时,不会出现这样的问题——我接收到的数据没有发生变化,所以很明显问题就在GCDAsyncSocket的深处

有人遇到过这样的麻烦吗?谢谢

这是因为:您需要在
数据
中附加某种类型的终止符指示符,并使用readDataToData方法。或者,您需要在
数据
前面加上
数据长度的指示符
。因此,当您使用readDataWithTimeout时,可以从传入的TCP流中提取准确的字节数

以下是如何使用本手册作者提供的终止符的示例:


之所以不必使用GameKit执行上述所有操作,是因为GameKit协议为您解决了所有这些问题

这本词典怎么能用呢。它怎么知道你要用的终结者是什么?
NSString *welcomeMsg = @"Welcome to the AsyncSocket Echo Server\r\n";
    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];

    [newSocket writeData:welcomeData withTimeout:-1 tag:WELCOME_MSG];

    [newSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:READ_TIMEOUT tag:0];