Git Product home page Git Product logo

Comments (5)

fscarmen2 avatar fscarmen2 commented on May 25, 2024

问 ai

nodejs如何做到像 nginx 一样的websocket ,通过 /a 或者 /b 或者 /c ,location 到 8080端口

ChatGPT

ChatGPT
ChatGPT

Poe

要在 Node.js 中实现类似 Nginx 的 WebSocket 代理功能,让不同的路径(例如 /a、/b、/c)转发到不同的后端 WebSocket 服务器(例如 8080 端口),可以使用以下代码示例:

javascript
复制

const http = require('http');
const httpProxy = require('http-proxy');
const WebSocket = require('ws');

// 创建一个 HTTP 代理服务器
const proxy = httpProxy.createProxyServer({});

// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {
  const { url } = req;

  // 根据请求路径进行分流
  if (url.startsWith('/a')) {
    proxy.web(req, res, { target: 'ws://localhost:8080' });
  } else if (url.startsWith('/b')) {
    proxy.web(req, res, { target: 'ws://localhost:8081' });
  } else if (url.startsWith('/c')) {
    proxy.web(req, res, { target: 'ws://localhost:8082' });
  } else {
    res.statusCode = 404;
    res.end('Not Found');
  }
});

// 创建 WebSocket 服务器
const wss1 = new WebSocket.Server({ noServer: true });
const wss2 = new WebSocket.Server({ noServer: true });
const wss3 = new WebSocket.Server({ noServer: true });

// 将 WebSocket 服务器附加到 HTTP 服务器上
server.on('upgrade', (req, socket, head) => {
  const { url } = req;

  // 根据请求路径进行 WebSocket 升级
  if (url.startsWith('/a')) {
    wss1.handleUpgrade(req, socket, head, (ws) => {
      wss1.emit('connection', ws, req);
    });
  } else if (url.startsWith('/b')) {
    wss2.handleUpgrade(req, socket, head, (ws) => {
      wss2.emit('connection', ws, req);
    });
  } else if (url.startsWith('/c')) {
    wss3.handleUpgrade(req, socket, head, (ws) => {
      wss3.emit('connection', ws, req);
    });
  } else {
    socket.destroy();
  }
});

// 启动服务器
server.listen(80, () => {
  console.log('Server is running on port 80');
});

以上代码使用了 http-proxy 模块来创建一个 HTTP 代理服务器,并使用 http 模块创建一个 HTTP 服务器。根据请求的路径进行分流,将不同的路径转发到不同的后端 WebSocket 服务器。

同时,使用 ws 模块创建了三个 WebSocket 服务器,并通过 handleUpgrade 方法将它们附加到 HTTP 服务器上,以便处理 WebSocket 升级请求。

你可以根据需要修改示例中的路径、后端 WebSocket 服务器的地址和端口,以及服务器的监听端口。启动该 Node.js 代码后,它将监听指定的端口(例如 80),并根据请求路径将 WebSocket 请求转发到相应的后端 WebSocket 服务器。

Gemini

只使用 Node.js 实现类似 Nginx 的 WebSocket 功能,可以通过以下步骤进行:

  1. 安装依赖库

首先,需要安装 Node.js 的 WebSocket 库,例如 ws 或 socket.io。

npm install ws
  1. 创建 WebSocket 服务器

使用 ws 库创建 WebSocket 服务器,并监听指定的端口。

JavaScript

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket) => {
  // 处理 WebSocket 连接
});

谨慎使用代码。

  1. 处理不同路径

根据不同的路径,使用不同的处理逻辑。例如,可以根据路径的不同,发送不同的消息或执行不同的操作。

JavaScript

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket, request) => {
  const pathname = request.url.pathname;

  switch (pathname) {
    case '/a':
      // 处理 `/a` 路径
      break;
    case '/b':
      // 处理 `/b` 路径
      break;
    case '/c':
      // 处理 `/c` 路径
      break;
  }
});

