Ошибка транспортного опроса с помощью Socket.Io

Я получаю транспортную ошибку при использовании socket.io v1.3.2. Это просто испытание для socket.io, поэтому я могу ознакомиться с ним.

У меня есть файл app.js (взятый непосредственно из socket.io docs):

var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(3000);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
});

И файл index.html:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
</head>
<body>
    <h1>Socket Test</h1>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost');
        socket.on('news', function (data) {
            console.log(data);
        });
    </script>

</body>
</html>

В консоли появляется следующая ошибка:

GET http://localhost/socket.io/?EIO=3&transport=polling&t=1422782880286-40 
(index):1 XMLHttpRequest cannot load http://localhost/socket.io/?EIO=3&transport=polling&t=1422782880286-40. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 404.
socket.io.js:3715 engine.io-client:socket socket error {"type":"TransportError","description":0} +37ms
socket.io.js:1402 socket.io-client:manager connect_error +38ms
socket.io.js:1402 socket.io-client:manager reconnect attempt error +1ms
socket.io.js:1402 socket.io-client:manager will wait 5000ms before reconnect attempt +0ms
socket.io.js:3715 engine.io-client:socket socket close with reason: "transport error" +2ms
socket.io.js:3715 engine.io-client:polling transport not open - deferring close +1ms
socket.io.js:1402 socket.io-client:manager attempting reconnect +5s
socket.io.js:1402 socket.io-client:manager readyState closed +0ms
socket.io.js:1402 socket.io-client:manager opening http://localhost +0ms
socket.io.js:3715 engine.io-client:socket creating transport "polling" +5s
socket.io.js:3715 engine.io-client:polling polling +0ms
socket.io.js:3715 engine.io-client:polling-xhr xhr poll +0ms
socket.io.js:3715 engine.io-client:polling-xhr xhr open GET: http://localhost/socket.io/?EIO=3&transport=polling&t=1422782885332-41 +1ms
socket.io.js:3715 engine.io-client:polling-xhr xhr data null +0ms
socket.io.js:3715 engine.io-client:socket setting transport polling +1ms
socket.io.js:1402 socket.io-client:manager connect attempt will timeout after 20000 +3ms

Кто-нибудь знает, как исправить эту ошибку. Я нашел эту дискуссию, но не смог решить проблему.

Ответ 1

Разница между вашим кодом и образцом на сайте socket.io заключается в том, что пример кода socket.io прослушивается на порту 80 и подключается к WebSocket на порту 80. Вы слушаете порт 3000, но пытаетесь подключиться к порту 80, поэтому соединение не работает. io.connect('http://localhost'); не указывает номер порта, поэтому он будет использовать порт http по умолчанию, который является портом 80. Но ваш сервер веб-сервера не прослушивает порт 80, поэтому соединение терпит неудачу.

Самый простой способ исправить это - изменить строку кода на клиенте из этого:

var socket = io.connect('http://localhost');

:

var socket = io.connect();

Если вы не укажете URL-адрес, он по умолчанию будет использовать домен и порт с текущей веб-страницы (что вам нужно).

Ответ 2

по умолчанию, localhost-порт - 80. вы подключили клиентский сокет к localhost без объявления порта. поэтому он предоставил вам порт 80 по умолчанию, и ваш сервер node прослушивает порт 3000. Чтобы клиент мог подключиться к вашему серверу, вы должны объявить порт, который слушает сервер. Пример: var socket = io.connect('http://localhost:3000');