首頁 > 軟體

基於node的tcp使用者端和伺服器端的簡單通訊

2022-02-28 10:00:15

1.簡單介紹下TCP/IP

TCP/IP是網際網路相關協定的集合,分為以下四層:應用層、傳輸層、網路層、資料鏈路層。

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

2. 伺服器端程式設計

node提供了net模組來實現tcp程式設計。主要分為伺服器端程式設計和使用者端程式設計兩部分,先來寫伺服器端的:

監聽使用者端連線

先引入net模組,再通過net.createServer 建立一個TCP伺服器,伺服器可以監聽一個connection事件。

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

  • options<Object>

    • allowHalfOpen<boolean> 表明是否允許半開的 TCP 連線。預設值: false
    • pauseOnConnect<boolean> 表明是否應在傳入連線上暫停通訊端。預設值: false
  • connectionListener<Function> 自動設定為 'connection' 事件的監聽器

我們先不傳引數:

var net = require('net');
//建立tcp伺服器
var server = net.createServer(); 

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

//設定監聽埠
server.listen(8989);

//設定監聽時的回撥函數
server.on('listening', (res)=>{
    console.log('in listen...')
})

connection事件當有資料傳送過來時會被觸發。監聽函數的引數是一個socket,使用者可以使用它與使用者端進行互動。

通過socket的data事件可以列印出傳送過來的資料,在瀏覽器中開啟 http://localhost:8989,瀏覽器會將請求頭的資訊傳送到server,所以輸出結果如下:

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

//第二種寫法
var net = require('net');
//建立tcp伺服器
var server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log(data.toString(), 'data..')
    })
});
//設定監聽埠
server.listen(8989, (res) => {
    console.log('in listen...')
});

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

  • close:TCP伺服器關閉的時候觸發,回撥函數沒有引數
  • error:TCP伺服器發生錯誤的時候觸發,回撥函數的引數為error物件

接收資料和傳送資料

通過socket的data事件接收資料,write方法傳送資料

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

//建立一個TCP伺服器
var server = net.createServer((socket) => {
    //'connect'事件的回撥函數
    console.log('使用者端已連線');
    socket.on('end', () => {
        console.log('使用者端已斷開');
    })
    //接收來自使用者端的資料
    socket.on('data', (data) => {
        console.log(data.toString(), 'data');
        var readSize = socket.bytesRead;
        console.log('the size of data is ' + readSize);
    })

    //向用戶端寫入資料
    socket.write('hellorn');

    //設定連線最大數量,可不設
    server.maxConnection = 3;

    server.getConnections(function (err, count) {

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

    });

})

server.listen(8989, () => {
    console.log('伺服器已啟動');
    //獲取地址資訊
    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工具來當作使用者端來測試上面程式碼

開啟命令列工具輸入 telnet localhost 8989

可以看到socket.write('hellorn')這句話已經生效了,伺服器端向用戶端返回了hello,但這樣肯定還不夠,

3. 使用者端程式設計

使用者端程式設計比伺服器端簡單,因為不用監聽埠。只要把資料從指定的埠發出去就可以了。

net.createConnection(options[, connectListener]) 用來建立一個socket。第一個引數必填,要寫傳送的埠號,第二個引數是這個socket的'connect'事件的回撥函數

//建立一個使用者端
var client = net.connect({ port: 8989 }, () => {
    console.log('連線到伺服器');
    //向伺服器端傳送資料
    client.write('hello,i am from client');
})

//監聽事件,當伺服器端傳送資料過來時會觸發該事件
client.on('data', (data) => {
    console.log(data, 'data');
    client.end()
})

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

上面程式碼的client就是一個socket,所以可以監聽data事件來獲取伺服器端傳送來的資料。然後socket也可以通過write來向伺服器端傳送資料

4. 一個小的登入系統

利用上面的知識,可以實現一個小型的登入系統:

/*server.js*/
var net = require('net');
//這兒用一個物件來模擬資料庫,儲存使用者名稱和密碼
var user = {
    admin: '123',
    test: '333',
    lucy: '222',
}
//臨時變數儲存使用者輸入的內容
var username = '';

var server = net.createServer((socket)=>{
    console.log('伺服器已連線');
    socket.write('請輸入使用者名稱:');
    socket.on('data',(data)=>{
        //通過stdin輸入的內容是buffer,需要轉成字串且清除空格
        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('伺服器監聽8899埠中')
})

 到此這篇關於基於node的tcp使用者端和伺服器端的簡單通訊的文章就介紹到這了,更多相關基於node的tcp使用者端和伺服器端的簡單通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com