2012-08-15 99 views
7

He creado un servidor TCP usando Node.js el que escucha las conexiones de los clientes. I necesidad de transmitir datos de servidor TCP a servidor HTTP de nuevo en Node.js posiblemente a través de un WebSocket (socket.io).Crear WebSockets entre un servidor TCP y servidor HTTP en Node.js

Sin embargo, no sé cómo crear dicha conexión de modo que el servidor TCP pueda enviar datos al servidor HTTP a través de Websocket.

Muchas gracias.

+0

Puede usar socket.io-client para conectar el servidor HTTP usando socket.io – nguyenkha

+0

@nguyenkha: ¿Puede ayudarme con la muestra del código, por favor? – Ravish

+0

Tome el código de socket.io example http://socket.io/#how-to-use para el lado del cliente, solo parte de JavaScript y 'var io = require ('socket.io-client');' – nguyenkha

Respuesta

7

Estaba intentando muchas cosas para hacer este trabajo. La mayoría de las veces confiaba en socket.io para que funcionara, pero simplemente no funcionaba con TCP. Sin embargo, net.Socket es suficiente.

Aquí está el ejemplo de trabajo de la misma.

Servidor TCP

var net = require('net'); 

var HOST = 'localhost'; 
var PORT = 4040; 

var server = net.createServer(); 
server.listen(PORT, HOST); 

server.on('connection', function(sock) { 
    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); 
sock.write("TCP sending message : 1"); 
    console.log('Server listening on ' + server.address().address +':'+ 
     server.address().port); 
}).listen(PORT, HOST); 

servidor HTTP

var http = require('http').createServer(httpHandler), 
    fs = require("fs"), 
    wsock = require('socket.io').listen(http), 
    tcpsock = require('net'); 

var http_port = 8888; 

var tcp_HOST = 'localhost'; 
var tcp_PORT = 4040; 

/** 
* http server 
*/ 
function httpHandler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

http.listen(http_port); 
console.info("HTTP server listening on " + http_port); 

wsock.sockets.on('connection', function (socket) { 

    var tcpClient = new tcpsock.Socket(); 
    tcpClient.setEncoding("ascii"); 
    tcpClient.setKeepAlive(true); 

    tcpClient.connect(tcp_PORT, tcp_HOST, function() { 
     console.info('CONNECTED TO : ' + tcp_HOST + ':' + tcp_PORT); 

     tcpClient.on('data', function(data) { 
      console.log('DATA: ' + data); 
      socket.emit("httpServer", data); 
     }); 

     tcpClient.on('end', function(data) { 
      console.log('END DATA : ' + data); 
     }); 
    }); 

    socket.on('tcp-manager', function(message) { 
     console.log('"tcp" : ' + message); 
     return; 
    }); 

    socket.emit("httpServer", "Initial Data"); 
}); 

navegador cliente

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.on('httpServer', function (data) { 
    console.log(data); 
    document.write(data + "\r\n"); 
    socket.emit('tcp', "For TCP"); 
    }); 
</script> 

De esta manera, el re es un socket abierto entre el servidor HTTP y el servidor TCP en Node.js.

+1

Entonces 2 servidores diferentes? – Lapidus

+0

@Ravis para enviar un mensaje desde el cliente web. Intenté publicar un mensaje en el servidor http que finaliza con el error Allow-origin-allow-origin. ¿Es una forma correcta de publicar mensajes del cliente web o estoy cometiendo un error? He planteado una pregunta http://stackoverflow.com/q/32999794/4657065.gracias por tu ayuda. –

0

Puede utilizar cualquiera socket.io o ws (sólo WebSocket) en Node.js como cliente (no sólo en el navegador)

var io = require('socket.io-client'); 
var socket = io.connect('http://IP address of Websocket server'); 
socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
}); 
+0

I intenté esto. Sin embargo, el problema es que no puede comunicarse con el servidor TCP creado en Node.js. es decir, 'var app = require ('net'). createServer (handle);' Pero funciona cuando lo cambio a http. – Ravish

2

Si necesita comunicarse servidor-servidor que websockets probablemente no es una mejor elección. Pruebe uno de RPC libraries, o simplemente use HTTP o su propio protocolo.

+1

sí, [dnode] (https://github.com/substack/dnode)! – rdrey

+0

Hola, gracias @Andrey y rdrey. Aunque obtuve los sockets trabajando entre un servidor TCP y HTTP en Node.js. Sin embargo, definitivamente probaría las bibliotecas RPC en este caso. Muchas gracias. :) – Ravish

Cuestiones relacionadas