我有一个由HTML5 / WebSocket客户端和HTTP / WS服务器组成的测试应用程序。两台服务器都在C#中; HTTP服务器是我自己的简单事物,WS服务器也是基于http://nugget.codeplex.com/的概念的自制程序。 HTTP服务器在0.0.0.0:5959上侦听,WS服务在0.0.0.0:5960上侦听(接受来自任何客户端的连接,但在不同的端口上)。
我的index.html包含一些JavaScript,它将WebSocket打开到'ws://'+document.location.hostname+':5960/'
(即,与网页所在的IP地址相同,但在端口5960上)。 WS服务器每100ms发送一次样本数据。总而言之,这是一个非常简单的演示。
我在Windows7上使用Chrome 12.0。
我发现HTTP服务器可以从任何客户端运行,我的机器上的浏览器指向127.0.0.1:5959或localhost:5959,它可以在任何机器(我的或远程机器......)时工作。远程“在我的办公桌上是一台不同的PC :)命中我的服务器机器的工作内部10网地址10.122.0.159:5959。在HTTP土地上,一切都按预期工作。
但是,WebSocket仅适用于127.0.0.1和localhost;远程计算机可以从10.122.0.159:5959成功获取HTML,但WebSocket不会连接到10.122.0.159:5960。事实上,当我将本地浏览器指向它自己的10-net地址(10.122.0.159:5959)时,我得到相同的结果 - HTML加载但WebSocket无法连接。
关于为什么会发生这种情况的任何想法? CORS是否要求WS使用与HTTP请求相同的端口?如果是这样,127.0.0.1的规则是否有特殊例外?
非常感谢,
-Dave
更新
它似乎是由代理服务器阻止ws://请求引起的。我们公司使用代理服务器进行内容过滤和所有常见的东西,我们的浏览器配置为使用它。
Chrome使用IE的代理设置,IE的默认设置是localhost到不使用代理服务器。当我选中该框以使本地连接也使用代理服务器时,我的ws://对localhost的请求被阻止。相反,当我取消选中“使用代理服务器”框时,我的服务器执行 rx WS请求。与远程计算机类似,如果我关闭远程计算机上的代理,我的服务器执行 rx ws://请求。
所以它是一个代理的东西,而不是CORS或套接字的东西,现在我和我们的IT人员探讨代理设置。
答案 0 :(得分:2)
除了握手中的CORS安全性所控制的内容之外,交叉起源没有WebSocket限制。
听起来你的WebSocket服务器出了问题,它只是在localhost上监听连接。我会在Nugget(WebSocketServer.cs)中向OnClientConnect例程添加一些调试输出,以便您可以看到套接字连接何时发生。如果你真的认为这不是服务器的问题,那么我建议使用wireshark并将localhost连接与远程连接进行比较。
此外,如果您在IE 9中使用SilverLight WebSocket原型(README),那么您将被限制为用于WebSocket连接的端口4502-4534。对于localhost来说,这个限制可能会解除。
答案 1 :(得分:1)
这确实是代理人的事
而不是要求我们的IT人员进行更改(祝你好运,嗯?)我只是关闭代理10.122.0.159([Howto for IE / Chrome] [1])。我简单地尝试将其关闭为ws://协议,但无法使其工作,所以现在只需打开一个IP地址即可。