如何使服务器与客户端进行通信

4

我对网站开发还不太熟悉,所以请原谅我的无知。

我想知道是否有一种方法可以让服务器向客户端广播消息。例如,客户端页面有一个新闻源,每当服务器有新故事时,服务器会将该信息发送给客户端,客户端更新其页面的新闻源。我不希望客户端每隔几秒钟就要轮询服务器,问“嘿,现在有新故事了吗?现在呢?现在呢?”我希望客户端能自己做自己的事情,然后被服务器的消息打断。

有没有这样的方法呢?


1
请查看WebSockets:https://developer.mozilla.org/en/WebSockets - Rob W
你可以查看“彗星编程”……我也在寻找类似于你的请求来构建一个聊天应用程序,但我没有找到更好的解决方案。 - Songo
实际上,AJAX 不会做到这一点,而是相反的。客户端将定期请求服务器获取新数据,每当服务器发送新数据时,它可以向用户显示消息。在这里,除非客户端请求数据,否则服务器不会向客户端发送数据。但是您可以使用 AJAX 构建新闻源。 - Virendra
2个回答

2
对于较新的浏览器,您可以使用 WebSockets 打开与服务器的持续连接,然后客户端/服务器可以在需要时相互发送消息。
对于旧版浏览器,通常的做法是客户端必须定期“轮询”服务器,以便在一些常规时间表上询问服务器是否有任何新消息。由于防火墙、本地安全设置、未知位置等原因,通常情况下服务器无法直接连接到客户端,因此客户端必须连接到服务器。轮询可以采用常规方式,每 60 秒轮询一次,使用 Ajax 调用询问是否有新消息,或者它可以更像是一个长轮询,其中客户端询问是否有新内容,如果有新内容,则服务器立即返回该数据。但是,如果没有新内容,服务器会保留轮询请求一段时间,等待看是否有新内容。最终,服务器将返回没有内容或者如果有新消息则返回新消息。当客户端收到响应时,它会重新开始“长轮询”序列。Comet 是“长轮询”的库形式的示例,使其更易于实现。

虽然它是一个相对较新的标准,但Websockets可能是最好的选择。AJAX也可以工作,但它们的请求有更大的开销。这取决于服务器需要多频繁地更新客户端。 - Jeffrey Sweeney
@JeffreySweeney - 我同意使用Web套接字来解决这种问题更好,但我没有看到任何IE支持它的版本,因此您必须为IE实现其他解决方案。 - jfriend00
跟进:我遇到了一些叫做“jsonp”的东西,大概理解是一个HTML标签请求某个服务器的一些脚本,并指定回调函数,然后服务器会将一些数据作为参数返回给该回调函数。那么服务器是否可以将回调函数保存下来,并在需要时不断地将其发送回客户端呢? - Robz
JSONP不是那样工作的。JSONP只是服务器响应中的一种JavaScript形式。它不允许服务器像你所要求的那样调用客户端。通常情况下,当客户端试图解决同源策略问题时使用它,并且它并没有提供任何特别独特的能力来解决这里所问的问题。 - jfriend00

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接