zoukankan      html  css  js  c++  java
  • NodeJS实现websocket代理机制

    • 使用的模块
      • ws
      • http
      • http-proxy
    • 主要通过htt-proxy实现中转

    • 启动websocket服务
    var WebSocketServer = require('ws').Server;
    var wss             = new WebSocketServer({port: 6443});
    
    console.log(6443);
    wss.on('connection', function connection(ws) {
        ws.on('message', function incoming(message) {
            console.log('received: %s', message);
            ws.send(message);
        });
    });
    
    wss.on('error', function (error) {
        console.log('error:', error);
    });
    • 启动http-proxy代理服务器

      注意:客户端发送的数据websocket已加密无法直接获得,该演示通过ws模块中的PerMessageDeflate实现解密。黄色区域代码请自行调整

    const http              = require('http');
    const httpProxy         = require('http-proxy');
    const ws                = require('ws');
    const Receiver          = ws.Receiver;
    const Extensions        = ws.Extensions;
    const PerMessageDeflate = ws.PerMessageDeflate;
    const proxy             = new httpProxy.createProxyServer({target: 'ws://localhost:6443', ws: true});
    const proxyServer       = http.createServer(function(req, res) {
        proxy.web(req, res);
    });
    
    proxyServer.on('upgrade', function(req, socket, head) {
        let extensions        = {};
        let perMessageDeflate = new PerMessageDeflate({}, true);
        let serverExtensions  = Extensions.parse(req.headers['sec-websocket-extensions']);
        perMessageDeflate.accept(serverExtensions[PerMessageDeflate.extensionName]);
        extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
        let _receiver                               = new Receiver(extensions, 0);
    
        socket.on('data', function(data) {
            _receiver.add(data);
        });
    
        _receiver.ontext = function ontext(data, flags) {
            console.log('客户端请数据:', data);
        };
    
        _receiver.onclose = function onclose(code, data, flags) {
            console.log('onclose:', data);
        };
    
        _receiver.onerror = function onerror(reason, errorCode) {
            console.log('onerror:', reason);
        };
    
        proxy.ws(req, socket, head);
    });
    
    proxyServer.on('error', function(error) {
        console.log('error:', error);
    });
    
    proxy.on('open', function(proxySocket) {
        let extensions        = {};
        let perMessageDeflate = new PerMessageDeflate({}, true);
        let serverExtensions  = Extensions.parse(proxySocket._httpMessage._headers['sec-websocket-extensions']);
        perMessageDeflate.accept(serverExtensions[PerMessageDeflate.extensionName]);
        extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
        let _receiver                               = new Receiver(extensions, 0);
    
        proxySocket.on('data', function(data) {
            _receiver.add(data);
        });
    
        _receiver.ontext = function ontext(data, flags) {
            console.log('代理服务器返回数据:', data);
        };
    });
    
    proxyServer.listen(8080);
    • 代理服务器日志:

        客户端请数据: 222222

        代理服务器返回数据: 222222

        客户端请数据: client----1

        代理服务器返回数据: client----1

        客户端请数据: client----2

        代理服务器返回数据: client----2

  • 相关阅读:
    【题解】Killer Names($O(nlog n)$做法)
    【瞎讲】类欧几里得入土教程
    【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
    【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
    【题解】LOJ6060 Set(线性基)
    【题解】CF1056F Write the Contest(三分+贪心+DP)
    【题解】多少个$1$(exBSGS)
    【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
    【题解】P1373 小a和uim之大逃离
    【题解】地精部落(DP)
  • 原文地址:https://www.cnblogs.com/zhanghuizong/p/8821798.html
Copyright © 2011-2022 走看看