最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于node的tcp客戶端和服務(wù)端的簡單通信

 更新時間:2022年02月28日 09:36:39   作者:soraly  
通過Nodejs,我們可以快速地搭建一個簡單的Web服務(wù)器,實現(xiàn)服務(wù)端與客戶端的簡單通信,本文主要介紹了基于node的tcp客戶端和服務(wù)端的簡單通信,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

1.簡單介紹下TCP/IP

TCP/IP是互聯(lián)網(wǎng)相關(guān)協(xié)議的集合,分為以下四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層。

分成四層的好處是,假如只有一層,某個地方需要改變設(shè)計時,就必須把所有整體替換掉,而分層之后只需把變動的層替換掉即可。

2. 服務(wù)端編程

node提供了net模塊來實現(xiàn)tcp編程。主要分為服務(wù)端編程和客戶端編程兩部分,先來寫服務(wù)端的:

監(jiān)聽客戶端連接

先引入net模塊,再通過net.createServer 創(chuàng)建一個TCP服務(wù)器,服務(wù)器可以監(jiān)聽一個connection事件。

net.createServer([options][, connectionListener])

  • options<Object>

    • allowHalfOpen<boolean> 表明是否允許半開的 TCP 連接。默認(rèn)值: false。
    • pauseOnConnect<boolean> 表明是否應(yīng)在傳入連接上暫停套接字。默認(rèn)值: false。
  • connectionListener<Function> 自動設(shè)置為 'connection' 事件的監(jiān)聽器

我們先不傳參數(shù):

var net = require('net');
//創(chuàng)建tcp服務(wù)器
var server = net.createServer(); 

//監(jiān)聽connect事件
server.on('connection', (socket) => {
    socket.on('data',(data)=>{
        console.log(data.toString(), 'data')
    })
})

//設(shè)置監(jiān)聽端口
server.listen(8989);

//設(shè)置監(jiān)聽時的回調(diào)函數(shù)
server.on('listening', (res)=>{
    console.log('in listen...')
})

connection事件當(dāng)有數(shù)據(jù)發(fā)送過來時會被觸發(fā)。監(jiān)聽函數(shù)的參數(shù)是一個socket,用戶可以使用它與客戶端進(jìn)行交互。

通過socket的data事件可以打印出發(fā)送過來的數(shù)據(jù),在瀏覽器中打開 http://localhost:8989,瀏覽器會將請求頭的信息發(fā)送到server,所以輸出結(jié)果如下:

上面代碼中,connection事件可以傳入到createServer中,listen和listening可以合并,寫成下面這種形式:

//第二種寫法
var net = require('net');
//創(chuàng)建tcp服務(wù)器
var server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log(data.toString(), 'data..')
    })
});
//設(shè)置監(jiān)聽端口
server.listen(8989, (res) => {
    console.log('in listen...')
});

除了listening和connect事件外,server還有如下事件:

  • close:TCP服務(wù)器關(guān)閉的時候觸發(fā),回調(diào)函數(shù)沒有參數(shù)
  • error:TCP服務(wù)器發(fā)生錯誤的時候觸發(fā),回調(diào)函數(shù)的參數(shù)為error對象

接收數(shù)據(jù)和發(fā)送數(shù)據(jù)

通過socket的data事件接收數(shù)據(jù),write方法發(fā)送數(shù)據(jù)

socket.write(data[, encoding][, callback])

//創(chuàng)建一個TCP服務(wù)器
var server = net.createServer((socket) => {
    //'connect'事件的回調(diào)函數(shù)
    console.log('客戶端已連接');
    socket.on('end', () => {
        console.log('客戶端已斷開');
    })
    //接收來自客戶端的數(shù)據(jù)
    socket.on('data', (data) => {
        console.log(data.toString(), 'data');
        var readSize = socket.bytesRead;
        console.log('the size of data is ' + readSize);
    })

    //向客戶端寫入數(shù)據(jù)
    socket.write('hello\r\n');

    //設(shè)置連接最大數(shù)量,可不設(shè)
    server.maxConnection = 3;

    server.getConnections(function (err, count) {

        console.log('the count of clieent is ' + count);

    });

})

server.listen(8989, () => {
    console.log('服務(wù)器已啟動');
    //獲取地址信息
    var address = server.address();

    //獲取地址端口
    console.log('the port of server is ' + address.port);
    console.log('the address of server is ' + address.address);
    console.log('the ip family of server is ' + address.family);
})

我們先不寫客戶端的代碼,先用telnet工具來當(dāng)作客戶端來測試上面代碼

打開命令行工具輸入 telnet localhost 8989

可以看到socket.write('hello\r\n')這句話已經(jīng)生效了,服務(wù)端向客戶端返回了hello,但這樣肯定還不夠,

3. 客戶端編程

客戶端編程比服務(wù)端簡單,因為不用監(jiān)聽端口。只要把數(shù)據(jù)從指定的端口發(fā)出去就可以了。

net.createConnection(options[, connectListener]) 用來創(chuàng)建一個socket。第一個參數(shù)必填,要寫發(fā)送的端口號,第二個參數(shù)是這個socket的'connect'事件的回調(diào)函數(shù)

//創(chuàng)建一個客戶端
var client = net.connect({ port: 8989 }, () => {
    console.log('連接到服務(wù)器');
    //向服務(wù)端發(fā)送數(shù)據(jù)
    client.write('hello,i am from client');
})

//監(jiān)聽事件,當(dāng)服務(wù)端發(fā)送數(shù)據(jù)過來時會觸發(fā)該事件
client.on('data', (data) => {
    console.log(data, 'data');
    client.end()
})

