tutorial socket nodejs example node.js websocket socket.io

nodejs - node.js: proxy websockets a otro puerto



socket io tutorial (1)

He escrito http proxy en node.js ejecutándose en el puerto 80. Todo lo que necesito es redirigir el tráfico de socket.io al puerto 9090 y el tráfico http estándar a Apache en 8080. Este es mi código proxy:

httpProxy = require(''http-proxy''); httpProxy.createServer(function (req, res, proxy) { if (req.url.match(/socket.io/)) { proxy.proxyRequest(req, res, { host: ''localhost'', port: 9090 }); } else { proxy.proxyRequest(req, res, { host: ''localhost'', port: 8080 }); } }).listen(80);

Todo funciona, pero io.socket regresa a xhr-polling.

http://localhost/client.htm - falls back to xhr-polling file:///C:/.../client9090.htm - still uses websocket

La aplicación socket.io se ejecuta en el puerto 9090, client.htm se conecta a 80 y client9090.htm se conecta directamente a 9090.

Parece que un nodo-http-proxy hace que la aplicación socket.io funcione en el modo xhr-polling. El cliente es Chrome v.25

Código de la aplicación socket.io

var io = require(''socket.io'').listen(9090); io.on(''connection'', function (socket) { socket.on(''hi!'', function (data) { console.log(data); socket.emit(''news''); }); socket.on(''ahoj'', function (data) { console.log(data); }); });

código client.htm

<script src="http://localhost/socket.io/socket.io.js"></script> <script> var chat = io.connect(''http://localhost'') chat.on(''connect'', function () { chat.emit(''hi!''); }); chat.on(''news'', function () { chat.emit(''ahoj'',{a:1,b:2}); }); </script>

client9090.htm es el mismo pero localhost es reemplazado por localhost: 9090

Como dije, todo funciona bien, el único problema es que el nodo-http-proxy hace que los websockets retrocedan a xhr-polling. ¿Alguien puede ayudar?


De acuerdo con https://npmjs.org/package/http-proxy , cuando se agrega una devolución de llamada a httpProxy.createServer (), tiene que proxy manualmente ''actualizar'' eventos, por lo que algo como esto:

httpProxy = require(''http-proxy''); // added `var server =` here var server = httpProxy.createServer(function (req, res, proxy) { if (req.url.match(/socket.io/)) { proxy.proxyRequest(req, res, { host: ''localhost'', port: 9090 }); } else { proxy.proxyRequest(req, res, { host: ''localhost'', port: 8080 }); } }).listen(80); // added upgrade listener section here: server.on(''upgrade'', function (req, socket, head) { server.proxy.proxyWebSocketRequest(req, socket, head); });

Sin embargo, para el uso que describió anteriormente, ni siquiera necesita la función de devolución de llamada; puede hacer algo como esto con la misma facilidad:

httpProxy = require(''http-proxy''); var options = { pathnameOnly: true, router: { ''/wiki'': ''127.0.0.1:8001'', ''/blog'': ''127.0.0.1:8002'', ''/api'': ''127.0.0.1:8003'' } } var proxyServer = httpProxy.createServer(options); proxyServer.listen(80);