淺談node之TCP
阿新 • • 發佈:2018-11-23
node之TCP
- 首先node提供了net,daram,http,https這四個模組,分別用於處理TCP,UDP,HTTP,HTTPS,適合用於伺服器端和客戶端。
- TCP全名傳輸控制協議
TCP是面向連線的協議,其顯著的特徵是在傳輸之前需要三次握手形成會話,只有會話形成後,伺服器端和客戶端之間才能互相傳送資料。
在建立會話的過程中,伺服器端和客戶端分別提供一個套接字,這兩個套接字共同形成一個連線。
- 伺服器端和客戶端則通過套接字實現兩者之間連線的操作。
構建TCP伺服器
建立TCP伺服器端
var net = require('net');
var server = net.createServer(function (socket){
//新的連線;
socket.on('data',function(data){
socket.write("你好");
});
socket.on('end',function(data){
console.log('連線斷開' );
});
socket.write("朋友,你好.\n");
});
server.listen(8000,function(){
console.log('繫結伺服器8000埠');
});
利用Telnet工具作為客戶端對建立的伺服器進行會話交流:
$ telnet 127.0.0.1 8000
Trying 127.0.0.1..
Connected to localhost.
Escape character is '^]'.
也可以通過net模組自行構造客戶端進行會話:
var net = require('net');
var client = net.connect({port:8000 },function(){
console.log('伺服器已連線');
});
client.on('data',function(data){
console.log(data.toString());
client.end();
});
client.on('end',function(){
console.log('伺服器關閉');
});
TCP服務的事件
上述程式碼中分為伺服器事件和連線事件
1.伺服器事件
- 對於通過net.creatServer( )建立的伺服器而言,他是一個EventEmitter例項,他的自定義時間有四種:
-
1:listening: 在呼叫sever.listen()繫結埠或者Domain Socket後觸發,簡潔寫法為server.listen(por,listeningListener),通過listen()方法的第二個引數傳入。
2.connection: 每個客戶端套接字連線到伺服器端時觸發
3.close: 當伺服器關閉時觸發,在呼叫server.close()後,伺服器將停止接受新的套接字連線,但保持當前存在的連線,等待所有連線都斷開後,會觸發該事件。
4.error: 當伺服器發生異常時,會觸發該事件。
2.連線事件
- 伺服器可以同時與多個客戶端保持連線,對於每個連線而言是典型的可寫可讀Stream物件。該物件可用於伺服器和客戶端之間的通訊。他具有如下定義事件:
- 1.data: 當一端呼叫write()傳送資料時,另一端會觸發data事件,事件傳遞的資料時write()傳送的資料。
-
2.end: 當連線中的任意一端傳送了FIN資料時,將會觸發該事件。
3.connect: 該事件用於客戶端,當套接字與伺服器連線成功時會被觸發。
4.drain: 當任意一端呼叫write( )傳送資料時,當前這端會觸發該事件。
5.error: 當異常發生時,會觸發該事件。
6.close: 當套接字完全關閉時,觸發該事件。
7timeout: 當一定時間後連線不在活躍時,會被觸發,通知使用者當前該連線已經被閒置。
由於TCP套接字是可讀可寫的Stream物件,可以利用pipe()方法實現管道操作。
如下程式碼實現一個echo伺服器:
var net = require('net');
var sever = net.creatSever(function(socket){
socket.write('Echo sever');
socket.pipe(socket);
});
sever.listen(8080,'127.0.0.1');