谨慎使用代码。

示例代码:
JavaScript

// server.js

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket, request) => {
  const pathname = request.url.pathname;

  switch (pathname) {
    case '/a':
      socket.send('This is /a');
      break;
    case '/b':
      socket.send('This is /b');
      break;
    case '/c':
      socket.send('This is /c');
      break;
  }
});

谨慎使用代码。

运行示例:

node server.js

测试:

使用浏览器或 WebSocket 客户端连接到 http://localhost:8080/a、http://localhost:8080/bhttp://localhost:8080/c,即可建立 WebSocket 连接,并收到相应的消息。

from argo-xray-js-paas.

Ropgrc avatar Ropgrc commented on May 25, 2024

目前已经摸索着找到对的方法了。
隧道的配置端口就是和NodeJS的监听端口一致才对,如果是Nginx建站也要和Nginx的监听端口一致,不会冲突。关于为什么我会说到冲突可能就是Path上的问题,然后我误以为是端口的问题。下图就是我现在NodeJS的中间件配置,由于我只用vless,所以只有一个,如果想多协议应该是可以加的,3002是vless inbound port。作者目前的代理中间件代理的是根路径,我感觉是错的,但是也说不出什么所以然。
屏幕截图 2024-03-22 122718
这样设置的话,隧道域名和容器域名都能正常访问路径提供的服务
容器www.example.com/UUID www.example.com/PATH www.example.com/list www.example.com/status
隧道www.trycloudflare.com/UUID www.trycloudflare.com/PATH www.trycloudflare.com/list www.trycloudflare.com/status

from argo-xray-js-paas.

fscarmen avatar fscarmen commented on May 25, 2024

作者目前的代理中间件代理的是根路径

那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严谨而已,我在另外的科学项目上已经去掉了,无意义的。

现在的方案科学数据直接通过隧道到达平台的 xray 8080 inbound,再通过不同的指定的路径,回落到相应的 xray 的其他 ws 协议的 inbound ,当然,这个是在xray里分流,没有经过 nodejs 的网的。

你的需求是想要隧道先去到 nodejs 的 3000 端口,再在上面使用类似 nginx 的分流,是访问根的就去到伪装网 80 端口,有指定路径的就分流去到 8080 的 xray inbound。这个需求我自己没有做过,不过问问 GPT 使用什么中间件,如何通过路径分流,会问的话应该不太难。

from argo-xray-js-paas.

fscarmen2 avatar fscarmen2 commented on May 25, 2024

from argo-xray-js-paas.

Ropgrc avatar Ropgrc commented on May 25, 2024

那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严格限制,我在另外的科学项目上已经去掉了,没有意义的。 现在的方案科学数据直接通过到达隧道平台的xray 8080入站,再通过不同的指定的路径,回落到相应的xray的其他ws协议的入站,当然,这个是在xray里分流,没有经过nodejs的网络的。你的需求是想要tunnel先去nodejs的3000端口,再在上面使用类似nginx的分流,是访问根的就去到伪装网80端口,有指定路径的就分流去8080的xray入站。这个需求我自己没有,不过询问GPT使用什么中间件,如何通过路径分流,会问的话应该不太难。当时为什么没有设计tunnel去nodejs使用的3000端口,像你的需求那样呢。因为我想使用本项目的大部分需求都是科学的,有ws+tls+cdn应该很安全的了,不需要伪装网,所以隧道就直接去到xray入站,这样可以减少一个阶段,在我看来能高效点(虽然速度上肯定感觉不出来,只是心理觉得),如果你是这样改的话,我想甚至你都可以在xray上只做1个vless+ws的127.0.0.1入站3011,通过nodejs分流到该3011端口。

你是对的,vm+tls+cdn相较其他来说在很长时间处于稳定状态,不管什么方法能科学就足够了。是的,我的config inbound只有vless+ws。谢谢你的回复。

from argo-xray-js-paas.

Related Issues (9)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.