WebSocket 不会连接到 127.0.0.1 / localhost 以外的任何东西

Posted

技术标签:

【中文标题】WebSocket 不会连接到 127.0.0.1 / localhost 以外的任何东西【英文标题】:WebSocket won't connect to anything other than 127.0.0.1 / localhost 【发布时间】:2011-06-21 14:10:15 【问题描述】:

我有一个由 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 服务器每 100 毫秒发送一次样本数据。总而言之,这是一个非常简单的演示。 我在 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 网地址 (10.122.0.159:5959) 时,我得到了相同的结果 - HTML 加载但 WebSocket 没有连接。

关于为什么会发生这种情况的任何想法? CORS 是否要求 WS 使用与发起 HTTP 请求相同的端口?如果是这样,127.0.0.1 的规则是否有特殊例外?

非常感谢, -戴夫

更新 这似乎是由代理服务器阻止 ws:// 请求引起的。我们公司使用代理服务器进行内容过滤和所有常用的东西,我们的浏览器配置为使用它。Chrome 使用 IE 的代理设置,而 IE 的默认设置是 localhost 使用代理服务器。当我选中该框以使本地连接也使用代理服务器时,我对 localhost 的 ws:// 请求被阻止。相反,当我取消选中“使用代理服务器”框时,我的服务器 确实 接收 WS 请求。与远程机器类似,如果我关闭远程机器上的代理,我的服务器执行 rx ws:// 请求。 所以这是一个代理,而不是 CORS 或套接字,现在我要和我们的 IT 人员一起探索代理设置。

【问题讨论】:

“要求我们的 IT 人员做出改变”在什么样的世界里会奏效? 【参考方案1】:

除了握手中的 CORS 安全性之外,WebSocket 对跨域没有限制。

听起来您的 WebSocket 服务器出了点问题,它只在 localhost 上侦听连接。我会在 Nugget (WebSocketServer.cs) 中的 OnClientConnect 例程中添加一些调试输出,这样您就可以看到套接字连接何时发生。如果你真的认为这不是服务器的问题,那么我建议使用wireshark 并将本地连接与远程连接进行比较。

另外,如果您在 IE 9 中使用 SilverLight WebSocket 原型 (README),则您只能使用端口 4502-4534 进行 WebSocket 连接。对于 localhost 来说,这个限制可能会被解除。

【讨论】:

【参考方案2】:

它是/确实是代理的东西。 我没有要求我们的 IT 人员进行更改(祝你好运,嗯?)我只是关闭了 10.122.0.159 的代理([Howto for IE/Chrome][1])。我曾短暂尝试过为 ws:// 协议关闭它,但无法让它工作,所以现在只需打开那个 IP 地址就可以了。

【讨论】:

那么现在你能确认安装在不同机器上的网络浏览器可以连接在一起而不需要通过网络服务器吗? 你不能这样做。因为 WS 协议是从 HTTP 升级而来的,所以您必须从 HTTP 请求开始,因此您必须有一个网络服务器来处理该 HTTP 请求。所以它只适用于浏览器到服务器。如果你想要浏览器到浏览器,你必须有一个 httpserver 作为中介。

以上是关于WebSocket 不会连接到 127.0.0.1 / localhost 以外的任何东西的主要内容,如果未能解决你的问题,请参考以下文章

iOS WebSocket 未使用 SocketRocket 连接到服务器

连接到 Websocket 代理时 Google Chrome 出现错误

Celery sqs 尝试连接到 amqp:无法连接到 amqp://guest:**@127.0.0.1:5672//

Redis 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED 127.0.0.1:6379

芹菜不起作用:无法连接到 amqp://guest:**@127.0.0.1:5672//

Appium:连接到127.0.0.1:4723 [/127.0.0.1]失败:连接被拒绝:连接