2012-08-06 40 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