• 使用的模块

    • 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代理机制的更多相关文章

  1. nodejs+mongoose+websocket搭建xxx聊天室

    简介 本文是由nodejs+mongoose+websocket打造的一个即时聊天系统:本来打算开发一个类似于网页QQ类似功能的聊天系统,但是目前只是开发了一个模块功能 --- 类似群聊的,即一对多的 ...

  2. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  3. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  4. Atitit事件代理机制原理 基于css class的事件代理

    Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...

  5. java Proxy(代理机制)

    我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习 ...

  6. 学习AOP之JAVA的代理机制

    从一个输出日志的实例分析JAVA的代理机制 一.通用的日志输出方法  :需要在每个类里都增加对输出日志信息的代码 二.通过面向接口编程实现日志的输出(JAVA的静态代理):虽然实现了业务逻辑与输出日志 ...

  7. aop测试jdk代理机制

    //测试jdk代理机制 @Test public void testProxy(){ final UsbDisk usbDisk = new UsbDisk(); //类加载器,接口,匿名内部类 // ...

  8. java中的动态代理机制

    java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...

  9. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

随机推荐

  1. 自动生成四则运算题目(C语言)

    Github项目地址:https://github.com/huihuigo/expgenerator 合作者:马文辉(3118005015).卢力衔(3118005013) 项目简介 1题目:实现一 ...

  2. 37.3 net--TcpDemo1 大小写转换

    需求:使用TCP协议发送数据,并将接收到的数据转换成大写返回 启动方式:先打开服务端,再打开客户端 客户端 package day35_net_网络编程.tcp传输; import java.io.I ...

  3. Linux知识再回顾

    Linux再回顾 下面是自己之前centos7的笔记总结第二篇,第一篇是19年就写过了一些,记住Linux中一切皆文件. 这里提下,使用xshell+xftp来使用云服务器是很不错的,强烈建议小伙伴这 ...

  4. 高德APP启动耗时剖析与优化实践(iOS篇)

    前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为用户省下的时间,还 ...

  5. Python 小技之实现的鲜花盛宴,你准备好了吗?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:派森酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  6. 发现一款手绘可视化神器!Python绘图还在用Matplotlib?out了 !

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

  7. 12. 前后端联调 + ( proxy代理 ) + ( axios拦截器 ) + ( css Modules模块化方案 ) + ( css-loader ) + ( 非路由组件如何使用history ) + ( bodyParser,cookieParser中间件 ) + ( utility MD5加密库 ) + ( nodemon自动重启node ) + +

    (1) proxy 前端的端口在:localhost:3000后端的端口在:localhost:1234所以要在webpack中配置proxy选项 (proxy是代理的意思) 在package.jso ...

  8. [Python进阶].pyc的那点事

    1. 什么是 .pyc文件 .pyc文件 就是 Python的字节码(byte-compiled)文件..py文件运行时,python会自动将其编译成PyCodeObject并写入.pyc文件,再有p ...

  9. Python selenium Chrome正在受到自动软件的控制 disable-infobars无效 的解决方法

    问题解决 前两天更新了google浏览器版本,今天运行以前的脚本,发现options一个参数的配置不生效了. 运行了几次都发现该参数没有生效,也检查了自己的代码参数,没有写错,于是就有了这一波“网中寻 ...

  10. web--ajax--json

    案例: 其中,用eval()解析的话,如果json有一些代码,如:{"age":"alert(你好)"},他也会帮你实行,而JOSN.parse();则会自动报 ...