多个Websockets

20

我正在尝试在一个页面上使用两个WebSocket。这是我的代码:

var pageViewWs = new WebSocket("ws://localhost:9002/pageView");
var sessionWs = new WebSocket("ws://localhost:9002/session");

pageViewWs.onmessage = function (event) {
  alert("PageView");
};

sessionWs.onmessage = function (event) {
  alert("Session"); 
};

只有PageView警告出现。在服务器端,没有发出对/session的请求,只有对/pageView的请求。

现在,如果我交换var pageViewWs和var sessionWs,则会显示Session警告而不是PageView。这不是因为它们是警报,我尝试将它们附加到body和div中,并使用Firebug逐步进行了调试。似乎一次只能创建一个WebSocket,尽管在Firebug中,pageViewWs和sessionWs的属性看起来相同,除了它们的url之外。

我只在Firefox 15.0.1中进行了测试。是否存在某种WebSocket限制,使您只能同时运行一个WebSocket?还是我的代码有问题?


2
http://jsfiddle.net/DuQx9/1 对你有效吗? - apsillers
apsillers,是的,这对我有效。 - Arthur
你的JS可能存在客户端bug,但也可能是服务器端bug或配置问题。你使用的是什么语言/服务器? - apsillers
3个回答

3

我曾经也遇到过在同一端口上运行多个服务的问题。因此,我创建了一个PHP库来解决这个问题。

为什么要使用Francium DiffSocket?

一些免费的托管提供商的计划不允许您绑定端口或仅允许您绑定一个端口。 在OpenShift Cloud Server的情况下,您只能绑定到端口8080。因此,无法同时运行多个WebSocket服务。在这种情况下,Francium DiffSocket是有用的。

您可以使用名为Francium DiffSocketPHP库在同一端口上运行不同的服务。

设置好Francium DiffSocket后,您可以使用不同的服务进行以下操作:

var chatWS = new WebSocket("ws://ws.example.com:8000/?service=chat");
var gameWS = new WebSocket("ws://ws.example.com:8000/?service=game");

一个例子是这些服务通过单个端口运行:


@vulkan,我停掉了演示服务器,因为免费层级已经到期了。但是库仍然可以使用。 - Subin
演示可以运行,但是当我使用composer添加时就无法工作。 - vciloglu

2
除了HTTP请求头之外,这两个请求是相同的。它们在相同的端口上击中相同的应用程序服务器。服务器端应用程序根据发起连接的HTTP请求来区别对待每个连接。

我在Node.js中完成了这个操作。您可以手动完成,但像

这样的软件包可以简化该过程。


1

我相信客户端只能创建一个WebSocket连接到主机上的特定端口。您是否尝试在不同的端口或不同的服务器上运行这两个服务?这将使您确定限制...


4
我刚刚尝试使用了两个不同的端口,而且它奏效了!非常有趣,我想知道为什么会这样。 - Arthur
9
如果我没记错的话,你正在打开一个到特定端口的连接,并将其保持打开状态,因此在同一端口上打开第二个连接是没有意义的(流量应该只通过第一个连接传输)。 - logical Chimp
2
页面上发起的任何其他向服务器的js调用,例如AJAX POST请求,也将使用该端口。它同时处理这些请求,因此我认为它可以处理多个WS。 - Arthur
9
同一端口的多个连接不应该是一个问题。请参见如何同时连接多个客户端到同一端口...?:如果我从客户端两次连接到同一个Web服务器,那么从我的角度看,这两个连接将具有不同的源端口,而从Web服务器的角度看则具有不同的目标端口。因此,即使这两个连接具有相同的源和目标IP地址,也不会存在歧义。 - apsillers
5
因此,需要强调的是:一个服务器端口上有多个WebSocket连接是完全有效的。某些浏览器可能会对此施加限制,但这从来不会是WebSocket的固有限制,因此您是否可以拥有多个连接取决于您使用的运行时/浏览器。 - Sven Slootweg

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