Socket.io не может подключиться, прибегает к "опросу"

Я пытаюсь создать приложение клиент-сервер websocket, где клиент и сервер будут работать в двух разных экземплярах.

Настройка

  • Сервер /Back -end: работает на localhost:9006 с angular -fullstack generator, включая socket.io
  • Клиент/интерфейс: работает на localhost:9007 с angular generator + socket.io-client + btford.socket-io ( мост AngularJS socket.io)

Client and server

Сервер

Примечание: не полный код, но те части, которые я считаю релевантными.

// ----- socketio.js -----

// When the user connects.. perform this
function onConnect(socket) {
    // When the client emits 'info', this listens and executes
    socket.on('info', function (data) {
        console.info('[%s] %s', socket.address, JSON.stringify(data, null, 2));
        socket.emit('pong', 'OK!');
    });
    // Insert sockets below
    require('../api/thing/thing.socket').register(socket);
}

socketio.set('origins', 'http://localhost:9007');

// ----- express.js -----

app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9007');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

// ----- app.js -----

// Start server
server.listen(config.port, config.ip, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

Client

// ----- client app.js

angular
.module('weldCommentsClientApp', [
    'ngAnimate', 'ngAria', 'ngCookies', 'ngMessages', 'ngResource', 'ngRoute', 'ngSanitize', 'ngTouch',
    'btford.socket-io'
])
.factory('mySocket', function (socketFactory) {
    var myIoSocket = window.io.connect('http://localhost:9006');
    var mySocket = socketFactory({
        ioSocket: myIoSocket
    });
    mySocket.forward('pong');
    console.log('mySocket', mySocket);
    return mySocket;
})

// ----- client main.js

angular.module('weldCommentsClientApp').controller('MainCtrl', function ($scope, mySocket) {
    $scope.$on('socket:pong', function (ev, data) {
        console.log('socket:pong', ev, data);
    });
    mySocket.emit('info');
});

Результаты

Отсутствуют ошибки консоли на сервере или клиенте, но он не работает, и сервер регистрирует 100 из этих строк:

GET /socket.io/?EIO=3&transport=polling&t=1421488528935-16027 200 2ms

... который похож на то, что клиент подключается через HTTP, но не переключается на веб-сайты.

Любые идеи?

Update

Вот весь проект клиент/сервер с инструкциями в README: https://github.com/weld-io/socket.io-client-server-boilerplate

Ответ 1

Путь неверно определен в файле server/app.js

Попробуйте использовать путь '/socket.io' следующим образом:

var socketio = require('socket.io')(server, {
  serveClient: (config.env === 'production') ? false : true,
  path: '/socket.io'
});

Далее, чтобы выбрать веб-узлы вместо длительного опроса, вы можете выбрать перенос websocket в test-client/scripts/application.js

var myIoSocket = window.io.connect('http://localhost:9006', {transports:['websocket']});

Ответ 2

Я предлагаю вам протестировать клиент-сервер соответственно. nc будет идеальной альтернативой для такого рода ситуаций.

  • запустите сервер и echo testserver | nc server_ip server_port и проверьте журнал сервера.

  • запустить клиент и netcat -l -p server_port и проверить журнал клиента.

BTW, код клиента, который вы показали, похоже, не пытается подключиться к серверу.

Ответ 3

Я думаю, потому что ваш сервер использует сокеты на http://localhost:9007 и ваш клиент на http://localhost:9006. Попробуйте поставить оба на один и тот же порт, он должен работать.

Ответ 4

Можно попробовать 2 вещи: первое изменение

window.io.connect('http://... 

to

window.io.connect('ws://...

Во-вторых, на стороне сервера установите

socketio.set('transports',['xhr-polling']);

Я знаю, что выглядит некорректно, поскольку вы хотите избежать опроса, но все же это помогло многим людям, у которых была такая же проблема.