轉自:http://cnodejs.org/topic/4fb1c1fd1975fe1e1310490b
在Node.js中使用TCP通訊端編程
譯自http://www.hacksparrow.com/tcp-socket-programming-in-node-js.html
想知道如何在NodeJS中使用socket編程。在NodeJS中有三種socket:1. TCP,2. UDP,3. Unix域通訊端,本文主要介紹NodeJS中TCP的基本編程知識。
你可以建立兩種類型的TCP通訊端:1. 服務端,2. 用戶端。服務端TCP監聽來自用戶端的串連請求,並使用TCP串連向用戶端發送資料;用戶端TCP串連到服務端並與伺服器互動資料。用戶端與服務端之間依靠通訊端進行雙向通訊。
在NodeJS中使用TCP需要引用net模組。net模組是NodeJS中非同步網路編程的封裝,可以做很多事情,本文僅關注於如何使用該模組建立服務端與用戶端的TCP通訊端。
建立TCP服務端
下面是一個在NodeJS中建立TCP服務端通訊端的簡單例子,相關說明見代碼注釋。
var net = require('net');var HOST = '127.0.0.1';var PORT = 6969;// 建立一個TCP伺服器執行個體,調用listen函數開始監聽指定連接埠// 傳入net.createServer()的回呼函數將作為”connection“事件的處理函數// 在每一個“connection”事件中,該回呼函數接收到的socket對象是唯一的net.createServer(function(sock) { // 我們獲得一個串連 - 該串連自動關聯一個socket對象 console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort); // 為這個socket執行個體添加一個"data"事件處理函數 sock.on('data', function(data) { console.log('DATA ' + sock.remoteAddress + ': ' + data); // 回傳該資料,用戶端將收到來自服務端的資料 sock.write('You said "' + data + '"'); }); // 為這個socket執行個體添加一個"close"事件處理函數 sock.on('close', function(data) { console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort); });}).listen(PORT, HOST);console.log('Server listening on ' + HOST +':'+ PORT);
服務端也可以用稍不同的方式接受TCP串連,即顯式處理"connection"事件:
var server = net.createServer();server.listen(PORT, HOST);console.log('Server listening on ' + server.address().address + ':' + server.address().port);server.on('connection', function(sock) { console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); // 其它內容與前例相同});
上述兩個例子只是寫法不同,並無本質區別。
建立TCP用戶端
現在讓我們建立一個TCP用戶端串連到剛建立的伺服器上,該用戶端向伺服器發送一串訊息,並在得到伺服器的反饋後關閉串連。下面的代碼描述了這一過程。
var net = require('net');var HOST = '127.0.0.1';var PORT = 6969;var client = new net.Socket();client.connect(PORT, HOST, function() { console.log('CONNECTED TO: ' + HOST + ':' + PORT); // 建立串連後立即向伺服器發送資料,伺服器將收到這些資料 client.write('I am Chuck Norris!');});// 為用戶端添加“data”事件處理函數// data是伺服器發回的資料client.on('data', function(data) { console.log('DATA: ' + data); // 完全關閉串連 client.destroy();});// 為用戶端添加“close”事件處理函數client.on('close', function() { console.log('Connection closed');});
這就是NodeJS中進行TCP網路編程的基本過程,希望能對你有所協助。需要注意的是,通訊端編程要比這裡的例子複雜得多,當你使用通訊端發送大量資料或完成複雜任務的時候,你就會用到流(Streams)和緩衝區(Buffers)等相關模組。
進一步閱讀 <ol> NodeJS net 模組 NodeJS stream 模組 NodeJS buffer 模組 </ol>