Не удается подключиться к серверу сокетов - PullRequest
0 голосов
/ 18 июня 2020

Я новичок во многих подобных вещах и пытаюсь понять это.

У меня есть размещенный домен по адресу <my.domain.com>. Я размещаю игру по этому адресу, и пользователи могут go по этому адресу, и игра загружается для них в браузере.

На том же сервере я запускаю 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', '*');
});

, но это, похоже, не помогает. Я не совсем уверен, где go отсюда.

Приложение Socket server. 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 голосов
/ 18 июня 2020

Итак, после того, как я бился головой об стену более 10 часов, я наконец нашел проблему. И, конечно же, простая ошибка пользователя.

На самом деле проблема не в CORs. Я получал эту ошибку, потому что прокси NGINX давал ошибку, из-за чего правильные заголовки не отправлялись обратно, поэтому браузер показал эту ошибку.

Проблема заключалась в том, что в одном месте моей конфигурации NGINX я использовал 127.0.0.0 вместо 127.0.0.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...