写点什么

一文搞懂如何使用 Node.js 进行 TCP 网络通信

发布于: 1 小时前

​​​​​​摘要: 网络是通信互联的基础,Node.js 提供了 net、http、dgram 等模块,分别用来实现 TCP、HTTP、UDP 的通信,本文主要对使用 Node.js 的 TCP 通信部份进行实践记录。


本文分享自华为云社区《一文搞懂如何使用Node.js进行TCP网络通信》,作者:lwq1228 。

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 方法的回调函数,如图所示:



可以使用相应的 TCP 客户端或者调试工具来连接这个已经创建好的 TCP 服务器。例如,要使用 Windows 的 Telnet 就可以用以下命令来连接:


telnet localhost 8001
复制代码


连接成功后可以看到控制台打印了“有新的客户端接入”字样,表明 createServer 方法的回调函数已经执行,说明已经成功连接到这个创建好的 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);});
复制代码


运行结果如图:



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 的时候,新的客户端就无法连接这个服务器了,如图所示:



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 等事件。

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("服务正在监听中。。。")});
复制代码


测试结果如下:



在上面这段代码中还用到了 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("连接服务器成功");});
复制代码


连接成功如下图所示:



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 服务端,再运行上面客户端,可以发现命令行中已经输出了来自服务端的数据,说明此时已经实现了服务端和客户端之间的通信:



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 网络通信完成,如有不对的地方欢迎指正。


点击关注,第一时间了解华为云新鲜技术~

发布于: 1 小时前阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
一文搞懂如何使用Node.js进行TCP网络通信