介绍一下我是如何构建一个基于WebSocket的HTTP Tunnel工具的 。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?3分钟?学习?何乐而不为?,希望?大家?点赞?,评论,加?关注?,你的?支持?是我?最大?的?动力? 。下方抖音有我介绍自动化测试,以及google cloud 相关视频课程,欢迎观看 。
当我们开发一些与第三方服务集成的应用程序时,我们需要让我们的本地开发服务器暴露在互联网上 。为此,我们需要为本地服务器建立一个 HTTP。HTTP Tunnel是如何工作的?在本文中,我将向您展示如何构建 HTTP Tunnel工具 。

文章插图
为什么我们需要部署自己的 HTTP Tunnel服务?HTTP Tunnel有很多很棒的在线服务 。例如,我们可以使用 获得付费的固定公共域来连接您的本地服务器 。它也有一个免费的包 。但是对于免费套餐,您无法获得固定域 。重新启动客户端后,您将获得一个新的随机域 。当您需要将域保存在第三方服务中时,这很不方便 。ngrok
为了得到一个固定的域,我们可以在我们自己的服务器上部署一个 HTTP Tunnel 。还提供了 用于服务器端部署的开源版本。但它是一个旧的 1.x 版本,不建议在生产中部署,存在一些严重的可靠性问题 。ngrok
使用我们自己的服务器,它还可以保证数据的安全 。
Lite HTTP Tunnel简介Lite HTTP Tunnel 是我最近为自托管 HTTP Tunnel服务构建的 。您可以在 Github 存储库中使用按钮部署它,以快速获得免费的固定 Heroku 域 。Heroku
它是基于 并 仅使用一些代码构建的 。它使用 WebSocket 将来自公共服务器的 HTTP/HTTPS 请求流式传输到本地服务器 。Express.js Socket.io
我如何实现它步骤1:建立一个WebSocket服务器和客户端之间的连接在服务器端支持WebSocket连接 socket . io :
JavaScript
const http = require(\'http\');const express = require(\'express\');const { Server } = require(\'socket.io\');const app = express();const httpServer = http.createServer(app);const io = new Server(httpServer);let connectedSocket = null;io.on(\'connection\', (socket) => {console.log(\'client connected\');connectedSocket = socket;const onMessage = (message) => {if (message === \'ping\') {socket.send(\'pong\');}}const onDisconnect = (reason) => {console.log(\'client disconnected: \', reason);connectedSocket = null;socket.off(\'message\', onMessage);socket.off(\'error\', onError);};const onError = (e) => {connectedSocket = null;socket.off(\'message\', onMessage);socket.off(\'disconnect\', onDisconnect);};socket.on(\'message\', onMessage);socket.once(\'disconnect\', onDisconnect);socket.once(\'error\', onError);});httpServer.listen(process.env.PORT);WebSocket连接客户端:JavaScript
const { io } = require(\'socket.io-client\');let socket = null;function initClient(options) {socket = io(options.server, {transports: ["websocket"],auth: {token: options.jwtToken,},});socket.on(\'connect\', () => {if (socket.connected) {console.log(\'client connect to server successfully\');}});socket.on(\'connect_error\', (e) => {console.log(\'connect error\', e && e.message);});socket.on(\'disconnect\', () => {console.log(\'client disconnected\');});}第 2 步:使用 Jwt 令牌保护 Websocket 连接在服务器端,我们使用套接字 。io 中间件拒绝无效连接:JavaScript
const jwt = require(\'jsonwebtoken\');io.use((socket, next) => {if (connectedSocket) {return next(new Error(\'Connected error\'));}if (!socket.handshake.auth || !socket.handshake.auth.token){next(new Error(\'Authentication error\'));}jwt.verify(socket.handshake.auth.token, process.env.SECRET_KEY, function(err, decoded) {if (err) {return next(new Error(\'Authentication error\'));}if (decoded.token !== process.env.VERIFY_TOKEN) {return next(new Error(\'Authentication error\'));}next();});});
- 长安笨笨纯电动 长安笨笨怎么样
- 郁金香的介绍和特点和作用 郁金香的介绍和特点
- 网络游戏公司介绍 网络游戏公司名字
- 天生会有好命的四种嘴巴形状介绍
- 新手做自媒体需要注意什么?注意事项介绍
- 黄金贡柚百度百科 黄金贡柚产品介绍
- 泛麦8号小麦品种图片 泛麦8号小麦品种介绍
- 介绍一下都匀毛尖茶 都匀毛尖是什么茶
- 天堂草的外形特征介绍 天堂草的特性
- 有男朋友家里人给介绍对象怎么办 有男朋友
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
