創建

2012-08-15 61 views
7

我一直在使用Node.js的監聽到客戶端的連接創建一個TCP服務器在node.js的一個TCP服務器和HTTP服務器之間的WebSockets。 我需要從TCP服務器HTTP服務器再次在Node.js的可能通過的WebSocketsocket.io)來傳輸數據。創建

但是,我不知道如何創建這樣的連接,使得TCP服務器能夠通過Websocket將數據推送到HTTP服務器。

很多謝謝。

+0

您可以使用socket.io客戶端連接使用socket.io的HTTP服務器 – nguyenkha 2012-08-15 10:56:16

+0

@nguyenkha:請你幫我一下代碼示例嗎? – Ravish 2012-08-15 11:05:22

+0

從socket.io示例獲取代碼示例http://socket.io/#how-to-use用於客戶端,僅用於JavaScript部分和'var io = require('socket.io-client');' – nguyenkha 2012-08-15 11:08:18

回答

7

我在嘗試很多事情來獲得這項工作。大多數時候我依靠socket.io來得到這個工作,但它只是沒有與TCP工作。

但是,net.Socket就足夠了。

這是它的工作示例。

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服務器

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

瀏覽器客戶端

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

這樣, re是Node.js中HTTP服務器和TCP服務器之間打開的套接字。

+1

所以2臺不同的服務器? – Lapidus 2014-05-25 09:20:54

+0

@拉維斯從Web客戶端發送消息我試圖發佈消息到http服務器,以Allow-origin-allow-origin錯誤結束。這是從Web客戶端發佈消息的正確方式嗎?或者我犯了什麼錯誤?我提出了一個問題http://stackoverflow.com/q/32999794/4657065。謝謝你的幫助。 – 2015-10-12 12:09:13

0

您可以使用Node.js的上或socket.io WS(只的WebSocket)的客戶端(不僅是瀏覽器)

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試過這個。但是,問題在於它無法與在Node.js上創建的TCP服務器進行通信。即'var app = require('net')。createServer(handle);'但是,當我將其更改爲http時,它可以正常工作。 – Ravish 2012-08-15 11:40:32

2

如果你需要比WebSockets的通信服務器,服務器可能不是一個最好的選擇。嘗試使用RPC libraries之一,或只使用HTTP或您自己的協議。

+1

是啊,[dnode](https://github.com/substack/dnode)! – rdrey 2012-08-15 12:46:37

+0

嘿,謝謝@Andrey和rdrey。儘管我在Node.js中使用了TCP和HTTP服務器之間的套接字。不過,在這種情況下,我肯定會嘗試RPC庫。非常感謝。 :) – Ravish 2012-08-15 19:47:03