ios NSURLConnectionDataDelegate didReceiveData 回调未调用

Posted

技术标签:

【中文标题】ios NSURLConnectionDataDelegate didReceiveData 回调未调用【英文标题】:ios NSURLConnectionDataDelegate didReceiveData callback not called 【发布时间】:2013-07-04 08:59:41 【问题描述】:

我有问题。我在***上阅读了很多关于这个问题的主题,但没有任何帮助。 我正在尝试通过彗星连接实现客户端-服务器通信。我有一个负责发送消息的实例和一个负责接收消息的实例。 过程如下: - 发送实例向服务器发送 GET 请求,服务器响应接收实例。 第一次调用工作正常,我得到了第一个响应并且可以获得我需要的数据,但下一个请求不会触发我的 didReceiveData 回调。但是我看到服务器已经发送了数据,我在服务器日志中看到它,我在客户端机器的wireshark中看到它。一件有趣的事情:在我将“content-length:0”添加到响应之前,第一个响应并没有触发我的回调。 NSUrlConnection 的未记录功能?我还应该考虑什么让 NSUrlConnection 认为响应是有效的? 替代方案:强制从套接字中获取数据,但我不知道 NSUrlConnection 是否可行(人对此保持沉默)

持久连接代码:

  NSURL* requestUrl = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:rq->url.c_str()]];
  NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:requestUrl   cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:600];
  m->connection = [[NSURLConnection alloc] initWithRequest:request delegate:request_delegate() startImmediately:NO];

  [m->connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
                              forMode:NSDefaultRunLoopMode];
  [m->connection start];

【问题讨论】:

已解决:诀窍是 - 服务器需要将标头部分“内容长度”设置为较大的值,因为客户端获取数据包并增加接收到的字节数,并且在接收到标头中设置的字节数后- 不再需要任何回应。省略 content-length 部分将阻止委托调用。这就是原因。 这不是 HTTP 协议的使用方式。这是一个请求-响应协议。一个 NSURLConnection 只能用于一个请求-响应动作。你在做什么是很毛茸茸的。我不会指望你的观察。 【参考方案1】:

nginx 服务器需要将 header 部分“content-length”设置为较大的值,因为客户端获取数据包并增加接收到的字节数,并且在接收到 header 中设置的字节数后 - 它不会再有任何响应。省略 content-length 部分将阻止委托调用。这就是原因

【讨论】:

以上是关于ios NSURLConnectionDataDelegate didReceiveData 回调未调用的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别