2012-08-06 39 views
1

我正在制作多人iOS游戏,并遇到以下问题:我发送一个包含自定义对象数组的字典。这些自定义对象符合NSCoding。我的字典转换为NSData这样的:GCDAsyncSocket在运输时改变数据

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:packet]; 

然后把它

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

接收

[sock readDataWithTimeout:-1 tag:tag]; 

并尝试解除存档

NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

一切看起来都非常小号imple,但应用程序崩溃而正在取消归档数据和I收到以下错误

[NSKeyedUnarchiver initForReadingWithData:]:难以理解归档(0X62,0x70,0x6c,0×69(0x73)的,0x74,的0x30,的0x30)”

我查看了发送和接收数据的描述,发现数据来自接收机设备1)已更改和2)截断。

当我通过GameKit协议发送完全相同的数据时,Game Center和蓝牙没有像这样的问题 - 我收到的数据不变,所以显然问题在于GCDAsyncSocket深处。

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

回答

3

正因为如此:The TCP protocol is modeled on the concept of a single continuous stream of unlimited length.您需要追加到您的data某种类型的终止符指示符并使用readDataToData方法。或者您需要在data前加上data长度的指示符。因此,当您使用readDataWithTimeout时,您可以从传入的TCP流中提取确切的字节数。

如何从GCDAsynsSocket笔者使用的终结一个例子:

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]; 

为什么你没有做的所有用的GameKit上述原因的GameKit协议照顾了这一切的原因您。

+0

这怎么可能与NSDictionary一起使用。它如何知道你将使用的终结者是什么? – Andrew 2013-03-12 17:43:32