Подключение к серверу 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;
}