iOS:GCDAsyncSocket 及其标签

Posted

技术标签:

【中文标题】iOS:GCDAsyncSocket 及其标签【英文标题】:iOS: GCDAsyncSocket and its tag 【发布时间】:2014-07-17 17:37:39 【问题描述】:

在我的应用程序中,我使用的是 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 块内;它似乎无法识别新标签。

为什么会这样?

【问题讨论】:

读写的tags值没有关系。 好的,管理不同阅读器的方法是什么? 发送数据时,应在数据前添加header,告知peer数据何时结束。在标头中,应该有一个表示数据长度的长度字段和一个表示数据索引的id字段。 id 字段作为代码中的标记,但它需要服务器发送具有相同 id 的响应。 可以举个例子吗?似乎如果我在委托方法“didRead”中有一个打开的“readData”,它会继续工作,直到到达一些要读取的数据 【参考方案1】:

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

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
    

【讨论】:

以上是关于iOS:GCDAsyncSocket 及其标签的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发——GCDAsyncSocket

IOS GCDAsyncSocket

iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)

(六十五)iOS的socket实现(GCDAsyncSocket)

iOS之GCDAsyncSocket第三方库的使用

GCDAsyncSocket ReadTimeoutError 出现问题