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.comhttps://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 错误?

连接错误:io.socket.engineio.client.EngineIOException:xhr 轮询错误

接收错误:xhr 轮询错误 socket.io 客户端反应

Node中不断轮询MongoDB的效率

Laravel 中的 Socket.io 轮询 404

Socket-IO 使用轮询而不是 Websocket