Node.js实现基于TCP与UDP的数据通信
2019獨角獸企業重金招聘Python工程師標準>>>
7.1、使用net模塊實現基于TCP的數據通信
7.1.1、創建TCP服務器
? ? 在node.js中可以很方便的創建一個TCP服務器,只需調用net模塊中的CreateServer方法即可。
? ? var server=net.createSever([options],[connctionListener])
? ? options參數值為一個對象,可以在該對象中受用一個布爾類型的allowHalfOpen屬性,當該屬性被指定為false時,當TCP服務器接收到客戶端發送的一個FIN包時將會回發一個FIN包,當該屬性被設定為true時,當TCP服務器接收到客戶端發送的一個FIN包時不回發FIN包,這使的TCP 服務器可以繼續向客戶端發送數據,但不會繼續接收客戶端發送的數據。開發者必須調用end方法來關閉該socket連接。該屬性默認值為false。
connectionListener參數用于指定當客戶端與服務器端建立連接時所要調用的回調函數?;卣{函數如下所示:
function(socket){//回調函數代碼}
在該回調函數中使用一個參數,參數值為該TCP服務器監聽的socket端口對象。
createServer方法返回被創建的TCP服務器。
當客戶端與服務器端建立連接時,觸發connection事件,我們也可以不在createServer方法中使用connectionListener參數,而是通過connection事件進行監聽,并且該事件的回調函數的方法來指定客戶端與服務器端連接時需要執行的處理,如下所示:
server.on('connection',function(socket){//回調函數代碼})
7.1.2、socket端口對象
? ? 在node.js中,使用net,.socket代表一個socket端口對象。在使用createSever方法的connetionListener參數鎖指定的回調函數的參數值即一個被自動創建的net.Socket對象,在對TCP服務器所指定的connection事件回調函數的參數值同樣為一個被自動創建的net.socket對象。
? 與TCP服務器對象的address方法類似,可以利用socket端口對象的address方法獲取該socket端口的相關地址信息。
var address=socket.address();
address.prot:socket端口對象的端口號
address.address:socket端口對象所屬地址
address.family:標識該socket端口對象所屬地址是IPv4地址還是IPv6地址的字符串,例如“IPv4”
使用socket端口對象的address方法查看端口地址信息,代碼如下:
var net=require('net');
var server=net.createServer();
server.on('connection',function(socket){
? ? address=socket.address();
? ? console.log('socket端口對象的地址信息為:%j',address);
})
server.listen(8431,'localhost');
?
socket端口對象可被用來讀取客戶端發送的流數據。每次接收到客戶端發送的流數據時觸發data事件
可通過對該事件進行監聽并且指定回調函數的方法來指定當服務器端監聽的socket端口對象接收到客戶端發送的數據時所需執行的出來。
socket.on('data',function(data){//回調函數});
在該回調函數中,使用一個參數,參數值為一個Buffer對象或一個字符串對象。
另外,socket端口對象具有一個bytesRead屬性,該屬性值為socket端口對象接收到的客戶端發送數據的字節數。
當客戶端鏈接被關閉時觸發socket端口對象的end事件。
可以利用socket對象的pipe方法將客戶端發送的流數據寫到文件等其他目標對象中。
socket.pipe(destination,[options]);
在pipe方法中,使用兩個參數,其中destination參數為必須輸入參數,options為可選參數。destination必須為一個可用于寫入流數據的對象,options參數為一個對象,可以在該對象中使用一個布爾類型的end屬性,如果該屬性為true,則當數據被全部讀取完畢時立即結束寫操作,如果該屬性為false,則不行結束寫操作,目標對象中可以被繼續寫入新的數據,該屬性值默認為true.
可以使用socket端口對象的unpipe方法取消對目標對象的寫入操作。
在node.js中,可以使用socket對象的pause方法暫停data事件的觸發,這是服務器把每個客戶端發哦那個的數據暫時存在一個單獨的緩存區,socket端口對象的resume方法恢復data事件的觸發,這時將讀取被 緩存的該客戶端數據。
socket.pause();
socket.resume();
當存在大量的往TCP服務器端發送數據的客戶端時,這一對方法可用來控制對每個客戶端發送數據的讀取速度。
?
當TCP服務器與客戶端建立連接或通信過程中發生錯誤時,觸發socket對象的error事件 。
在捕捉到錯誤之后,應該使用socket對象的destroy方法銷毀該socketd端口對象,以確保該socket端口對象不會在被利用。
socket.destroy();
?
7.1.3、創建TCP客戶端
? ? 在node.js中,創建TCP客戶端是一件非常簡單的事,只要創建一個用于連接TCP服務器的socket端口對象即可。
var net=new net.Socket([options]);
創建了socket端口對象之后,可以使用兩種connect方法鏈接TCP服務器。
方法一 socket.connect(port,[host],[connectListener]);
方法二 socket.connect(path,[connectListener])
?
7.1.4、net模塊中的類方法
7.2、使用dgram模塊實現基于UDP的數據通信。
?
?
轉載于:https://my.oschina.net/wsh2016/blog/761377
總結
以上是生活随笔為你收集整理的Node.js实现基于TCP与UDP的数据通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【matlab】设定C++编译器
- 下一篇: Retrofit2/OkHttp 重写覆