首頁  >  文章  >  web前端  >  手把手教你使用Node.js進行TCP網路通訊(實作)

手把手教你使用Node.js進行TCP網路通訊(實作)

青灯夜游
青灯夜游轉載
2021-09-24 10:28:047743瀏覽

如何使用Node.js進行TCP網路通訊?以下這篇文章就來帶大家去搞懂使用Node.js進行TCP網路通訊的方法,希望對大家有幫助!

手把手教你使用Node.js進行TCP網路通訊(實作)

摘要: 網路是通訊互聯的基礎,Node.js提供了net、http、dgram等模組,分別用來實作TCP、HTTP、UDP的通信,本文主要對使用Node.js的TCP通信部進行實踐記錄。 【推薦學習:《nodejs 教學》】

#1、建置TCP伺服器

##1.1、使用Node.js建立TCP伺服器

為了使用Node.js建立TCP伺服器,首先要呼叫require('net')來載入net模組,然後呼叫net模組的createServer方法就可以輕鬆地建立一個TCP伺服器,語法格式如下:

net.createServer([options][, connectionListener])
options是一个对象参数值,有两个布尔类型的属性allowHalfOpen和pauseOnConnect。这两个属性默认都是false;
connectionListener是一个当客户端与服务端建立连接时的回调函数,这个回调函数以socket端口对象作为参数。

1.2、監聽客戶端的連線##使用TCP伺服器的listen方法就可以開始監聽客戶端的連接,語法格式如下:

server.listen(port[, host][, backlog][, callback]);
port:为需要监听的端口号,参数值为0的时候将随机分配一个端口号;
host:服务器地址;
backlog:连接等待队列的最大长度;
callback:回调函数。

以下程式碼可以建立一個TCP伺服器並監聽8001埠:

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    console.log('有新的客户端接入');
});
//设置监听端口
server.listen(8001, function () {
    console.log('服务正在监听中。。。')
});

執行這段程式碼,可以在控制台看到執行了listen方法的回呼函數,如圖所示:

手把手教你使用Node.js進行TCP網路通訊(實作)可以使用對應的TCP客戶端或偵錯工具來連接這個已經建立好的TCP伺服器。例如,要使用Windows的Telnet就可以用以下命令來連接:

telnet localhost 8001

連接成功後可以看到控制台打印了“有新的客戶端接入”字樣,表明createServer方法的回調函數已經執行,說明已經成功連接到這個創建好的TCP伺服器。

手把手教你使用Node.js進行TCP網路通訊(實作)server.listen()方法其實觸發的是server下的listening事件,所以也可以手動監聽listening事件,程式碼如下:

//设置监听端口
server.listen(8001);
//设置监听时的回调函数
server.on('listening', function () {
    console.log("服务正在监听中。。。")
});

除了listening事件外,TCP伺服器也支援以下事件:

connection:当有新的链接创建时触发,回调函数的参数为socket连接对象。
close:TCP服务器关闭的时候触发,回调函数没有参数。
error:TCP服务器发生错误的时候触发,回调函数的参数为error对象。

下列程式碼透過net.Server類別來建立TCP伺服器,新增以上事件:

//引入net模块
const net = require('net');
//实例化一个服务器对象
const server = new net.Server();
//监听connection事件
server.on('connection', function (socket) {
    console.log('有新的客户端接入');
});
//设置监听端口
server.listen(8001);
//设置监听时的回调函数
server.on('listening', function () {
    console.log('服务正在监听中。。。');
});
//设置关闭时的回调函数
server.on('close', function () {
    console.log('服务已关闭');
});
//设置出错时的回调函数
server.on('error', function (err) {
    console.log('服务运行异常', err);
});

#1.3、查看伺服器監聽的位址當建立了一個TCP伺服器後,可以透過server.address()方法來檢視這個TCP伺服器監聽的位址,並傳回一個JSON對象,因為這個方法回傳的是TCP伺服器監聽的位址訊息,所以應該在呼叫了server.listen()方法或綁定了事件listening中的回調函數中呼叫該方法。這個物件的屬性有:

port:TCP服务器监听的端口号;
family:说明TCP服务器监听的地址是IPv6还是IPv4;
address:TCP服务器监听的地址。

程式碼如下:

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    console.log('有新的客户端接入');
});
//设置监听端口
server.listen(8001);
//设置监听时的回调函数
server.on('listening', function () {
    //获取地址信息
    let address = server.address();
    //获取地址详细信息
    console.log("服务器监听的端口是:" + address.port);
    console.log("服务器监听的地址是:" + address.address);
    console.log("服务器监听的地址类型是:" + address.family);
});

運行結果如圖:

手把手教你使用Node.js進行TCP網路通訊(實作)

#1.4 、連接伺服器的客戶數量

建立一個TCP伺服器後,可以透過server.getConnections()方法取得連接這個TCP伺服器的客戶數量。這個方法是一個非同步的方法,回呼函數有兩個參數:

第一个参数为error对象。
第二个参数为连接TCP服务器的客户端数量。

除了取得連線數外,也可以透過設定TCP伺服器的maxConnections屬性來設定這個TCP伺服器的最大連線數。當連線數超過最大連線數的時候,伺服器將拒絕新的連線。如下程式碼設定這個TCP伺服器的最大連線數為3。

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    console.log('有新的客户端接入');
    //设置最大连接数量
    server.maxConnections = 3;
    server.getConnections(function (err, count) {
        console.log("当前连接的客户端个数为:" + count);
    });
});
//设置监听端口
server.listen(8001, function () {
    console.log("服务正在监听中。。。")
});

