node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口。

一、创建服务器并监听端口

const net = require('net');//创建一个tcp服务
//参数一表示创建服务的一些配置
//参数二表示 事件 'connection' 监听回调函数
let server = net.createServer({//表示是否允许一个半开的TCP连接,默认为falseallowHalfOpen: false,//一旦来了连接,是否暂停套接字,默认为falsepauseOnConnect: false
});server.listen(6666);//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {//注意这里的socket是一个流,既可以读,也可以写//当我们监听 'data' 事件后,系统就会不断的从流中读取数据socket.on('data', function (data) {console.log('服务器接收到 : ', data.toString());});
});//服务调用 server.listen() 监听后就会触发该事件
server.on('listening', function () {// address() 方法返回服务器地址信息对象let addr = server.address();console.log(`服务器监听 : ${addr.port} 端口`);
});//服务关闭时触发,如果还有连接存在,则直到所有连接结束才会触发该事件
server.on('close', function () {console.log('服务关闭');
});//出现错误时触发
server.on('error', function (err) {console.log(err);
});

windows下可以通过telnet 或 xshell,putty等工具连接上该服务,进行交互。

我们可以通过 getConnections() 实时获取当前服务器的连接数。

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});socket.on('data', function (data) {console.log('服务器接收到 : ', data.toString());});
});

我们可以手动的设置服务器的最大连接数,如果超过该连接数,则会拒绝连接。

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');//设置最大连接数为3,当有第4个连接请求时,连接会拒绝。server.maxConnections = 3;
});//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});socket.on('data', function (data) {console.log('服务器接收到 : ', data.toString());});
});

我们也可以使用 close() 手动的拒绝所有连接请求,当已连接的客户端都关闭后,则服务器会自动关闭,并触发 'close' 事件。

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});socket.on('data', function (data) {console.log('服务器接收到 : ', data.toString());});
});server.on('close', function () {console.log('服务器被关闭');
});//5秒后手动关闭服务器,拒绝所有连接请求,已有连接全部关闭后,触发 'close' 事件
setTimeout(function () {server.close();
}, 5000);

调用 unref() 后,则当所有客户端连接关闭后,将关闭服务器。ref() 功能与 unref() 相反。

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});socket.on('data', function (data) {console.log('服务器接收到 : ', data.toString());});socket.on('close', function () {console.log('客户端关闭');//调用unref()后,当所有客户端连接都关闭后,将关闭服务器server.unref();});
});server.on('close', function () {console.log('服务器关闭');
});

  

二、net.Socket是一个socket端口对象,是一个全双工的可读可写流

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});console.log('客户端信息 : ', socket.address());//接收到数据时触发socket.on('data', function (data) {//我们可以从流中读取数据console.log('服务器接收到 : ', data.toString());console.log('累计接收的数据大小 : ', socket.bytesRead);console.log('累计发送的数据大小 : ', socket.bytesWritten);//也可以向流中写入数据let flag = socket.write(`服务器向你发送 : ${data.toString()} \r\n`);console.log('flag : ', flag);console.log('当前已缓冲并等待写入流中的字节数 : ', socket.bufferSize);});//连接关闭时触发socket.on('end', function () {console.log('客户端关闭');});//连接完全关闭时触发socket.on('close', function () {console.log('客户端完全关闭');});//发生错误时触发socket.on('error', function (err) {console.log(err);});
});

我们可以通过 puase() 和 resume() 方法暂停读写数据。

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});//接收到数据时触发socket.on('data', function (data) {console.log('接收到的数据 : ', data.toString());setTimeout(function () {//3秒后暂停读取数据socket.pause();}, 3000);setTimeout(function () {//6秒后恢复读取数据socket.resume();}, 6000);});
});

net.Socket对象是一个流,既然是流,那么我们可以通过 pipe() 方法建一个到文件的可写流,把从客户端接收的数据写入到一个文件中。

const net = require('net');
const fs = require('fs');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});let ws = fs.createWriteStream('./1.txt');server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});//接收到数据时触发socket.on('data', function (data) {console.log('接收到的数据 : ', data.toString());});//注意这里的第二个参数,设为 false。//每当有一个新的连接时,就会创建一个新的 socket 对象。//不然当第一个socket对象结束操作或关闭时,会自动关闭 ws 可写流。//后续的socket对象将无法往 ws 里写入数据。socket.pipe(ws, {end: false});socket.on('end', function () {console.log('客户端关闭');socket.unpipe(ws);});
});

通过 setTimeout() 我们可以设置一个连接活动的超时时间,当一个连接超时时,将触发 'timeout' 事件。