client.on('end', () => {
    console.log('已從服務(wù)器斷開');
});

上面代碼的client就是一個socket,所以可以監(jiān)聽data事件來獲取服務(wù)端發(fā)送來的數(shù)據(jù)。然后socket也可以通過write來向服務(wù)端發(fā)送數(shù)據(jù)

4. 一個小的登錄系統(tǒng)

利用上面的知識,可以實現(xiàn)一個小型的登錄系統(tǒng):

/*server.js*/
var net = require('net');
//這兒用一個對象來模擬數(shù)據(jù)庫,保存用戶名和密碼
var user = {
    admin: '123',
    test: '333',
    lucy: '222',
}
//臨時變量保存用戶輸入的內(nèi)容
var username = '';

var server = net.createServer((socket)=>{
    console.log('服務(wù)器已連接');
    socket.write('請輸入用戶名:');
    socket.on('data',(data)=>{
        //通過stdin輸入的內(nèi)容是buffer,需要轉(zhuǎn)成字符串且清除空格
        data = data.toString().trim();
        if(!username){
            if(user[data]){
                socket.write('請輸入密碼:');
                username = data;
            }else{
                socket.write('用戶名不對,請輸入用戶名:');
            }
        }else {
            if(user[username] === data){
                socket.write('登錄成功');
            }else {
                socket.write('密碼不對,請輸入密碼:');
            }
        }
    });
    socket.on('close',data=>{
        console.log(data);
    })
})

server.listen(8899,()=>{
    console.log('服務(wù)器監(jiān)聽8899端口中')
})

 到此這篇關(guān)于基于node的tcp客戶端和服務(wù)端的簡單通信的文章就介紹到這了,更多相關(guān)基于node的tcp客戶端和服務(wù)端的簡單通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Typescript和ES模塊發(fā)布Node模塊的方法

    使用Typescript和ES模塊發(fā)布Node模塊的方法

    這篇文章主要介紹了使用Typescript和ES模塊發(fā)布Node模塊的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 在Debian(Raspberry Pi)樹莓派上安裝NodeJS的教程詳解

    在Debian(Raspberry Pi)樹莓派上安裝NodeJS的教程詳解

    在樹莓派上運行NodeJS并不需要特別的配置,你只需要確??梢杂胦penssh遠(yuǎn)程連接到你的樹莓派就ok了,關(guān)于在Debian(Raspberry Pi)樹莓派上安裝NodeJS的方法,大家可以通過本文了解下
    2017-09-09
  • 輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實現(xiàn)

    輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實現(xiàn)

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實現(xiàn),本文先是組出了代碼,然后對代碼一一分析,需要的朋友可以參考下
    2014-12-12
  • Nodejs全棧框架StrongLoop推薦

    Nodejs全??蚣躍trongLoop推薦

    StrongLoop基本提供了制作一個移動產(chǎn)品所有的框架和工具,從標(biāo)準(zhǔn)的Backend server,Devops,應(yīng)用監(jiān)控,。要想介紹完全StrongLoop的所有產(chǎn)品得寫一個長篇連載了,這里只簡單的瀏覽一遍。
    2014-11-11
  • 切換Node.js鏡像源的方法詳解

    切換Node.js鏡像源的方法詳解

    Node.js 是一個非常流行的 JavaScript 運行環(huán)境,擁有許多強(qiáng)大的功能和庫,使得它在 Web 開發(fā)、服務(wù)器端編程等領(lǐng)域中廣泛使用,在本文中,我們將介紹如何切換 Node.js 的鏡像源,并提供一些思考和難點,幫助讀者更好地理解這個問題,需要的朋友可以參考下
    2024-01-01
  • 詳解npm與package.json之間的聯(lián)系

    詳解npm與package.json之間的聯(lián)系

    這篇文章主要為大家介紹了npm與package.json之間的聯(lián)系圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解

    Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解

    這篇文章主要為大家介紹了Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Node.js API詳解之 console模塊用法詳解

    Node.js API詳解之 console模塊用法詳解

    這篇文章主要介紹了Node.js API詳解之 console模塊用法,總結(jié)分析了Node.js API中console模塊基本函數(shù)、使用方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • NodeJS學(xué)習(xí)筆記之MongoDB模塊

    NodeJS學(xué)習(xí)筆記之MongoDB模塊

    nodejs是個強(qiáng)大的平臺,有基本功能,而且可以掛很多模塊。我們現(xiàn)在需要和mongodb連接的驅(qū)動,就類似比如mysql的java驅(qū)動一樣。nodejs有好幾個mongodb的第三方驅(qū)動。和jdbc不一樣,沒有標(biāo)準(zhǔn)。所以需要到驅(qū)動的網(wǎng)站上去了解學(xué)習(xí)怎么使用它訪問mongodb。
    2015-01-01
  • 修改node.js默認(rèn)的npm安裝目錄實例

    修改node.js默認(rèn)的npm安裝目錄實例

    今天小編就為大家分享一篇修改node.js默認(rèn)的npm安裝目錄實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論

丹寨县| 沈阳市| 堆龙德庆县| 青浦区| 始兴县| 黔西县| 天祝| 永济市| 江油市| 石河子市| 宿州市| 滁州市| 郸城县| 高唐县| 瑞金市| 澄迈县| 吉水县| 巴彦淖尔市| 通化县| 临夏市| 大邑县| 马鞍山市| 万安县| 达拉特旗| 沈丘县| 上蔡县| 峨眉山市| 沛县| 基隆市| 健康| 巫山县| 宜州市| 遵义市| 双鸭山市| 光泽县| 炎陵县| 普洱| 云霄县| 肥城市| 江川县| 古交市|