2012-08-15 3 views
7

J'ai créé un serveur TCP utilisant Node.js qui écoute les connexions des clients. J'ai besoin de nouveau transmettre des données à partir serveur TCP à serveur HTTP dans Node.js peut-être par un Websocket (socket.io).Créer WebSockets entre un serveur TCP et le serveur HTTP dans Node.js

Cependant, je ne sais pas comment créer une telle connexion telle que le serveur TCP est capable de pousser des données vers le serveur HTTP via Websocket.

Merci beaucoup.

+0

Vous pouvez utiliser socket.io-client pour se connecter au serveur HTTP à l'aide socket.io – nguyenkha

+0

@nguyenkha: Pouvez-vous me aider avec s'il vous plaît l'exemple de code s'il vous plaît? – Ravish

+0

Prenez le code de socket.io exemple http://socket.io/#how-to-use pour côté client, seule une partie JavaScript et 'var io = require ('socket.io-client');' – nguyenkha

Répondre

7

J'ai essayé beaucoup de choses pour obtenir ce travail. La plupart du temps, je comptais sur socket.io pour obtenir ce travail, mais il était tout simplement pas travailler avec TCP. Cependant, net.Socket suffit.

Voici l'exemple de travail de celui-ci.

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

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

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> 

De cette façon, la re est un socket ouvert entre le serveur HTTP et le serveur TCP dans Node.js.

+1

Donc 2 serveurs différents? – Lapidus

+0

@Ravis pour envoyer un message à partir du client Web J'ai essayé d'envoyer un message au serveur http qui se termine par l'erreur Autoriser-origin-allow-origin. Est-ce un moyen correct de poster un message depuis un client web ou je fais une erreur? J'ai soulevé une question http://stackoverflow.com/q/32999794/4657065.Merci de votre aide. –

0

Vous pouvez utiliser socket.io ou ws (uniquement WebSocket) sur Node.js en tant que client (non seulement dans le navigateur)

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 essayé ça. Cependant, le problème est qu'il n'est pas capable de communiquer avec le serveur TCP créé sur Node.js. c'est-à-dire 'var app = require ('net'). createServer (handle);' Mais cela fonctionne quand je le change en http. – Ravish

2

Si vous avez besoin de communiquer serveur-serveur que websockets est probablement pas meilleur choix. Essayez l'un des RPC libraries, ou utilisez simplement HTTP ou votre propre protocole.

+1

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

+0

Salut, Merci @Andrey et rdrey. Bien que les sockets fonctionnent entre un serveur TCP et HTTP dans Node.js. Cependant, je vais certainement essayer les bibliothèques RPC dans ce cas. Merci beaucoup. :) – Ravish

Questions connexes