首页 > Web开发 > 详细

nodejs网络开发

时间:2020-02-19 15:33:51      阅读:69      评论:0      收藏:0      [点我收藏+]

 

本文是关于node.js的网络开发

 

一、服务端和客户端通信demo

 

使用nodejs中的net模块和dgram模块,实现TCP和UDP的服务端和客户端之间的通信demo

 

??nodejs_network.zip

 

有几个注意点:

 

1. allowHalfOpen:属性为false,服务器接收到客户端发送的FIN包,将回发一个FIN包;

属性为true,服务器接收到客户端发送的FIN包,将不会回发一个FIN包,因此用户需要手动调用end()显式地结束这个连接。

 

2. TCP client 没有close()方法,只有close()事件

 

二、探索服务端和客户端同名事件是如何调用

 

探索net模块中server和socket都有的同名事件(end和close),两者之间是如何调用的?

  

服务器:

 1 // test_server.js
 2 
 3 let net = require(‘net‘);
 4 let tcpServer1 = net.createServer();
 5 
 6 tcpServer1.on(‘listening‘, ()=>{
 7     console.log(‘开始监听‘);
 8 });
 9 
10 tcpServer1.on(‘connection‘, (socket)=>{
11     console.log(‘连接已建立‘ + ‘\n‘);
12     tcpServer1.getConnections((err, count)=>{
13         if(err){
14             console.warn(err);
15         } else {
16             console.log(`当前有${count}个连接`);
17         }
18     });
19     socket.on(‘data‘, (data)=>{
20         console.log(data.toString());
21     });
22     socket.on(‘error‘, (err)=>{
23         console.warn(err);
24         socket.destroy();
25     });
26     socket.on(‘end‘, ()=>{
27         tcpServer1.close();
28     });
29 });
30 tcpServer1.on(‘close‘, ()=>{
31     console.log(‘closed‘);
32 });
33 tcpServer1.listen(2000);

 

 

客户端1:

 1 // tcp_client.js
 2 
 3 var net = require(‘net‘);
 4 var readline = require(‘readline‘);
 5 
 6 /** readline 实现输入输出 */
 7 var rl = readline.createInterface({
 8     input: process.stdin,
 9     output: process.stdout
10 });
11 
12 /** 创建 TCP 客户端 */
13 var client = net.Socket();
14 
15 /** 连接 TCP 服务器 */
16 client.connect(2000, ‘127.0.0.1‘, function () {
17     console.log(‘connect the server...‘);
18 
19     /** 向服务器发送消息 */
20     rl.on(‘line‘, function (input) {
21         client.write(input, function () {
22             console.log(‘client: ‘ + input);
23         });
24     });
25 });
26 
27 /** 接收服务器发送的数据 */
28 client.on(‘data‘, function (data) {
29     console.log(‘server:‘ + data);
30 });

 

客户端2:

 1 // test_client.js
 2 
 3 let net = require(‘net‘);
 4 
 5 let client = new net.Socket();
 6 
 7 client.connect(2000, ‘localhost‘, ()=>{
 8     console.log(‘已连接到服务器‘);
 9     client.write(‘test‘);
10     client.end(‘bye‘);
11 });
12 
13 client.on(‘data‘, (data)=>{
14     console.log(‘接收到数据:‘);
15     console.log(data.toString());
16 });
17 
18 client.on(‘error‘, (err)=>{
19     console.warn(err);
20     client.destory();
21 });
22 
23 client.on(‘end‘, ()=>{
24     console.log(‘ended‘);
25 });
26 
27 client.on(‘close‘, ()=>{
28     console.log(‘finally closed‘);
29 });

 

1. 启动TCP服务器

 

2. 启动TCP客户端1,连接到服务器,服务器显示“当前有1个连接”

 

技术分享图片

 

3. 启动TCP客户端2,连接到服务器,服务器显示“当前有2个连接”。客户端2发送数据(test),并手动调用end()显式地结束连接,最后关闭连接,客户端2显示“ended”和“finally closed”

 

技术分享图片

 

4. 关闭TCP客户端1,服务器显示两个“closed”

 

技术分享图片

 

为什么显示两个"closed"?

 

 

服务器改为:

 

技术分享图片

 

 

添加客户端3:

 

代码和客户端1相同,tcp_client/tcp_client1代码相同

 

还是返回两个“close”:

 

技术分享图片

 

 

添加客户端4:

 

代码和客户端1相同,tcp_client/tcp_client1/tcp_client2代码相同

 

还是返回两个“close”:

 

技术分享图片

 

 

nodejs官方文档:close方法执行后,服务器将不会接受任何新增的连接,但仍会保证现有的连接。而服务器将会在所有连接都终止之后被关闭。

 

根据上面测试的结果,我推测:是因为客户端4和服务器本身的两个连接。(推测结果待定!!!!)

 

当我们手动关闭客户端4时,会调用server中socket.on(‘end‘),打印出“111”,再执行

tcpServer1.close(),输出前面一个“closed”,而后面一个是关闭服务器自身的连接,再打印出“closed”。

 

(完)

 

nodejs网络开发

原文:https://www.cnblogs.com/yqyan/p/12331294.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!