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

  • 相关阅读:
    0-1性能测试需求分析
    1-10jmeter关联,正则表达式(待巩固)
    1-9jmeter集合点,并发操作
    1-8.jmeter设置断言(检查点)
    1-6jmeter性能测试基础
    泛型中的协变和逆变
    jsPlumb
    jQuery UI vs Kendo UI & jQuery Mobile vs Kendo UI Mobile
    31天重构
    Visual Studio 小工具
  • 原文地址:https://www.cnblogs.com/zhanghuizong/p/8821798.html
Copyright © 2011-2022 走看看