node.js中net网络模块TCP服务端与客户端的使用
node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口。
一、创建服务器并监听端口
const net = require('net');
//创建一个tcp服务
//参数一表示创建服务的一些配置
//参数二表示 事件 'connection' 监听回调函数
let server = net.createServer({
//表示是否允许一个半开的TCP连接,默认为false
allowHalfOpen: false,
//一旦来了连接,是否暂停套接字,默认为false
pauseOnConnect: 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);
node.js中net网络模块TCP服务端与客户端的使用的更多相关文章
- 网络聊天室---node.js中net网络模块TCP服务端与客户端的使用
//1.简单创建 net服务器 // const net = require("net"); // const server = net.createServer((c)=> ...
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
[转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...
- 基于Select模型的Windows TCP服务端和客户端程序示例
最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...
- swoole创建TCP服务端和客户端
服务端: server.php <?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0 ...
- node.js中使用http模块创建服务器和客户端
node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- vertx 从Tcp服务端和客户端开始翻译
写TCP 服务器和客户端 vert.x能够使你很容易写出非阻塞的TCP客户端和服务器 创建一个TCP服务 最简单的创建TCP服务的方法是使用默认的配置:如下 NetServer server = ve ...
- C++封装的基于WinSock2的TCP服务端、客户端
无聊研究Winsock套接字编程,用原生的C语言接口写出来的代码看着难受,于是自己简单用C++封装一下,把思路过程理清,方便自己后续翻看和新手学习. 只写好了TCP通信服务端,有空把客户端流程也封装一 ...
随机推荐
- bootstrap modal 移除数据
有时业务需求,在弹出模态框时需要动态的展示,但是不做处理时,每次弹出的都是第一次的数据,所以需要监听模态框关闭,每次关闭需要先清除里面的数据. //监听弹页关闭 $("#myModal&qu ...
- DL服务器主机环境配置(ubuntu14.04+GTX1080+cuda8.0)解决桌面重复登录
DL服务器主机环境配置(ubuntu14.04+GTX1080+cuda8.0)解决桌面重复登录 前面部分是自己的记录,后面方案部分是成功安装驱动+桌面的正解 问题的开始在于:登录不了桌面,停留在重复 ...
- HBuilder后台保活开发(后台自动运行,定期记录定位数据)
http://ask.dcloud.net.cn/question/28090 后台自动运行,定期记录定位数据 分类:HTML5+ 各位新年好 小弟以前用hbuilder开发过几个项目,现在有一新 ...
- 20175311 2018-2019-2 《Java程序设计》第1周学习总结
教材学习内容总结 第一周我们主要尝试了怎么安装各种以后可能需要用到的软件,根据老师提供的博客教程进行自主学习安装软件,然后编写一些简单的语言程序. 教材学习中的问题和解决过程 问题1:在学习过程中主要 ...
- MySQL架构之 主从+ProxySQL实现读写分离
准备服务器: docker run -d --privileged -v `pwd`/mysql_data:/data -p 3001:3306 --name mysql5-master --host ...
- MySQL安全机制 DDL DCL
一.MySQL用户管理 1. 修改用户密码 ===root修改自己密码=== 方法一: # mysqladmin -uroot -p'123' password 'new_password' //12 ...
- (dev mode) install CONSUL on ubuntu
WSL: V18.04.1 1. install $sudo apt-get update$sudo apt-get install consul wsl1017@DESKTOP-14G6K9S:~$ ...
- MAC地址表、ARP缓存表以及路由表
一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...
- Python全栈开发记录_第一篇(循环练习及杂碎的知识点)
Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...
- gentoo emacs 中文输入法 呼出
最近在另外一台电脑上面安装 gentoo和 emacs,但是碰到奇怪的问题,在旧电脑上面,可以使用 ctrl + space 呼出输入法,而新电脑只能触发 复制功能. 经过在网上查找和两台电脑之间的对 ...