首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用HTTP Keep-Alive让服务器与客户端通信

使用HTTP Keep-Alive让服务器与客户端通信
EN

Stack Overflow用户
提问于 2009-01-04 18:41:38
回答 3查看 13.7K关注 0票数 16

最近,在一次面试中,我被问到如何处理在线聊天客户端应用程序。我通过了标准的“轮询”解决方案,但被切断了,因为面试官正在寻找"HTTP 1.1 keep-alive“方法。我已经使用HTTP很长一段时间了,并且记住整个要点是“无状态”的,我从来没有想到过这一点(而且,更不用说keep-alive并没有始终如一地实现)。

我的问题是,当设置了"keep-alive“头时,web服务器是否有可能向客户端广播和/或发送信息?

EN

回答 3

Stack Overflow用户

发布于 2009-01-04 18:55:07

对于HTTP 1.1,keep-alive是默认行为。(在HTTP 1.0中,默认行为是关闭连接。)服务器必须发送“connection : close”报头,以便在第一次响应时终止连接。因此,仍然有TCP套接字可用于推送数据,但仅从服务器推送数据在很大程度上违反了HTTP协议。即使使用keep-alive,客户端仍必须轮询服务器。

区分HTTP Keepalive和TCP Keepalive非常重要。HTTP keepalive可防止服务器或客户端关闭连接。当连接可能在较长时间内处于空闲状态并且可能被NAT代理或防火墙丢弃时,将使用TCP保持连接。通过setsockopt()调用以套接字为单位激活TCP keepalive。

在执行“长轮询”以消除重新轮询的需要时,可能需要TCP keepalive。

票数 9
EN

Stack Overflow用户

发布于 2009-01-04 19:25:07

Keep-alive只是将TCP套接字保持为打开状态,因此每次轮询时,都可以节省TCP setup/teardown数据包的开销--但仍然需要轮询。

但是,“长轮询”是web服务器向客户端广播通知的一种策略。本质上,客户端发出GET请求,但web服务器不是立即响应,而是等待,直到它们有通知要发送,在这一点上,它们响应GET请求。这样就不需要数据包通过线路进行轮询,并使连接保持无状态,正如您正确地提到的,这是协议的目的之一。

票数 8
EN

Stack Overflow用户

发布于 2009-01-04 19:19:46

您可能会阅读有关Comet服务器的更多信息。这听起来基本上就是面试官所问的方法。他们的有效性受到一些人的质疑,但它已经在几个类似的情况下使用。

例如,我相信gmail在某些事情上使用了comet技术(但不要引用我的话)。

另一个相关的例子是BOSH,它是使用HTTP和XMPP传输聊天信息的协议。但我不认为使用keep-alive会涉及到这一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/411460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档