Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Objective c AsyncSocket:如何定义读取长度并仅在达到读取长度时获取回调_Objective C_Ios_Sockets_Asyncsocket - Fatal编程技术网

Objective c AsyncSocket:如何定义读取长度并仅在达到读取长度时获取回调

Objective c AsyncSocket:如何定义读取长度并仅在达到读取长度时获取回调,objective-c,ios,sockets,asyncsocket,Objective C,Ios,Sockets,Asyncsocket,是否可以使用AsyncSocket执行以下操作: [_socket writeData:request withTimeout:commandData tag:commandTag]; 而(“响应包”未被读取)则{ 从读取流中读取至少前5个字节,并从中提取“响应包”长度大小 进一步读取,直到达到“响应数据包”标头中定义的字节读取量 如果到达读取流的末尾,但缺少一些字节,则等待另一个读取流并完成“响应包”的读取,然后 将读取的字节复制到缓冲区,并将读取的数据标记为“响应包”数据 使用该数据在so

是否可以使用AsyncSocket执行以下操作:

[_socket writeData:request withTimeout:commandData tag:commandTag];
而(“响应包”未被读取)则{

  • 从读取流中读取至少前5个字节,并从中提取“响应包”长度大小
  • 进一步读取,直到达到“响应数据包”标头中定义的字节读取量
  • 如果到达读取流的末尾,但缺少一些字节,则等待另一个读取流并完成“响应包”的读取,然后
  • 将读取的字节复制到缓冲区,并将读取的数据标记为“响应包”数据
  • 使用该数据在socket:didReadData:withTag:上回调我的委托
  • 清除缓冲区(响应包)并对下一个读取流执行相同的步骤
  • }

    以下是我目前对AsyncSocket的使用情况:

    [_socket writeData:request withTimeout:commandData tag:commandTag];
    
    我正在使用AsyncSocket通过socket编写数据:

    [_socket writeData:request withTimeout:commandData tag:commandTag];
    
    并在我的委托类中接收回调:

    onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    

    问题是,数据流中没有终止字符,区分提交“响应数据包”长度的唯一方法是读取和解析前5个字节,并将其用于将数据切割成“数据包”并回调我的代理。目前,我正在使用AsyncSocket,如上面的代码片段所示,一些回调“onSocket:didReadData:withTag:”已经是很长的数据包(接收到的NSData),但有些已经合并。IMHO我需要明确地告诉AsyncSocket如何在读取时解释并将传入的数据切割成数据包。

    找到了解决方案。您需要在AsyncSocket委托方法中调用onSocket:didWriteDataWithTag:

    - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {
    
       ...
      [sock readDataToLength:<preferred size of response packet> withTimeout:myTimeout tag:tag];
    
      //instead of
      //[sock readDataWithTimeout:myTimeout tag:tag];
    }
    
    -(void)onSocket:(AsyncSocket*)sock didWriteDataWithTag:(long)标记{
    ...
    [sock readDataToLength:withTimeout:myTimeout标记:标记];
    //而不是
    //[sock readDataWithTimeout:myTimeout标记:标记];
    }
    

    通过这种方式可以定义何时调用onSocket:didReadData:withTag:。

    找到了解决方案。您需要在AsyncSocket委托方法中调用onSocket:didWriteDataWithTag:

    - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {
    
       ...
      [sock readDataToLength:<preferred size of response packet> withTimeout:myTimeout tag:tag];
    
      //instead of
      //[sock readDataWithTimeout:myTimeout tag:tag];
    }
    
    -(void)onSocket:(AsyncSocket*)sock didWriteDataWithTag:(long)标记{
    ...
    [sock readDataToLength:withTimeout:myTimeout标记:标记];
    //而不是
    //[sock readDataWithTimeout:myTimeout标记:标记];
    }
    

    通过这种方式,您可以定义何时调用onSocket:didReadData:withTag:。

    嘿,您知道如何确定响应数据包的大小吗?或者我应该假设一下尺寸?谢谢你知道如何确定响应包的大小吗?或者我应该假设一下尺寸?谢谢