0

在我的应用程序中,我使用 GCDAsyncSocket 并以这种方式读写:

NSData *bufferWriteData = [NSData dataWithBytesNoCopy:bufferWrite length:17 freeWhenDone:YES];
[self.socket writeData:bufferWriteData withTimeout:-1 tag:1];
[self.socket readDataWithTimeout:-1 tag:1];

在我在委托方法中读取数据后:

- (void) socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

    NSLog(@"did read data");

    if (tag == 1){

       //analyze my data...

       [self.socket readDataWithTimeout:-1 tag:1];
    }

在这个委托方法中,我想起了“readDataWithTimeout”,所以我以这种方式读取了所有数据。

当我打一个新电话时的问题ID,如果我这样做:

[self.socket writeData:bufferWriteData withTimeout:-1 tag:2];
[self.socket readDataWithTimeout:-1 tag:2];

我用 tag = 2 开始新的写入和新的读取;当调用委托方法“didReadData”时,我的代码进入 tag = 1 块内;它似乎无法识别新标签。

为什么会发生?

4

1 回答 1

1

有几种方法可以处理这个问题。在您的情况下,最好的方法可能只是使用终止符来指示该数据段的结束。您可以在那里阅读: TCP 是一个流。

NSData *MyCommandTerminator(void)
{
    return [NSData dataWithBytes:"\x0D\x0A\x0B\x0A" length:4];
}

//callback from Asyncsocket for incoming data
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag  //sender and receiver
{
    NSLog(@"GCDAsyncSocket didreaddata");
    // do what you wish with data and read again using a terminator
    [sock readDataToData:MyCommandTerminator() withTimeout:-1 tag:1];   //tag is not being used here
}

// your method to send data
-(void)sendData:(NSData *)data
{
        // NSData *bufferWriteData = [NSData dataWithBytesNoCopy:bufferWrite length:17 freeWhenDone:YES];
        NSLog(@"Sendata wehere _peerSocket is your instance of GCDAsyncSocket");
        NSMutableData *myData = [[NSMutableData alloc] initWithData:data];
        [myData appendData:MyCommandTerminator()];
        [_peerSocket writeData:myData withTimeout:-1 tag:2];   // tag is not being used here
    }
于 2014-07-20T13:33:12.820 回答