日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Node.js实现基于TCP与UDP的数据通信

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js实现基于TCP与UDP的数据通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。