【问题标题】:Node proxy web sockets how to check节点代理网络套接字如何检查
【发布时间】:2015-12-01 16:13:56
【问题描述】:

我使用以下模块,它适用于反向代理 https://github.com/nodejitsu/node-http-proxy 目前我已经使用了如下示例的代码

httpProxy.createServer({
  target: 'ws://localhost:9014',
  ws: true
}).listen(8014);

我的问题是如何检查/模拟 websockets 正在工作? 任何测试都会有所帮助...

【问题讨论】:

    标签: node.js sockets proxy websocket node-http-proxy


    【解决方案1】:

    为了响应 OP 对浏览器测试的请求,我修改了我的原始解决方案,将 HTTP 和 WS 流量代理到提供 index.html 文件的服务器。然后,该文件通过 WebSocket 将浏览器连接到代理服务器,然后代理将代理服务器代理到主服务器。一条简单的消息从主服务器打印到浏览器文档上。

    为了不需要复制/粘贴任何内容,我创建了这个 repo 并附有完整说明:https://github.com/caasjj/httpproxy.git

    这里是代码,以防其他人想在这里查看。要运行整个程序,创建两个服务器文件和index.html 文件,使用node proxyreceiver.jsnode proxyserver.js 启动服务器,然后导航到localhost:8014/index.html

    (proxyserver.js):

    var httpProxy = require('http-proxy');
    var http = require('http');
    
    var proxy = new httpProxy.createProxyServer({
      target: {
        host: 'localhost',
        port: 9014
      }
    });
    var proxyServer = http.createServer(function (req, res) {
      proxy.web(req, res);
    });
    
    //
    // Listen to the `upgrade` event and proxy the
    // WebSocket requests as well.
    //
    proxyServer.on('upgrade', function (req, socket, head) {
      proxy.ws(req, socket, head);
    });
    
    proxyServer.listen(8014);
    

    (proxyreceiver.js):

    var app = require('http').createServer(handler)
    var io = require('socket.io')(app);
    var fs = require('fs');
    
    app.listen(9014);
    
    function handler (req, res) {
        res.writeHead(200);
        fs.readFile('index.html', function(err, data){
          res.end(data);
        })
    
    }
    
    io.on('connection', function (socket) {
    
      socket.emit('data', { message: 'Hello World!' });
    
      socket.on('resp', function(msg) {
        console.log('Got message: ', msg);
      });
    
    });
    

    (index.html):

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Web Socket Proxy Test</title>
      <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
      <script>
        var socket = io('http://localhost:8014');
        var p = document.createElement("p")
        socket.on('data', function (data) {
           console.log('Got', data);
           p.innerHTML = "Received:" + data.message;
           document.body.appendChild(p);
        });
    </script>
    </head>
    <body>
      <h1>Test ProxyServer</h1>
    </body>
    </html>
    

    【讨论】:

    • 非常感谢 1+,我创建了这 3 个文件并启动了节点应用程序并没有收到任何错误,问题是当我在浏览器中输入 url 时(如帖子 8014/ 9014)即使在控制台中也没有任何反应,知道缺少什么吗?我需要额外的步骤(我是这个主题的新手:))
    • 请注意,我们不会向浏览器返回任何可渲染的 html。您最初的问题只需要测试代码来验证连接,这就是我写答案的方式。您是否能够看到客户端连接到服务器、代理请求然后得到响应?如果是这样,则验证 Web 套接字连接是否通过代理服务器工作。如果您需要浏览器测试代码,我需要为您提供额外的代码。
    • 更新了测试代码以在浏览器上运行。如果这更接近您的需要,请告诉我。
    • 非常感谢,我从 git 克隆它并启动这两个文件,当我运行索引文件时,我得到了测试 ProxyServer,但是当我输入 url localhost:8014 时我如何测试 webSocket /index.html 注意发生在控制台中我看到加载资源失败:localhost:8014/index.html net::ERR_CONNECTION_REFUSED 有什么想法吗?
    • 第二个问题是假设我在我的场景中不需要第二台服务器(这个服务器是由其他程序创建的,我只需要代理它调用 ans ws 我将如何采用代码而不是,谢谢高级专家!
    【解决方案2】:

    最好的测试方法是创建一个客户端来连接它。 周围有很多ws模块。或者你可以使用这个:https://www.websocket.org/echo.html 只需将你的 url 放在那里并测试它。

    【讨论】:

    • 您能否提供示例如何创建客户端以连接到它?
    • 只需使用我在链接中提供的那个。如果你想创建一个客户端,你可以使用 node.js 并使用一个名为 ws 的模块
    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2021-12-21
    • 2013-05-12
    • 2012-03-28
    • 2016-08-08
    • 2018-05-18
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多