gpt4 book ai didi

ios - GCDAsyncSocket 在传输数据时更改数据

转载 作者:可可西里 更新时间:2023-11-01 02:47:21 24 4
gpt4 key购买 nike

我正在制作一款多人 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:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)'

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

当我通过 GameKit 协议(protocol)、Game Center 和蓝牙发送完全相同的数据时,就没有这样的问题 - 我收到的数据没有变化,所以显然问题出在 GCDAsyncSocket 的某个深处。

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

最佳答案

是因为这个: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 协议(protocol)会为您处理所有这些事情。

关于ios - GCDAsyncSocket 在传输数据时更改数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11826195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com