【Node.js基礎篇】(十)使用net模組和Readline模組實現Socket通訊,node.jsreadline

來源:互聯網
上載者:User

【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文檔。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.