本文是关于node.js的网络开发
使用nodejs中的net模块和dgram模块,实现TCP和UDP的服务端和客户端之间的通信demo
有几个注意点:
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”。
(完)
原文:https://www.cnblogs.com/yqyan/p/12331294.html