執行這段程式碼,並嘗試用多個客戶端連線。可以發現當客戶端連線數超過3的時候,新的客戶端就無法連接這個伺服器了,如圖所示:

手把手教你使用Node.js進行TCP網路通訊(實作)

1.5 、取得客戶端所傳送的資料

createServer方法的回呼函數參數是一個net.Socket物件(伺服器所監聽的連接埠物件),這個物件同樣也有一個address()方法,用來取得TCP伺服器綁定的位址,同樣也是傳回一個含有port、family、address屬性的物件。透過socket物件可以獲取客戶端發送的流數據,每次接收到數據的時候觸發data事件,透過監聽這個事件就可以在回調函數中獲取客戶端發送的數據,代碼如下:

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    //监听data事件
    socket.on("data", function (data) {
        //打印数据
        console.log("接收到数据:" + data.toString());
    });
});
//设置监听端口
server.listen(8001, function () {
    console.log("服务正在监听中。。。")
});

測試結果如下:

socket物件除了有data事件外,還有connect、end、error、timeout等事件。 手把手教你使用Node.js進行TCP網路通訊(實作)

1.6、傳送資料給客戶端

#

调用socket.write()可以使TCP服务器发送数据,这个方法只有一个必需参数,就是需要发送的数据;第二个参数为编码格式,可选。同时,可以为这个方法设置一个回调函数。当有用户连接TCP服务器的时候,将发送数据给客户端,代码如下:

//引入net模块
const net = require('net');
//创建TCP服务器
const server = net.createServer(function (socket) {
    //设置消息内容
    const message = "Hello Client......";
    //发送数据
    socket.write(message, function () {
        const writeSize = socket.bytesWritten;
        console.log("数据发送成功,数据长度为:" + writeSize);
    });

    //监听data事件
    socket.on("data", function (data) {
        const readSize = socket.bytesRead;
        //打印数据
        console.log("接收到数据为:" + data.toString(), ";接收的数据长度为:" + readSize);
    });
});
//设置监听端口
server.listen(8001, function () {
    console.log("服务正在监听中。。。")
});

测试结果如下:

手把手教你使用Node.js進行TCP網路通訊(實作)

在上面这段代码中还用到了socket对象的bytesWritten和bytesRead属性,这两个属性分别代表着发送数据的字节数和接收数据的字节数。除了上面这两个属性外,socket对象还有以下属性:

socket.localPort:本地端口的地址;
socket.localAddress:本地IP地址;
socket.remotePort:进程端口地址;
socket.remoteFamily:进程IP协议族;
socket.remoteAddress:进程IP地址。

2、构建TCP客户端

Node.js在创建一个TCP客户端的时候同样使用的是net(网络)模块。

2.1、使用Node.js创建TCP客户端

为了使用Node.js创建TCP客户端,首先要调用require(‘net’)来加载net模块。创建一个TCP客户端只需要创建一个连接TCP客户端的socket对象即可:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();

创建一个socket对象的时候可以传入一个json对象。这个对象有以下属性:

fd:指定一个存在的文件描述符,默认值为null;
readable:是否允许在这个socket上读,默认值为false;
writeable:是否允许在这个socket上写,默认值为false;
allowHalfOpen:该属性为false时,TCP服务器接收到客户端发送的一个FIN包后,将会回发一个FIN包;该属性为true时,TCP服务器接收到客户端发送的一个FIN包后不会回发FIN包。

2.2、连接TCP服务器

创建了一个socket对象后,调用socket对象的connect()方法就可以连接一个TCP服务器,代码如下:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();
//设置连接的服务器
client.connect(8001, '127.0.0.1', function () {
    console.log("连接服务器成功");
});

连接成功如下图所示:

手把手教你使用Node.js進行TCP網路通訊(實作)

2.3、获取从TCP服务器发送的数据

socket对象有data、error、close、end等事件,因可以通过监听data事件来获取从TCP服务器发送的数据,代码如下:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();
//设置连接的服务器
client.connect(8001, '127.0.0.1', function () {
    console.log("连接服务器成功");
});
//监听data事件
client.on("data", function (data) {
    //打印数据
    console.log("接收到数据为:" + data.toString());
});

先启动TCP服务端,再运行上面客户端,可以发现命令行中已经输出了来自服务端的数据,说明此时已经实现了服务端和客户端之间的通信:

手把手教你使用Node.js進行TCP網路通訊(實作)

2.4、向TCP服务器发送数据

因为TCP客户端是一个socket对象,所以可以使用以下代码来向TCP服务器发送数据:

//引入net模块
const net = require('net');
//创建TCP客户端
const client = new net.Socket();
//设置连接的服务器
client.connect(8001, '127.0.0.1', function () {
    console.log("连接服务器成功");
    //给服务端发送数据
    client.write("Hello Server......");
});
//监听data事件
client.on("data", function (data) {
    //打印数据
    console.log("接收到数据为:" + data.toString());
});
//监听end事件
client.on("end", function () {
    console.log("客户端发送数据结束")
});

客户端控制台输出:

手把手教你使用Node.js進行TCP網路通訊(實作)

服务端控制台输出:

手把手教你使用Node.js進行TCP網路通訊(實作)

至此使用Node.js进行TCP网络通信完成,如有不对的地方欢迎指正。

原文地址:https://bbs.huaweicloud.com/blogs/300544?utm_source=juejin&utm_medium=bbs-ex&utm_campaign=other&utm_content=content

作者:lwq1228

更多编程相关知识,请访问:编程视频!!

以上是手把手教你使用Node.js進行TCP網路通訊(實作)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:华为云社区。如有侵權,請聯絡admin@php.cn刪除