我有一个 socket.io 服务器,仅使用在端口 5000 上运行的 'xhr-polling' 传输,其 nginx 配置为将以 '/api' 开头的请求传递到该端口。
在我的客户端中,在连接时,我将 socket.io 资源指定为“api/socket.io”,这似乎可以正确地将初始连接请求转发到服务器并触发连接事件。但是,使用从服务器发送的响应socket.emit
不会到达客户端。
如果我将客户端直接连接到端口 5000,去掉“资源”选项,绕过 nginx 转发,一切似乎都正常。
服务器:
var io = require('socket.io').listen(5000, {transports: ['xhr-polling']});
io.sockets.on('connection', function (socket) {
console.log('Connection spotted!');
socket.emit('connected', 'hi');
});
客户(不工作):
var socket = io.connect(window.location.hostname, {resource:'api/socket.io'});
socket.on('connected', function(data) {
alert('Connected!!!');
});
客户(工作):
var socket = io.connect(window.location.hostname, {port: 5000});
socket.on('connected', function(data) {
alert('Connected!!!');
});
nginx:
location / {
proxy_pass http://localhost:5000/;
}
在这两种情况下,我都会看到“发现连接!” 在服务器上记录消息,但客户端在直接连接到端口时会获取数据和警报。