• 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

  • 相关阅读:
    ASP.NET AJAX Progress Bar Control(转)
    asp.net 页面右下角弹出类似QQ或MSN的消息提示
    用31个免费在线工具来测试你网站各项性能
    HtmlTextWriter学习<转>
    .NET企业级应用架构设计系列之应用服务器
    .NET企业级应用架构设计系列之开场白
    Asp.Net应用程序中长时间装载页面时显示进度条
    用JavaScript操作数据库
    UML类图关系全面剖析
    Microsoft® Visual SourceSafe® 6.0 标准版 简介下载
  • 原文地址:https://www.cnblogs.com/xiami2046/p/12678421.html
Copyright © 2020-2023  润新知