• 使用的模块

    • 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. node.js代码

    // 1. 引入 express var express = require('express'); var formidable = require('formidable'); var mysql ...

  2. tornado自定义实现django include方法

    tornado自定义实现django  include方法 自定义URLmethod模块 from Custom.errors import * def include(base_url, expan ...

  3. cookie、session、csrf

    cookie的设置和获取 import time from tornado.web import RequestHandler class IndexHandle(RequestHandler): d ...

  4. Python爬虫系列(一):从零开始,安装环境

    在上一个系列,我们学会使用rabbitmq.本来接着是把公司的celery分享出来,但是定睛一看,celery4.0已经不再支持Windows.公司也逐步放弃了服役多年的celery项目.恰好,公司找 ...

  5. 一、Python3.8的安装

    一:什么是Python解释器 解释器(英语:Interpreter),又译为直译器,是一种电脑程序能够把高级编程语言一行一行直接转译运行. 解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运 ...

  6. 最短路变短了 (思维+反向djstrea)

    题解:设有一条边x->y,数组dis1[i]表示从1到i的最短距离,dis2[i]表示从n到i的最短距离. 1 如果说将x->y反向之前没有经过x->y,但是反向后我经过了x,y说明 ...

  7. Mark down 使用总结

    Markdown语法 Markdown是一种纯文本.轻量级的标记语言,通过简单的标记,就可以使文本具有一定的格式,操作简单.使用广泛,常见的比如github上的README.md . Markdown ...

  8. 常用ElasticSearch 查询语句

    为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(摘要), publish_date(发布 ...

  9. UML 建模工具的安装与使用

    一. 实验目的1) 学习使用 EA(Enterprise Architect) 开发环境创建模型的一般方法: 2) 理解 EA 界面布局和元素操作的一般技巧: 3) 熟悉 UML 中的各种图的建立和表 ...

  10. IIS WebDAV安全配置

    本文为转载,原文地址:http://www.2cto.com/article/201307/228165.html IIS WebDAV安全配置 2013-07-16 12:13:00 作者:瞌睡龙收 ...