如何保持HTTP长轮询连接打开?

时间:2017-03-23 09:02:48

标签: c++ network-programming long-polling

我想在Web服务中实现长轮询。我可以在客户端设置足够长的超时时间。 我是否可以提示中间网络组件以保持响应 打开?我的意思是NAT,病毒扫描程序,反向代理或可能位于客户端之间的SSH隧道而服务器和我不在我的掌控之中。

下载可能持续数小时,但空闲连接可能在不到一分钟内终止。这是我想要防止的。我是否可以通知中间网络空闲连接是我想要的,而不是因为服务器已断开连接?

如果是这样,怎么样?我现在已经搜索了大约四个小时,但我没有找到相关信息。

  • 我应该发送200 OK,也许是一些标题,然后什么都没有?
  • 我是否必须回复102 Processing而不是200 OK,那么一切都很好吗?
  • 我应该偶尔发送0x16(同步空闲)字节吗?如果是这样,在初始HTTP状态代码之前或之后,在标题之前或之后?他们是否已将其转移到已传输的文件中,并可能会破坏它?

Web服务/服务器使用Boost使用C ++,返回的内容文件采用Turtle语法。

1 个答案:

答案 0 :(得分:1)

您不能强制代理延长其空闲超时,至少在没有管理员权限的情况下也是如此。

好消息是,您可以设计长轮询解决方案,使其能够从突然关闭的连接中恢复。

其中一种设计如下:

  1. 由于长轮询通常用于事件通知(请考虑观察者模式),因此您将序列号与每个事件相关联。
  2. 客户端发出一个GET请求,其中包含它看到的最后一个事件的序列号,作为URL的一部分或在cookie中。
  3. 服务器维护最近事件的缓冲区。在收到来自客户端的GET请求后,它会根据客户端提供的序列号和序列号检查是否需要将任何缓冲事件发送到客户端。如果是,则所有此类事件都在一个HTTP响应中发送。如果有一个代理想要在进一步转发之前缓冲整个响应,那么响应就会在那时结束。
  4. 如果客户端是最新的,即它没有错过任何缓冲的事件,则服务器会延迟其响应,直到生成另一个事件。发生这种情况时,它会作为一个完整的HTTP响应发送。
  5. 当客户端收到响应时,会立即发送一个新响应。当它检测到连接已关闭时,它会创建一个新连接并发出新请求。
  6. 当使用cookie传达客户端看到的最后一个事件的序列号时,客户端实现变得非常简单。基本上你只需在客户端启用cookie即可。