服务器向Web客户端发送消息的最佳方法是什么?

3

也希望提供相关文章链接--我不知道该搜索什么术语。

我想了解一下Web应用程序如何实现服务器到客户端通信。我知道Web并不是为此设计的,这一直是一个障碍,我想知道它的现状以及最佳实践是什么。

另一种方法是通过Ajax进行常规或偶发轮询,但Web服务器是否能够维护与Web客户端的有状态连接呢?

编辑:另一个问题是StackOverflow是如何告诉页面有新帖子可用于显示顶部的小栏的?


你能否提供更多关于你正在尝试做什么的信息呢?我知道这是一个有效的“一般性”问题,但如果有具体情况的话,会有助于指导回答。例如,你是在写一个类似 Stack Overflow 的竞争网站吗?还是一个即时通讯客户端? - Simon_Weaver
不,它不是SO的竞争对手。基本上,我正在尝试在Web上实现一种“数据绑定”功能,跨多个连接,或者至少正在调查其可能性。 - devios1
4个回答

5

StackOverflow会轮询服务器以检查是否有更多的数据。

您要寻找的是Comet技术。


啊对,这让我想起了一个问题——那就是长时间运行的请求。这个问题会导致页面看上去一直在加载,个人来说,我觉得这很糟糕。 - devios1

1

要从浏览器获得真正的双向通信,您需要使用像Silverlight、Flash等插件技术。这些插件可以创建TCP连接,可以与服务器套接字建立双向持久连接。请注意,您无法真正与HTTP服务器建立TCP连接,因此您需要创建一个额外的服务器代理来进行与浏览器的通信。

基本上,这是与AJAX网站(如Stackoverflow、Gmail等)使用的完全不同的部署模型。它们都依赖于浏览器定期轮询服务器。


有趣的概念!你认为是否可能编写一个隐形的Flash组件,建立一个TCP连接,并根据服务器发送的消息,导致页面的某些部分更新? - devios1
是的,尽管Flash插件必须已经安装。就Silverlight而言,我更加了解它,你可以做你所描述的事情,因为它有很好的钩子返回到托管页面的HTML。Silverlight也可以使用C#,而Flash则是ActionScript(呕)。 - sipsorcery
是的,从开发角度来看,Silverlight肯定是更有吸引力的选择,但我在考虑采用率。 - devios1

0

网页浏览器并不适合处理这种类型的通信。通信是单向的,其中Web服务器在端口(通常为80或443)上侦听要发送到它的信息。

我刚刚阅读了有关彗星的链接,这是一种有趣的方法,但必须记住的是,它仍然是由客户端打开的。服务器正在发送代码以供其执行,但浏览器最终控制并确定服务器何时与其通信。

使用今天的Web浏览器,服务器在没有浏览器帮助的情况下无法从技术上执行发送给它的消息。从技术上讲,您可能可以通过在客户端计算机上执行某些Active X控件来解决这个问题...但我还没有尝试过。


0

你不能这样做,HTTP是无状态的。很久以前Netscape实现了HTTP Push,但它并不成功。

我会使用轮询与Web服务或类似的方式;没有插件(如Flash、Java、Silverlight)有权限在其沙盒中使用原始套接字,因此试图以这种方式实现将是浪费时间。


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