誰でも私を助けることができますか?GCDAsyncSocket を使用して、TCP プロトコルを介して 2 つのデバイス間で集中的にデータを交換します。次のようなデータを送信します。
NSMutableDictionary *packet = [[[NSMutableDictionary alloc] init] autorelease];
[packet setObject:[NSNumber numberWithInt:MultiPlayerTypeInfoNextRoundConfirm] forKey:@"type_info"];
[packet setObject:[NSNumber numberWithBool:YES] forKey:@"connection_confirmation"];
NSMutableData *data = [[NSMutableData alloc] initWithData:[NSKeyedArchiver archivedDataWithRootObject:packet]]; //[NSKeyedArchiver archivedDataWithRootObject:packet];
if (currentGameMode == GameModeServer)
[(ServerMultiplayerManager *)multiplayerManager sendNetworkPacket:data withTag:MultiPlayerTypeInfoNextRoundConfirm];
- (void)sendNetworkPacket:(NSData *)data withTag:(long)tag
{
[asyncSocket writeData:data withTimeout:-1 tag:tag];
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
NSLog(@"DID WRITE DATA tag is %ld", tag);
[sock readDataWithTimeout:-1 tag:0];
}
私は次のようなデータを読みました:
- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag
{
NSString *receivedInfo = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
[info_data setData:data];
NSLog(@"DID READ DATA WITH TAG %ld", tag);
if ([receivedInfo isEqualToString:ROOM_FILLED])
{
isMaster = (tcpRequest.identifier == MASTER_CHAR);
NSLog(@"IS MASTER SET %d", isMaster);
[multiplayerDelegate setGameModeServer];
[multiplayerDelegate startGame];
}
else
[self dataProcessing:info_data];
[sender readDataWithTimeout:-1 tag:0];
}
- (void)dataProcessing:(NSData *)data
{
NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
MultiPlayerTypeInfo typeInfo = [[dict objectForKey:@"type_info"] intValue];
}
これらのデータのパケットがめちゃくちゃになるという私の問題。タグ 10 でマークされたパケットが受信側デバイスでタグ 11 でマークされたパケットとして読み取られ、パケット 10 の直後に送信されたとします。実際のパケット 11 のアーカイブ解除に関しては、NSKeyedUnarchiver
例外がスローされますIncomprehensible archive
。
私が理解している限り、どうにかしてパケットを分離する必要があります。私が試したのは、送信されるデータに区切り記号を追加することでした:
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
そして、次のように読み込もうとしています:
[socket readDataToData:[GCDAsyncSocket CRLFData] timeout:-1 tag:some_tag];
しかし、それは役に立ちませんでした。私は何を間違っていますか?代わりに何をすべきですか?