socket.io 不断尝试在错误的地址上使用轮询
Posted
技术标签:
【中文标题】socket.io 不断尝试在错误的地址上使用轮询【英文标题】:socket.io keeps constantly trying to use polling on wrong address 【发布时间】:2016-04-14 17:31:33 【问题描述】:嘿,我正在尝试将 socket.io 与跨域一起使用。例如,假设域是:https://client.domain.com 和 https://server.domain.com。我的客户端代码如下所示:
socket = io.connect("https://server.domain.com");
socket.on("connect", function ()
console.log("socketio Connected to server!");
);
socket.emit("test", "test":"test");
和服务器端:
var fs = require('fs');
var https = require('https');
var express = require('express');
var socketIO = require('socket.io');
var app = express();
// Settings
var serverOptions =
key: fs.readFileSync('privkey1.pem'),
cert: fs.readFileSync('cert1.pem')
;
var serverPort = 443;
// Logic
var server = https.createServer(serverOptions, app);
var io = socketIO(server);
io.on('connection', function(socket)
socket.on("test", function(data)
console.log(data);
);
);
server.listen(serverPort, function()
console.log('server up and running at %s port', serverPort);
);
一切正常,消息来回发送。但是一些原因 socket.io 一直在尝试使用轮询和错误的域。几乎每一秒我都会看到这些请求:
Request URL:https://client.domain.com/socket.io/?EIO=3&transport=polling&t=1452418594321-145
Request Method:GET
Status Code:302 OK
为什么 socket.io 会这样做,我该如何关闭它?
编辑:更有趣的是,如果我注释掉所有与 socket.io 相关的代码并且只保留在 <script src="https://server.domain.com/socket.io/socket.io.js"></script>
中,它仍然会继续发出前面描述的这些 HTTP 请求。
EDIT2:不确定这是否会产生任何影响,但实际上这些域不是一个域的子域。他们是https://clientdomain.com
和https://serverdomain.com
。
【问题讨论】:
您的 html 是从client.domain.com
提供的,对吧?
无法复制。在我第一次打电话给io.connect
....之前,我也没有看到任何请求。
尝试运行带有调试信息的服务器DEBUG=socket.io* node myapp
@cviejo,是的,html 是从 client.domain.com 提供的。
@AlexeyB。我不明白这对我有什么帮助。我知道服务器和客户端之间的连接已经建立并且可以正常工作。
【参考方案1】:
如果您使用的是nginx
,我认为您的问题来自您的配置方式。如socket.io docs 中所述,您绝对需要在location
块中添加以下内容
确保您正确设置了这些标题:
location /
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
...
Socket.IO 可以很好地处理 CORS,所以我怀疑问题出在此处。
【讨论】:
【参考方案2】:您看到的请求是因为您正在为来自https://client.domain.com 的客户端提供服务。
Request URL:https://client.domain.com/socket.io/?EIO=3&transport=polling&t=1452418594321-145
只是客户端获取 socket.io 的文件,以便它可以使用 io 对象。这与与https://server.domain.com 的连接无关,因为它是从https://client.domain.com 提供的socket.io 文件的请求。
您的代码正在使用它通过 https//server.domain.com 从https://client.domain.com 收到的 socket.io 源文件将客户端连接到 https://server.domain.com。一旦从服务器接收到文件,它们就会通过与https://client.domain.com 的连接提供给客户端。
本质上,请求只是代码的一种说法,即它从客户端域请求 socket.io 文件,该文件源自服务器域,但通过客户端域发送到实际客户端(而不是客户端域) .
【讨论】:
这并不能完全回答问题。 “几乎每一秒我都会看到这些请求:”为什么几乎每一秒?以上是关于socket.io 不断尝试在错误的地址上使用轮询的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不断收到 Socket.io 轮询请求的 404 错误?