无法连接到套接字服务器

时间:2020-06-17 22:34:37

标签: socket.io

我对很多这类东西还很陌生,并且正在设法弄清楚。

我在<my.domain.com>有一个托管域。我在此地址托管了一个游戏,用户可以访问该地址,然后该游戏就会在浏览器中加载。

在同一台服务器上,我正在运行Express nodejs(我们称为HTTP SERVER)服务器来接收HTTP请求。

我还在同一台服务器上使用Socket.io(我们称为SOCKET SERVER)库运行套接字服务器。

HTTP SERVER可以通过SOCKET SERVER连接到localhost:<port>,并且可以来回通信。我可以将请求从移动设备发送到HTTP SERVER,后者将这些请求转发到SOCKET SERVER,并在移动设备上获得响应。

我现在的问题是我需要从托管游戏SOCKET SERVER<my.domain.com>建立另一个连接。但是,当我尝试从localhost:<port>连接到HTTP SERVER时,出现ERR_CONNECTION_REFUSED错误。我假设这与主机名不同有关。我尝试添加

app.use(function(req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
});

但这似乎无济于事。我不太确定该从哪里去。

套接字服务器app.js

const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
});

server.listen(8082);

io.on('connection', (socket) => {
    console.log(`Socket server 'connection' event`);
});

HTTP SERVER中的代码可以正确连接和发送/接收消息

var socket = require('socket.io-client')('http://localhost:8082');

socket.on('connect', () => {
    console.log(`HTTP server - 'connect' event to socket server`);
});

这是一个JavaScript文件,游戏将其作为加载项加载。挂钩由游戏作为EventEmitter提供。我无法直接访问游戏显示的HTML页面,尽管可以通过此javascript附加文件进行操作。

let socket;

// a game hook when it's initialized
Hooks.on("init", function() {
        // don't have direct access to game pages, so create a script tag and load
        // the socket.io client library
        const scriptRef = document.createElement('script');
        scriptRef.setAttribute('type', 'text/javascript');
        scriptRef.setAttribute('onload', 'window.socketLibraryLoaded()');
        scriptRef.setAttribute('src', 'https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js');
        document.getElementsByTagName('head')[0].appendChild(scriptRef);
});

// handler for when library is loaded
window.socketLibraryLoaded = () => {
        log('Socket library loaded');

        // i assume this address is wrong since the host of the game is <my.domain.com> and it's trying to connect to localhost
        socket = io('https://localhost:8082');
        socket.on('connect', () => {
                log('Connected to socket server');
        });
        socket.on('connect_error', error => {
                log(error);
        });
}

1 个答案:

答案 0 :(得分:0)

因此,在将我的头撞在墙上超过10个小时之后,我终于找到了问题。当然还有一个简单的用户错误。

CORs错误并不是真正的问题。我收到该错误是因为NGINX代理发生错误,导致正确的标头无法发送回,因此浏览器显示了该错误。

问题在于,在我的NGINX配置中的某个地方,我使用的是127.0.0.0而不是127.0.0.1