zoukankan      html  css  js  c++  java
  • 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()} 
    `);
            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);
    

      

  • 相关阅读:
    前端JS的服务订阅&服务发布
    身份证号码校验解释
    基于密码强度检测算法分析及实现
    身份证号码的正则表达式
    如何安装 Sublime text 编辑器相关的插件
    关于GatewayClient 介绍和使用
    GatewayWorker与ThinkPHP等框架结合
    如何知道使用的GatewayWorker版本号?
    Hibernate HQL
    Hibernate 一对一
  • 原文地址:https://www.cnblogs.com/jkko123/p/10247593.html
Copyright © 2011-2022 走看看