2012-08-15 9 views
7

ho creato un server TCP utilizzando Node.js che ascolta le connessioni client. ho bisogno di trasmettere i dati dal server di TCP al server HTTP nuovo in Node.js possibilmente attraverso un websocket (socket.io).Creare WebSockets tra un server TCP e server HTTP in node.js

Tuttavia, non so come creare tale connessione in modo tale che il server TCP sia in grado di inviare dati al server HTTP tramite Websocket.

Molte grazie.

+0

È possibile utilizzare socket.io-client per connettere il server HTTP tramite socket.io – nguyenkha

+0

@nguyenkha: Potete aiutarmi con l'esempio di codice per favore? – Ravish

+0

Prendere il codice dall'esempio socket.io http://socket.io/#how-to-use per lato client, solo la parte JavaScript e 'var io = require ('socket.io-client');' – nguyenkha

risposta

7

Stavo cercando un sacco di cose per ottenere questo lavoro. Il più delle volte mi affidavo a socket.io per farlo funzionare, ma non funzionava proprio con TCP.

Tuttavia, net.Socket è sufficiente.

Ecco l'esempio funzionante di questo.

Server 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); 

HTTP Server

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"); 
}); 

Browser Client

<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> 

In questo modo, il re è un socket aperto tra server HTTP e server TCP in Node.js.

+1

Quindi 2 server diversi? – Lapidus

+0

@Ravis per inviare un messaggio dal client Web Ho provato a inviare un messaggio al server http che termina con l'errore Allow-origin-allow-origin. È un modo corretto per inviare messaggi dal client web o sto facendo un errore? ho sollevato una domanda http://stackoverflow.com/q/32999794/4657065.Grazie per l'aiuto. –

0

È possibile utilizzare uno socket.io o WS (solo WebSocket) su Node.js come client (non solo in del browser)

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 provato questo Tuttavia, il problema è che non è in grado di comunicare con il server TCP creato su Node.js. ad esempio 'var app = require ('net'). createServer (handle);' Funziona quando lo cambio in http. – Ravish

2

Se avete bisogno di comunicare Server-Server di WebSockets non è probabilmente un scelta migliore. Prova uno di RPC libraries o usa semplicemente HTTP o il tuo protocollo.

+1

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

+0

Ehi, grazie @Andrey e rdrey. Anche se ho avuto i socket che funzionano tra un TCP e HTTP Server in Node.js. Tuttavia, proverei sicuramente le librerie RPC in questo caso. Molte grazie. :) – Ravish

Problemi correlati