Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:GCDAsyncSocket及其标记_Ios_Asyncsocket_Gcdasyncsocket - Fatal编程技术网

iOS:GCDAsyncSocket及其标记

iOS:GCDAsyncSocket及其标记,ios,asyncsocket,gcdasyncsocket,Ios,Asyncsocket,Gcdasyncsocket,在我的应用程序中,我使用GCDAsyncSocket,并以以下方式写入和读取: NSData *bufferWriteData = [NSData dataWithBytesNoCopy:bufferWrite length:17 freeWhenDone:YES]; [self.socket writeData:bufferWriteData withTimeout:-1 tag:1]; [self.socket readDataWithTimeout:-1 tag:1]; 在我读入委托方法

在我的应用程序中,我使用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的块内输入我的代码;它似乎不认识新标签


为什么会发生这种情况?

有几种处理方法。在您的情况下,最好的方法可能只是使用终止符来指示该数据段的结束。你可以在上面读到:


写入和读取的标记值之间没有关系。好的,管理不同读取器的方法是什么?发送数据时,您应该在数据前面添加一个标头,告诉对等方数据何时结束。在标题中,应该有一个指示数据长度的长度字段和一个指示数据索引的id字段。id字段用作代码中的标记,但它需要服务器使用相同的id发送响应。请给我举个例子好吗?似乎如果委托方法“didRead”中有一个打开的“readData”,它将继续工作,直到到达一些要读取的数据
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
    }