NodeJS实现websocket代理机制

匿名 (未验证) 提交于 2019-12-02 21:53:52
  • 使用的模块
    • 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

转载请标明出处:NodeJS实现websocket代理机制
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!