nodejs 转发websocket (websocket proxy)
const http = require('http')
const server = http.createServer((req, res) =>{
res.end('hello world');
}).listen(8080)
server.on('upgrade', (req, client, head) => {
const headers = _getProxyHeader(req.headers) //将客户端的websocket头和一些信息转发到真正的处理服务器上
headers.hostname = 'localhost'//目标服务器
headers.path = '/' 目标路径
headers.port = 6443
const proxy = http.request(headers) //https可用https,headers中加入rejectUnauthorized=false忽略证书验证
proxy.on('upgrade', (res, socket, head) => {
client.write(_formatProxyResponse(res))//使用目标服务器头信息响应客户端
client.pipe(socket)
socket.pipe(client)
})
proxy.on('error', (error) => {
client.write("Sorry, cant't connect to this container ")
return
})
proxy.end()
function _getProxyHeader(headers) {
const keys = Object.getOwnPropertyNames(headers)
const proxyHeader = { headers: {} }
keys.forEach(key => {
if (key.indexOf('sec') >= 0 || key === 'upgrade' || key === 'connection') {
proxyHeader.headers[key] = headers[key]
return
}
proxyHeader[key] = headers[key]
})
return proxyHeader
}
function _formatProxyResponse(res) {
const headers = res.headers
const keys = Object.getOwnPropertyNames(headers)
let switchLine = '\r\n';
let response = [`HTTP/${res.httpVersion} ${res.statusCode} ${res.statusMessage}${switchLine}`]
keys.forEach(key => {
response.push(`${key}: ${headers[key]}${switchLine}`)
})
response.push(switchLine)
return response.join('')
}
})
暂时没有问题,如遇到欢迎指出。
nodejs 转发websocket (websocket proxy)的更多相关文章
- NodeJS反向代理websocket
如需转载请标明出处:http://blog.csdn.net/itas109QQ技术交流群:129518033 文章目录NodeJS反向代理websocket@[toc]前言代码相关问题:1.http ...
- 使用nginx作为websocket的proxy server
blog.csdn.net/zhx6044/article/details/50278765 WebSocket WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选 ...
- nodejs——js 实现webSocket 兼容移动端
nodejs——js 实现webSocket 兼容移动端 //服务器端 //npm install --save ws const express = require('express'); cons ...
- Spring Cloud Gateway转发Spring WebSocket
Spring Cloud Gateway转发Spring WebSocket 源码:https://github.com/naah69/SpringCloud-Gateway-WebSocket-De ...
- NodeJs 实现简单WebSocket 即时通讯
至于服务器语言选择nodeJs,一是因为自己是做前端的,对javascript比较熟悉,相比于其他后台语言,自然会更喜欢nodeJs了, 二是NodeJs本身事件驱动的方式很擅长与大量客户端保持高并发 ...
- 用nodejs快速实现websocket服务端(带SSL证书生成)
有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的 ...
- NodeJS client code websocket
var WebSocketClient = require('websocket').client; var client = new WebSocketClient(); client.on('co ...
- 如何实现从 Redis 中订阅消息转发到 WebSocket 客户端
PHP 的redis扩展是阻塞式 IO ,使用订阅/发布模式时,会导致整个进程进入阻塞.因此必须使用Swoole\Redis异步客户端来实现. 实例代码 $server = new swoole_we ...
- Websocket——Websocket原理
偶然在知乎上看到一篇回帖,瞬间认为之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比較喜欢看这样的博客,读起来非常轻松.不枯燥,没有布道师的 ...
随机推荐
- com.opensymphony.xwork2.ognl.OgnlValueStack] - target is null for setProperty(null, "emailTypeNo", [Ljava.lang.String;@6f205e]
情况1,查询结果未转换为与前台交互的实体类DTO 实体类:EmailTypeDto package com.manage.email.dto; public class EmailTypeDto { ...
- Openfire用户密码加密解密
需求要求审核过程中都用匿名进行用户注册登录,注册用户审核通过后才使用openfire内置表 如何做到用户密码统一 Openfire是通过org.jivesoftware.util.Blowfish.j ...
- ie6、7 下input的边框问题 ?
input的border设置为none,ie8及以上border都兼容,ie6和7的border还继续存在,将border设为0时所有浏览器上都不存在了,但是border为0时还是会继续的渲染. 将i ...
- NHibernate Query
1) Sql Group by .... 之前是这么写的,因为DateTime是YYYY-MM-DD HH:mm:SS 模式,我只想group 日期.这种写法再mysql,sqlserver.orac ...
- linux下可执行程序的装载和启动
张雨梅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.c文件的编译 图中显示了c ...
- $.inArray()
原文链接:http://www.css88.com/jqapi-1.9/jQuery.inArray/ jQuery.inArray( value, array [, fromIndex ] )返回: ...
- eclipse中mybatis_generator插件的安装与使用
git地址:https://github.com/mybatis/generator 下载后解压: 选择任意一个版本的jar放到eclipse的features目录下即可 选择任意一个版本的jar放到 ...
- HTML5部分新标签属性及DOM扩展元素
HTML5定义了一系列新元素,如新语义标签.智能表单.多媒体标签等. 我们日常讨论的H5其实是一个泛称,它指的是由HTML5 + CSS3 + Javascript等技术组合而成的一个应用开发平台. ...
- 根据条件动态拼接LinQ的where条件字串
var items1 = from c in customer == ? c.FirstName == == ? c.LastName == "BBB" : true) selec ...
- redhat自定义安装必选
redhat自定义安装必选 1.桌面 ked桌面 x 窗口系统 2.应用程序 编辑器 基于文本的互联网 图形互联网 3.服务器 服务器配置工具 万维网服务器 Windows文件 FTP服务器