const net = require('net');let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {console.log('服务器监听开始');
});server.on('connection', function (socket) {//获取当前服务器的连接数server.getConnections(function (error, count) {console.log('当前服务器的连接数 : ', count);});//接收到数据时触发socket.on('data', function (data) {console.log('接收到的数据 : ', data.toString());});socket.setTimeout(3 * 1000);//连接超时后,并不会断开,需手动调用 end() 或 destroy() 来断开连接socket.on('timeout', function () {console.log('当前连接已超时');});
});

  

三、创建一个tcp客户端

const net = require('net');//创建一个tcp客户端
let client = new net.Socket();
client.connect({host: '127.0.0.1',port: 6666
});//客户端与服务器建立连接触发
client.on('connect', function () {client.write('你好服务器');
});//客户端接收数据触发
client.on('data', function (data) {console.log('服务器发送的数据 : ', data.toString());
});

客户端可以通过调用 end() 方法来主动关闭与服务端的连接。

const net = require('net');//创建一个tcp客户端
let client = new net.Socket();
client.connect({host: '127.0.0.1',port: 6666
});//客户端与服务器建立连接时触发
client.on('connect', function () {//往服务端写入数据client.write('你好服务器');
});//客户端接收数据时触发
client.on('data', function (data) {console.log('服务器发送的数据 : ', data.toString());
});setTimeout(function () {client.end();
}, 3000);

通过 setKeepAlive() 方法来禁用或启用长连接功能,防止时间过短而断开连接。setKeepAlive() 会发送一个空包,来保持通信。

const net = require('net');//创建一个tcp客户端
let client = new net.Socket();
client.connect({host: '127.0.0.1',port: 6666
});//设置连接保持
client.setKeepAlive(true, 3000);//客户端与服务器建立连接触发
client.on('connect', function () {client.write('你好服务器');
});//客户端接收数据触发
client.on('data', function (data) {console.log('服务器发送的数据 : ', data.toString());
});setTimeout(function () {client.end();
}, 3000);

  

转载于:https://www.cnblogs.com/jkko123/p/10247593.html

node.js中net网络模块TCP服务端与客户端的使用相关推荐

  1. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

  2. js ws 状态_node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

  3. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  4. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  5. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  6. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

  7. java BIO tcp服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  8. python学习随堂笔记—TCP服务端与客户端

    思想: 1. 客户端 向服务端 发起连接 2. 服务端 接到请求,双方建立连接 3. 客户端 向 服务端发消息 4. 服务端 应答客户端 5. 服务端 与客户端循环读写操作 6. 操作完成之后客户端发 ...

  9. .NET TCP服务端和客户端

    客户端 public class TcpClientHelper{/// <summary>/// 是否连接上/// </summary>public bool Connect ...

最新文章

  1. CDN监控系统(一)
  2. TensorFlow 中文文档 介绍
  3. 测试点4错的来:1029 旧键盘 (20分)
  4. CentOS7下安装Docker-Compose
  5. vue aplayer 进度条无法拖动_Vue-rideo-player视频播放插件的使用
  6. mysql 改表面_CSS表面(outline)是什么【html5教程】,CSS
  7. C++中使用set和unordered_set的find方法时遇到的小坑
  8. mysql 安装参考
  9. 带负荷测试要求二次最小电流_电流回路基础知识(15):带负荷测试
  10. 张清:心静,写在年末
  11. 【TWVRP】基于matlab A_star算法求解带时间窗和任务软时间窗多车场多车型车辆路径问题【含Matlab源码 1561期】
  12. r语言 转录本结构及丰度_生信人的R语言视频教程语法篇第三章:数行天下(4)R中的数据——从结构角度划分(数组)...
  13. C++中的模板(template)
  14. 国外十大在线支付服务网站
  15. USB3.0接口防静电及lay out设计
  16. Ubuntu16.04在4K显示器中,字体太小,进行调整
  17. 本地部署你的专属ChatGPT,不用想方设法翻墙了
  18. JSONPath库:使用类似Xpath的语法解析JSON数据
  19. 湖大计算机学院荣辉桂,湖大计算机专业学生能看病?人工智能3秒筛查糖尿病视网膜病变...
  20. 解决input框上下偏移问题

热门文章

  1. hibernate不能保存时分秒处理
  2. 帆软报表数据库配置及关系
  3. 李飞飞李佳“逆风翻盘”:谷歌全新AutoML产品发布,AI客服规模化商用
  4. 知乎要用AI打造智能社区,专治「答非所问」的瓦力机器人已上线
  5. PyTorch更新了:支持Windows,新增零维张量
  6. 谷歌AI相机Clips今发售,“贴身摄影师”抓拍每一刻欢乐
  7. SQL注入和XSS攻击的原理
  8. TCP/IP基础总结性学习(2)
  9. python3.5 opencv3显示视频fps
  10. EL表达式、 jstl标签