关于node.js:一文搞懂如何使用Nodejs进行TCP网络通信

摘要: 网络是通信互联的根底,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网络通信实现,如有不对的中央欢送斧正

点击关注,第一工夫理解华为云陈腐技术~

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理