Подключение к серверу Socket.IO с определенным путем и пространством имен

My Node.js приложение работает по адресу http://www.example.com/myapp/.

Я настроил сервер Socket.IO(версия 1.3.5) с пользовательским пространством имен. Вот пример фрагмента кода:

var server = http.createServer(...);
var io = socketio(server);
io
    .of('/a/b/c')
    .on('connection', function (socket) {
        socket.emit('update', {msg: '/a/b/c'});
    });

Я не могу понять, как подключиться к этой службе от клиента. Мои догадки (ни один из них не работает):

io.connect('http://www.example.com/myapp/a/b/c');
io.connect('http://www.example.com', {path: '/myapp/a/b/c'});
io.connect('', {path: '/myapp/a/b/c'});
io.connect('http://www.example.com/a/b/c', {path: '/myapp'});
io.connect('http://www.example.com', {path: '/myapp/socket.io/a/b/c'});

Ответы

Ответ 1

На вашем сервере не забудьте указать путь:

var io  = require('socket.io')(http, { path: '/myapp/socket.io'});

io
.of('/my-namespace')
.on('connection', function(socket){
    console.log('a user connected with id %s', socket.id);

    socket.on('my-message', function (data) {
        io.of('my-namespace').emit('my-message', data);
        // or socket.emit(...)
        console.log('broadcasting my-message', data);
    });
});

На вашем клиенте не путайте пространство имен и путь:

var socket = io('http://www.example.com/my-namespace', { path: '/myapp/socket.io'});

Ответ 2

Я также использую 1.3.5 в слегка похожем сценарии из приложения Angular с одной страницей, где клиентский код для socket.io просто конкатенируется с остальной частью приложения (из пакета bower), а не загружается/включается из определенного сетевого местоположения.

Что, похоже, работает для меня в настройке, где мой socket.io находится по адресу:

http://somedomain.com:9096/sockets/socket.io.js

а не по умолчанию:

http://somedomain.com:9096/socket.io/socket.io.js

(Я вручную отредактировал путь на стороне сервера):

io.connect('http://somedomain.com:9096' + '/' + namespaceName, { path: '/sockets' });

Он выглядит эквивалентно вашему сценарию:

io.connect('http://www.example.com/a/b/c', {path: '/myapp'});

что может стоить еще одной попытки. Я не полностью тестировал namespaceName с прямыми косыми чертами в нем, но, похоже, он забирает соединение на стороне клиента, когда я просто меняю свое пространство имен на '/a/b/c'

Что, возможно, имеет значение, это моя настройка на стороне сервера, которая идет:

var server = http.createServer(app);
var io = require('socket.io')(server, { path: '/sockets' }).listen(server);

Мой ответ скорее является общим признаком того, что возможно использовать пространство имен и настраиваемый путь, несмотря на то, что настройка неочевидна. Надеюсь, это может быть полезно для вас каким-то образом.

Ответ 3

Вы можете проверить официальную документацию на Номера и пространства имен. В принципе, самое главное в socket.io заключается в том, что после того, как ваш клиент запросит источники на стороне клиента, он будет передавать все необходимые данные, необходимые клиенту для подключения к серверу (хост, путь, порт и т.д.).

Чтобы подключиться к вашему конкретному пространству имен, на клиенте вам просто нужно указать:

var socket = io('/a/b/c');

Ответ 4

location ~* /path/some/socket.io/ {
          tcp_nodelay on;
          add_header 'Access-Control-Allow-Origin' "https://domain.at/" always;
          rewrite /(.*) /socket.io/  break;
          proxy_pass http://10.5.5.10:3000;

}