【Node.js基礎篇】(十)使用net模組和Readline模組實現Socket通訊,node.jsreadline
Node.js的socket通訊和C++、Java的非常相像,學過這兩種語言的socket通訊的同學可以很快就掌握好Node.js的socket通訊。下面我們以實現一個Echo伺服器的服務端和用戶端為目的,學習一下Node.js的socket通訊。
所謂的Echo伺服器指的是這樣一種伺服器:用戶端發送一條訊息給服務端,服務端就把這條訊息原封不動地返回給用戶端。
服務端
服務端的實現分為三步:
- 通過createServer建立一個server服務端
- 使用server的listen方法監聽指定連接埠,等待用戶端接入
- 通過socket對象來監聽data、close等事件,用以完成與用戶端的互動
下面是服務端代碼:
/** * Created by Administrator on 2015/9/8. */var net = require('net');// 伺服器IPvar HOST = '127.0.0.1';// 連接埠號碼var PORT = 7001;// 建立一個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); // 回傳該資料,用戶端將收到來自服務端的資料,實現ECHO伺服器 sock.write('' + 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);
使用createListener的時候會傳入一個回呼函數,當用戶端串連上服務端時調用。在回呼函數裡,完成了對data、close事件的監聽。
- data事件:當用戶端有訊息發送過來時觸發此事件
- close事件:當用戶端中斷連線時觸發此事件
用戶端
因為要實現的是Echo伺服器,所以自然要實現輸入與輸出,這裡,我使用了上一篇介紹的Readline模組來實現控制台的輸入與輸出,對這一模組不太熟悉的同學,可以先去看一下Readline模組的介紹。
與服務端相似,用戶端的實現也分為三步:
- 建立一個socket
- 串連上指定IP指定連接埠號碼的服務端
- 監聽data、close等事件完成與服務端的互動
用戶端代碼如下:
/** * Created by Administrator on 2015/9/8. */var net = require('net');var readline = require('readline');// 建立Readline介面rl = readline.createInterface(process.stdin, process.stdout);var HOST = '127.0.0.1';var PORT = 7001;var client = new net.Socket();client.connect(PORT, HOST, function() { console.log('CONNECTED TO: ' + HOST + ':' + PORT); // 串連建立後,開始執行命令列輸入 rl.setPrompt('Test> '); rl.prompt();});// 為用戶端添加“data”事件處理函數// data是伺服器發回的資料client.on('data', function(data) { // 輸出伺服器端傳來的訊息 console.log(""+data); rl.prompt();});// 為用戶端添加“close”事件處理函數client.on('close', function() { console.log('Connection closed'); process.exit(0);});rl.on('line', function(line) { switch(line.trim()) { case 'close': rl.close(); return; } client.write(line.trim()); rl.prompt();}).on('close', function() { console.log('Good bye!'); client.end();});
這裡應該注意,用戶端socket監聽了data和close事件、我們的輸入輸出模組也監聽了它們自己的line、close事件,前者是client變數,後者是rl變數,要區別開來。
當我們輸入close後,會發生以下過程
1. line事件裡調用Readline.close()觸發了Readline的close事件;
2. 在Readline的close事件裡,調用client.end()結束用戶端,從而觸發用戶端的close事件;
3. 用戶端的close事件監聽器裡執行程式退出操作 process.exit(0).
通訊結果
用戶端:
服務端:
通訊涉及三個過程:
1. 用戶端接收使用者輸入資訊後將發往服務端;
2. 服務端接收用戶端傳來資訊後將原封返回給用戶端;
3. 用戶端接收服務端資訊後將其顯示出來。
這裡只是簡單介紹了一下Node.js的基本的用法,如果想要瞭解更多用法,可以看官方的API文檔。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。