Соединение сервера / клиентского сокета Nodejs с engine.io

Я пытаюсь получить простое сокетное соединение, установленное между слушателем сокета engine.io, который прослушивает порт 8888, и клиентом javascript, который работает в простом index.html

Выглядело это довольно просто, чтобы выполнить эту задачу, но я почему-то не могу правильно подключить клиент xhr-polling. Он соединяется, так как номер клиента увеличивается, но событие onopen никогда не запускается на стороне клиента. Вместо этого число клиентов на стороне сервера просто продолжает бесконечно увеличиваться, и клиент никогда не получает никаких сообщений от сервера - и при этом сервер не получает никаких сообщений от клиента.

Все это отлично работает с транспортом websocket, но мне также нужен xhr-опрос.

app.js

var engine = require('engine.io');
var server = engine.listen(8888);

server.on('connection', function (socket) {
    console.log(server.clientsCount);
    socket.send('never received by client'); // << xhr-polling client does not receive
    socket.on('message', function (msg) {
        if ('echo' == msg) socket.send(msg);
    });
});

index.html

<html>
<head>

<script src="engine.io.js"></script>
<script>
    var socket = eio('ws://localhost:8888/'); << starts polling immediately like crazy
    socket.onopen = function(){
        console.log('never fired'); << never sent to console
        socket.onmessage = function(data){};
        socket.onclose = function(){};
    };
</script>

</head>
<body>
</body>
</html>

консоль клиента

GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 280ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 1ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 1ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 1ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 0ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 0ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 0ms engine.io.js (Zeile 1585)

1 ответ

Если ваши HTML и статические файлы (JS) являются серверами из другого домена (например, localhost:80, как port == еще один "домен").
Затем по соображениям безопасности он может запретить использование WebSockets или другого трафика по причинам CORS.

Используйте вкладку "Сеть" в Dev Tools вашего любимого браузера, чтобы проверить, что происходит, и если какие-либо запросы не выполняются, а также их заголовки.

Другие вопросы по тегам