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

      

  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/jkko123/p/10247593.html
Copyright © 2011-2022 走看看