socket.io不断尝试在错误的地址上使用轮询



嗨,我正在尝试使用跨域的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);
});

一切正常,信息来回发送。但一些reasone 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为什么要这么做?我该如何关闭它?

EDIT:更有趣的是,如果我注释掉所有与socket.io有关的代码,只保留在<script src="https://server.domain.com/socket.io/socket.io.js"></script>中,它仍然会发出前面描述的HTTP请求。

编辑2:不确定这是否会有任何不同,但实际上域不是一个域的子域。它们分别是CCD_ 2和CCD_。

如果你使用的是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,所以我怀疑这个问题是否依赖于此。

您看到的请求是因为您从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因为它是从提供服务的socket.io文件的请求https://client.domain.com.

您的代码正在将客户端连接到https://server.domain.com使用从中接收的socket.io源文件https://client.domain.com通过https://server.domain.com。一旦从服务器接收到文件,它们就会通过连接到https://client.domain.com.

从本质上讲,请求只是代码从客户端域请求socket.io文件的方式,该文件源自服务器域,但通过客户端域发送到实际客户端(而不是客户端域)。

相关内容

  • 没有找到相关文章

最新更新