2010-01-15 247 views
8

我必须编程网站,但我宁愿不喜欢静态HTML本质。我更喜欢更多的客户端 - 服务器体系结构。使用JavaScript的AJAX和客户端 - 服务器体系结构

现在我已经想通,与XMLHTTP,你基本上可以动态更新页面和发送针对来自服务器的信息/动作/ /请求。所以这基本上覆盖了客户区。

但要完成客户端 - 服务器架构,它是必要的服务器发送/请求信息,也没有被查询。

有什么办法,例如用于聊天服务器,而不该客户在固定的时间间隔查询发送回一个收到的消息到所有客户端(客户端使用Web浏览器)?我想实现一个可以看到,而你键入的东西英寸

+0

你说的是来自Web服务器的“Push”操作,而不是让客户端代码请求新代码,对不对? – 2010-01-15 18:52:52

+0

正确!我想发出触发客户端操作的服务器命令。 – 2010-01-16 02:02:54

回答

13

有几种不同的方法来实现这一点。其中一些已经在这里得到了答复,但我想包括几个以及我的想法。

1。轮询

经常请求服务器检查新信息。这是做这件事最糟糕的方式,但可能是最简单的方法。如果您的网站用户数量较少,则可以这样做。

这可以通过在javascript中使用setInterval(myFunction, n)XMLHttpRequests发送到服务器,每n毫秒来完成。然后,在服务器上,您可以使用新信息(当您拥有该信息时)或某种意味着没有新信息的消息来回应。

2.长轮询

当加载页面时,它向服务器对新信息的请求。服务器保持连接处于打开状态,直到有东西要发回。此方法减少了使用的网络流量,但增加了服务器上使用的资源。您可以将其用于少数用户,但不能很好地扩展。

最简单的方法是让处理AJAX请求的页面等待新信息可用,然后进行响应。这可能会在您的服务器上连接很多连接。所以,小心使用。

3 COMET

COMET基本上是长轮询,但服务器的设置是否正确吧。它知道这些连接不是“真实的”,并且使用较少的资源来处理它们。这对于这个问题是一个很好的解决方案,但它需要为此目的明确设置服务器。 COMET服务器和COMET插件用于其他流行的服务器,但它需要一些设置,有时还需要一些钱。

在.NET上实现它并不是世界上最简单的事情。您可以为解决方案付费,尝试找到别人的代码来做类似的事情,或者尝试自己编写代码。我还没有找到任何像样的免费解决方案。如果有其他人,请发表评论。

4. RIA

另一种解决方案是包含Flash,Silverlight或Java小程序在页面上。人们通常通过使用1x1对象来实现这一点,以便他们可以使用Flash或Silverlight与服务器交谈。如果你不介意添加依赖项,这是一个体面的解决方案。如果您已经了解Silverlight或Flash,那么实施起来可能会相对简单。

你可以在互联网上找到这些选项的教程。

5.网络套接字

如果您在刀刃上,你可以看看Web Sockets。它只适用于最新版本的现代浏览器。它是HTML5的一部分,但现在它可能是它自己的规范。无论如何,这意味着旧版浏览器将无法处理它。但是,如果您不介意限制自己使用最新的浏览器,则可以使用这个惊人的功能。

我相信Chromium是目前唯一支持它的浏览器。但是,在Firefox和WebKit中正在执行这些工作。

我会免去你的争议,并简单地说,这就是你想要的。规范的摘要说明了这一切。

该规范定义了一个API,使Web页面能够使用Web Sockets协议与远程主机进行双向通信。

特别表扬

如果您有兴趣节点JS的世界里,你不能去错Socket IO。它将实现浏览器可用的最佳技术。

结论

最好的办法是Socket.IO在节点JS。但是,对于ASP.Net解决方案,如果可以,请转到COMET或Web套接字。否则,使用Flash/Silverlight并不可怕。最后,投票和长时间投票应该是最后的选择。您可以始终支持其中一种,如果在客户端浏览器中不支持它,则可以回退到另一种。

+1

经过仔细考虑,我选择了非Chromium的WebSockets + WebSocket-FlashBridge。这种组合适用于所有浏览器,包括iPhone + iPad。 – 2011-07-18 18:54:51

1

当客户端用户开始输入时,客户端必须告诉服务器。你在这里有几个选择。

  1. 从服务器频繁请求最新活动。这将针对参与聊天的每个用户进行。同样的请求可能被用来发送用户特定的活动服务器,以及:“乔纳森是打字......”

  2. 长轮询。这实质上是从服务器请求信息,并且服务器保持连接处于打开状态,直到它有回送的东西。所以你的请求被最小化,但你的连接保持打开更长时间。

根据您的流量,数据类型的传输,服务器环境,以及其他许多因素,其中一个选项可以发光比另一个多。

0

基于该REST架构的HTML系统是基于,服务器角色是简单地充当客户端从拉资源。我正在推广,但有些工具可以在客户端而不是服务器端实施这种类型的操作。

您最好写/使用可定期向服务器请求更新的库。您可以将这些类型的请求封装在可引发事件的JavaScript对象中。这样你的客户端脚本就可以像从服务器收到通知一样。用COMET回顾一些常见的东西,你大概可以找到一些工具来帮助你的客户端代码。

HTML 5在这种类型的功能一些初步的尝试,但如果你想你的应用程序运行在旧的浏览器,你最好使用更稳定的方法,例如AJAX请求更新。

相关问题