首页>>前端>>Node->一文搞懂如何使用Node.js进行TCP网络通信

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

时间:2023-11-29 本站 点击:1

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

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模块constnet=require('net');//创建TCP服务器constserver=net.createServer(function(socket){console.log('有新的客户端接入');});//设置监听端口server.listen(8001,function(){console.log('服务正在监听中。。。')});

运行这段代码,可以在控制台看到执行了listen方法的回调函数,如图所示:

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

telnetlocalhost8001

连接成功后可以看到控制台打印了“有新的客户端接入”字样,表明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模块constnet=require('net');//实例化一个服务器对象constserver=newnet.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模块constnet=require('net');//创建TCP服务器constserver=net.createServer(function(socket){console.log('有新的客户端接入');});//设置监听端口server.listen(8001);//设置监听时的回调函数server.on('listening',function(){//获取地址信息letaddress=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。

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

运行这段代码,并尝试用多个客户端连接。可以发现当客户端连接数超过3的时候,新的客户端就无法连接这个服务器了,如图所示:

1.5、获取客户端发送的数据

createServer方法的回调函数参数是一个net.Socket对象(服务器所监听的端口对象),这个对象同样也有一个address()方法,用来获取TCP服务器绑定的地址,同样也是返回一个含有port、family、address属性的对象。通过socket对象可以获取客户端发送的流数据,每次接收到数据的时候触发data事件,通过监听这个事件就可以在回调函数中获取客户端发送的数据,代码如下:

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

测试结果如下:

socket对象除了有data事件外,还有connect、end、error、timeout等事件。

1.6、发送数据给客户端

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

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

测试结果如下:

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

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

2、构建TCP客户端

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

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

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

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

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

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

2.2、连接TCP服务器

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

server.listen(port[,host][,backlog][,callback]);port:为需要监听的端口号,参数值为0的时候将随机分配一个端口号;host:服务器地址;backlog:连接等待队列的最大长度;callback:回调函数。4//设置连接的服务器client.connect(8001,'127.0.0.1',function(){console.log("连接服务器成功");});

连接成功如下图所示:

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

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

server.listen(port[,host][,backlog][,callback]);port:为需要监听的端口号,参数值为0的时候将随机分配一个端口号;host:服务器地址;backlog:连接等待队列的最大长度;callback:回调函数。4//设置连接的服务器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服务器发送数据:

server.listen(port[,host][,backlog][,callback]);port:为需要监听的端口号,参数值为0的时候将随机分配一个端口号;host:服务器地址;backlog:连接等待队列的最大长度;callback:回调函数。4//设置连接的服务器client.connect(8001,'127.0.0.1',function(){console.log("连接服务器成功");//给服务端发送数据client.write("HelloServer......");});//监听data事件client.on("data",function(data){//打印数据console.log("接收到数据为:"+data.toString());});//监听end事件client.on("end",function(){console.log("客户端发送数据结束")});

客户端控制台输出:

服务端控制台输出:

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Node/909.html