Mi aplicación Node.js se ejecuta en la URL http://www.example.com/myapp/ .
He configurado un servidor Socket.IO (versión 1.3.5) con un espacio de nombres personalizado. Aquí hay un fragmento de código de ejemplo:
var server = http.createServer(...); var io = socketio(server); io .of('/a/b/c') .on('connection', function (socket) { socket.emit('update', {msg: '/a/b/c'}); });No puedo averiguar cómo conectarme a este servicio desde el cliente. Mis conjeturas (ninguna de estas funciona):
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'});En su servidor, no olvide especificar la ruta también:
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); }); });En su cliente, no confunda el espacio de nombres y la ruta:
var socket = io('http://www.example.com/my-namespace', { path: '/myapp/socket.io'});También estoy usando 1.3.5, en un escenario ligeramente similar, desde una aplicación de una sola página de Angular, donde el código de cliente para socket.io simplemente se concatena con el resto de la aplicación (de un paquete Bower), en lugar de descargar/ incluidos desde una ubicación de red en particular.
Lo que parece funcionar para mí en la configuración donde se encuentra mi socket.io:
http://somedomain.com:9096/sockets/socket.io.jsen lugar del valor predeterminado:
http://somedomain.com:9096/socket.io/socket.io.js(Ajusté manualmente la ruta en el lado del servidor), es:
io.connect('http://somedomain.com:9096' + '/' + namespaceName, { path: '/sockets' });Parece equivalente a su escenario:
io.connect('http://www.example.com/a/b/c', {path: '/myapp'}); que puede valer la pena otro intento. No he probado por completo el nombre del espacio de namespaceName con barras diagonales, pero parece captar la conexión en el lado del cliente, cuando simplemente cambio mi espacio de nombres a '/a/b/c'
Lo que probablemente marca la diferencia es la configuración del lado de mi servidor, que dice:
var server = http.createServer(app); var io = require('socket.io')(server, { path: '/sockets' }).listen(server);Mi respuesta es más una indicación general de que es posible usar tanto un espacio de nombres como una ruta personalizada, a pesar de que la configuración no es obvia. Espero que pueda ser útil para usted de alguna manera.
Puedes consultar la documentación oficial sobre Rooms y Namespaces . Básicamente, lo mejor de socket.io es que, una vez que su cliente solicite las fuentes del lado del cliente, transmitirá todos los detalles necesarios para que el cliente se conecte al servidor (host, ruta, puerto, etc.).
Para conectarse a su espacio de nombres específico, en el cliente simplemente tendría que especificar:
var socket = io('/a/b/c');