2

我试图了解网络套接字是如何工作的。我确实有基本的了解,与 Web 套接字中的 AJAX 不同,连接始终是打开的,这对于实时应用程序很方便。

这是使用袜子的非常基本的示例:

   var sock = new SockJS('http://mydomain.com/my_prefix');

   sock.onopen = function() {
       console.log('open');
   };

   sock.send("request to send (JSON)");

   sock.onmessage = function(e) {
       console.log('message', e.data);
   };

   sock.onclose = function() {
       console.log('close');
   };

要求:我有多个小部件来显示实时数据,所以我希望每个小部件都订阅 JSON 请求/服务,保持连接打开并在需要时取消订阅。

问题:在这种情况下,我们如何处理多个请求,就像我们使用典型的 AJAX 设置一样?

如果有人可以指导我正确的方向,给我一个例子或教程链接,我将不胜感激。

任何人?

4

1 回答 1

3

问题是,使用 HTTP 当您发送多个请求时,例如reqA, reqBreqC那么服务器必须以相同的顺序响应这些请求resA, resBresC这是在假设打开的情况下keep-alive,请参阅规范)。然后浏览器知道哪个响应是对哪个请求。

但是使用 WebSockets,您必须手动编写此代码。还有其他选择。例如,一个有趣的想法是使用事件系统。服务器将接受表单中的 JSON 数据

{
  "event": "test",
  "data": ["foo"]
}

它将以相同的形式向客户端发送数据。在这种情况下,您可以执行以下操作:

var EventManager = // some code here;
sock.onmessage = function(e) {
  var msg = JSON.parse(e.data);
  EventManager.trigger(msg.event, msg.data);
};

你可以通过简单地注册事件

EventManager.on("test", function(data) {
  // handle "test" event here
});

当然,你必须实施EventManager. 为此,您可以使用现有的实现之一,例如Backbone.js ,或者您可以自己实现它,如下所示:

在我自己的对象中实现事件

于 2013-05-20T10:31:19.233 回答