• 使用的模块

    • 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. thinkphp后端开发ajax接口开发测试

    数据自动填充,Firefox的网络查看JSON数据,查错. 同时,用getLastSql函数查询,并且开启日志文件记录网页执行的全过程,还可以用thinkPHP内置的trace的跟踪. 谁有更好地方法 ...

  2. MyBatis(二):基础CRUD

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

  3. 让我来教你如何免费使用RHEL小红帽系统

    RHEL安装注册过程中遇到的问题 从开始注册到正常使用 如何获取正版RHEL 注意事项 VMware虚拟机下载安装 安装中出现的问题 从开始注册到正常使用 答主是个动手能力比较强的人 ,所以当老师讲到 ...

  4. MTK Android 设置-选择日期格式 [管理和组织首选项,ListPreference,CheckBoxPreference,EditTextPreference,RingtonePreference]

    ###android.preference.ListPreference的一些特性 android:key  选项的名称或键 android:title  选项的标题 android:summary  ...

  5. (js描述的)数据结构[双向链表](5)

    (js描述的)数据结构[双向链表](5) 一.单向链表的缺点 1.只能按顺序查找,即从上一个到下一个,不能反过来. 二.双向链表的优点 1.可以双向查找 三.双向链表的缺点 1.结构较单向链表复杂. ...

  6. Linux bash篇(四 命令)

    1.一次执行多个命令        ; eg: ls -al ; touch data.txt 2.根据情况执行命令       &&     || cmd1 && c ...

  7. javascript入门 之 zTree (一)

    1.安装: 我用的bower工具,所以执行: bower install ztree 2.详细功能与配制,请考官方文档: http://www.treejs.cn/v3/main.php#_zTree ...

  8. bootstrapTable随机改变列颜色

    { title: '运单编号', field: 'waybillNumber', align: 'center', valign: 'middle', cellStyle: function (val ...

  9. 同事上班时间无聊,用python敲出贪吃蛇游戏打发时间

    自从学会啦python,再也不用担心上班时间老板发现我打游戏啦 贪吃蛇代码: 还有不懂的(https://www.ixigua.com/i6808019824560570888/)这里有视频教程. 如 ...

  10. L7过拟合欠拟合及其解决方案

    1.涉及语句 import d2lzh1981 as d2l 数据1 : d2lzh1981 链接:https://pan.baidu.com/s/1LyaZ84Q4M75GLOO-ZPvPoA 提取 ...