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

时间: 2019-01-10阅读: 226标签: node

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);

来自:https://www.cnblogs.com/jkko123/p/10247593.html


深入解析Node.js Stream ondata触发时机与顺序

今天小编就为大家分享一篇关于Node.js Stream ondata触发时机与顺序的探索,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。

Node编码规范

采用2个空格缩进,而不是tab缩进。空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同。2个空格会让代码看起来紧凑、明快。永远用var声明变量,不加var时会将其变为全局变量,这样可能会意外污染上下文,或是被意外污染。

Node.js创建服务器和模拟客户端请求

服务器是某种长期运行,等待请求资源的应用程序,Web服务器是使用HTTP协议,等待客户端连接后请求资源的驻守应用程序;HTTP协议是应用层的协议,在传输层依然是使用TCP或者UDP协议

解决mac上每次升级nodejs都要重新安装扩展包的问题

以前用起来没注意到这个现象,最近一段时间发现,每次随着使用brew upgrade自动升级了nodejs版本,原来安装的nodejs扩展包就不起作用了,还需要重新安装一遍。再加上一些扩展包存储网站被墙的问题,这个过程真是令人痛不欲生

YodaOS:一个属于 Node.js 社区的操作系统

YodaOS 的架构跟 Android 类似,YodaOS 是 Rokid 研发的首个全栈开源 AI 操作系统,由 Linux 内核、硬件抽象层、AI 抽象层和 JavaScript 框架组成,专为下一代人机交互设备开发,可用于智能音箱、智能家居、智能穿戴和车载等多种设备和场景。

安装nvm管理不同的node版本

在工作或者学习中,偶尔会遇到需要切换不同node版本的需求,幸好有神器nvm可以帮我们解决问题。下面我们就来讲解如何在window系统上安装nvm! 第一步,当然要下载nvm啦,传送门,目前最新的版本是1.17,注意,笔者下载的是nvm-noinstall.zip的压缩文件

node.js+react.js+xterm.js构建webssh

先讲一下简单的原理:前端和后端的通信,使用的是socket.js,后端连接服务器,使用的是ssh2.js,页面显示出控制台这个操作页面,使用的是xterm.js。整个工作流程就是:前端在xterm.js里面输入文字,通过socket和后端通信

Nodejs ORM框架Sequelize快速入门

什么是ORM?简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全、可维护的SQL代码。什么是Sequelize?Sequelize是一款基于Nodejs功能强大的异步ORM框架。

Ubuntu 上 Node.js 安装和卸载

Ubuntu 安装 Node.Js:执行检查可更新的软件,先用普通的apt工具安装低版本的node,然后再升级最新。更换淘宝的镜像,这个是必须的,用过的node的人都知道。安装更新版本的工具N

使用pkg打包Node.js应用的方法步骤

Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++、Java这类编译型应用部署方便。然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Node.js

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全