Socket.io SocketIO尝试使用与用于获取网页的浏览器相同的端口进行连接

Socket.io SocketIO尝试使用与用于获取网页的浏览器相同的端口进行连接,socket.io,Socket.io,我在本地提供内容,可通过http://0.0.0.0:4000。这很好,我得到了一个正确的网页,其中包含以下脚本行: var socket = io('http://example.com'); i、 e.我正在引用外部服务器。现在,我的浏览器显示以下错误: GET http://example.com:4000/socket.io/?EIO=3&transport=polling&t=1417447089410-1 net::ERR_CONNECTION_REFUSED 也

我在本地提供内容,可通过
http://0.0.0.0:4000
。这很好,我得到了一个正确的网页,其中包含以下脚本行:

var socket = io('http://example.com');
i、 e.我正在引用外部服务器。现在,我的浏览器显示以下错误:

GET http://example.com:4000/socket.io/?EIO=3&transport=polling&t=1417447089410-1 net::ERR_CONNECTION_REFUSED
也就是说,浏览器正在尝试使用它用于获取原始页面的相同端口进行连接

当SocketIO服务器和web服务器在同一端口上侦听时,一切正常

我错过什么了吗?这是虫子吗?有解决办法吗?谢谢。

向您介绍普通webSocket最初是如何设置的。这一切都从一个标准的HTTP GET请求开始,但其中设置了一些特殊的头:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
交换还允许主机仅从某些来源的网页强制执行请求。虽然可以从非web浏览器代理伪造此头(因此服务器必须为此做好准备),但当OP使用真实浏览器时(假设没有代理修改它),此头可能是正确的

如果服务器接受传入请求,它将返回一个HTTP响应,如下所示:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
此时,曾经是HTTP套接字的套接字现在是webSocket,两个端点都同意从现在开始使用webSocket数据格式。此初始连接之后可能会进行某种形式的身份验证,或者在连接的初始HTTP部分期间,也可以在身份验证中使用新的或现有的cookie


socket.io
首先请求
/socket.io
的特定路径,并向URL添加一些参数,从而在此基础上添加了一些增强功能。这允许
socket.io
协商是使用长轮询还是webSocket,因此在初始化上述webSocket之前,客户机/服务器与
socket.io
之间存在一些交换


那么,回到你的问题上来。
socket.io
服务器只是在普通web端口上监视所有传入的web请求(并查找它的特殊路径和特殊头,以指示webSocket启动,而不是典型的HTTP请求)。因此,它运行在与web服务器相同的端口上。这样做的原因有很多,所有这些都为服务器和服务器基础设施提供了便利,因为它们不必配置网络来接受它们已经接受的普通端口80(或它们已经用于web请求的任何端口)以外的任何端口


默认情况下,在
socket.io
中,域和端口将默认为与您所在网页相同的域和端口。因此,如果您在connect调用中未指定其中一个,它将使用您所在网页中的域或端口。如果要同时使用不同的域和端口,则必须同时指定这两个域和端口。

是否尝试过
io('http://example.com:80');
socket.io
客户端首先通过一个特殊的URL与加载网页的同一端口上的完全相同的web服务器联系。如果存在webSocket支持,则会将连接移到webSocket。这是正常的
socket.io
connect过程。您的代码行:
var socket=io('http://example.com');
需要与网页的域和端口完全相同。@是的,我已经尝试过了,它可以正常工作。当我省略端口时,问题就出现了。@jfriend00虽然您解释的默认过程是有意义的-我也接受它作为答案,但我认为您的最后一句话是错误的,因为我已经能够连接到其他服务器和端口,当显式设置时。是的,安全方面取决于webSocket服务器是否想要强制执行相同的源(很多都是,但不是全部)。我在回答中添加了更多的细节。我理解并感谢你的回答,但没有我预期的那么清楚。我会这样写结束语:“默认情况下,
socket.io
库将尝试连接到同一服务器,并通过与网页中包含它的服务器相同的端口连接;如果您更改服务器,端口将保持不变,因此您也必须更改它”。谢谢大家!@克拉帕斯-我添加了一个新的最后一段。我不清楚到底是哪个问题导致了您的问题,所以我尝试更多地介绍socket.io的工作原理。