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