Подтвердить что ты не робот

Socket.io - событие "connect" не срабатывает на клиенте

Я пытаюсь начать работу с node.js и socket.io.
У меня очень простое (очень) простое клиент-серверное тестовое приложение, и я не могу заставить его работать.
Система настроена на машине Windows с сервером apache.
Apache работает на port 81, а socket.io настроен на прослушивание port 8001

Сервер - server.js

var io = require('socket.io').listen(8001);

io.sockets.on('connection', function (socket) {
    console.log('\ngot a new connection from: ' + socket.id + '\n');
});

Клиент - index.html

<!DOCTYPE html>
<html>
<head>
    <title>node-tests</title>
    <script type="text/javascript" src="http://localhost:8001/socket.io/socket.io.js">    </script>
    <script type="text/javascript">
        var socket = io.connect('http://localhost', { port: 8001 });

        socket.on('connect', function () {
            alert('connect');
        });

        socket.on('error', function (data) {
            console.log(data || 'error');
        });

        socket.on('connect_failed', function (data) {
            console.log(data || 'connect_failed');
        });
    </script>
</head>
<body>

</body>
</html>

После запуска моего сервера с помощью node server.js стандартный (ожидаемый) вывод записывается на консоль сервера:

info: socket.io started

Когда я открываю index.html в браузере (хром в моем случае - не тестировался в других браузерах), на консоль сервера записывается следующий журнал:

info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 9952353481638352052
debug: setting request GET /socket.io/1/websocket/9952353481638352052
debug: set heartbeat interval for client 9952353481638352052
debug: client authorized for

got a new connection from: 9952353481638352052

debug: setting request GET /socket.io/1/xhr-polling/9952353481638352052?t=1333635235315
debug: setting poll timeout
debug: discarding transport
debug: cleared heartbeat interval for client 9952353481638352052
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635238316&i=0
debug: setting poll timeout
debug: discarding transport
debug: clearing poll timeout
debug: clearing poll timeout
debug: jsonppolling writing io.j[0]("8::");
debug: set close timeout for client 9952353481638352052
debug: jsonppolling closed due to exceeded duration
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635258339&i=0
...
...
...

В консоли браузера я получаю:

connect_failed

Итак, похоже, что клиент достигает сервера и пытается подключиться, а сервер авторизует рукопожатие, но событие connect никогда не запускается на клиенте, вместо этого метод подключения достигает своих connect timeout и max reconnection attempts и возвращает возвращаемое значение connect_failed.

Любая помощь\понимание этого будет полезной.

Спасибо

4b9b3361

Ответ 1

//Client side
<script src="http://yourdomain.com:8001/socket.io/socket.io.js"></script>
var socket = io.connect('http://yourdomain.com:8001');

//Server side
var io = require('socket.io').listen(8001);
io.sockets.on('connection',function(socket) {
`console.log('a user connected');`
});

Клиентская сторона: Клиентский код запрашивает клиентскую версию сокета IO из того же файла, который дает серверную socketIO. Var теперь будет иметь все методы, доступные с socketIO, такие как socket.emit или socket.on

Сторона сервера: так же как и на стороне клиента, что делает методы socketIO доступными для использования в var io.

Ответ 2

Изменение интерфейса (клиента):

var socket = io.connect(http://myapp.herokuapp.com);

to

var socket = io.connect();

После многих часов работы с различными клиентами (Chrome, браузерами Firefox и приложением Phonegap), которые не регистрировали соединение с сервером должным образом (т.е. , сервер успешно зарегистрировал соединение с веб-сервером в своих журналах, но внешний интерфейс не зарегистрировать событие подключения), я испробовал решение @Timothy из комментариев, и теперь все снова работает на heroku и на localhost.

Ответ 3

Попробуйте следующее:

Изменить

var socket = io.connect('http://localhost', { port: 8001 });

to

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

Ответ 4

// server
var server = http.createServer(app).listen(8001);

// client
var socket = io.connect();

Ответ 5

Попробуйте использовать это:

Server.js

var http = require("http").createServer(), io = require("socket.io").listen(http);

http.listen(8001);

io.sockets.on("connection", function(socket){
    console.log("Connected!");
    socket.emit("foo", "Now, we are connected");
});

index.html

<script src="http://localhost:8001/socket.io/socket.io.js"></script>
<script>
     var i = io.connect("http://localhost:5001");
     i.on("foo", function(bar){
         console.log(bar);
     })
</script>