簡體   English   中英

讓 Node-http-proxy 與 socket.io 一起工作?

[英]Getting Node-http-proxy to work with socket.io?

我正在嘗試使用 node-http-proxy 將流量定向到端口 3000(我的 rails 服務器)和端口 8888(我的 nodejs socket.io 服務器)。 我正在使用 node-http-proxy 充當位於端口 80 上的反向代理。

(我幾乎只是從 node-http-proxy 復制自述文件)

var proxy = new httpProxy.HttpProxy({ 
  target: { 
    host: 'localhost', 
    port: CONFIG.RAILS_PORT,
  }
});

var server = http.createServer(function(req, res) { 
  //
  // Proxy normal HTTP requests
  //
  proxy.proxyRequest(req, res);
});

server.on('upgrade', function(req, socket, head) { 
  // 
  // Proxy websocket request to another port 
  //
  console.log('inside upgrade');
  proxy.proxyWebSocketRequest(req, socket, head, {
    host: 'localhost', 
    port: CONFIG.NODEJS_PORT
  });
});

server.listen(80);

var WrappedServer = require('./wrappedServer').WrappedServer
var singleton = new WrappedServer();
singleton.run(CONFIG.NODEJS_PORT, {'log level': 2});

這是我在瀏覽器上的 client.js。

var socket = io.connect('http://localhost', {'sync disconnect on unload': false});

不知何故,io.connect 無法連接到 nodejs 服務器。 我從 io.connect 收到此響應:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Action Controller: Exception caught</title>
  <style>
    body { background-color: #fff; color: #333; }

    body, p, ol, ul, td {
      font-family: helvetica, verdana, arial, sans-serif;
      font-size:   13px;
      line-height: 18px;
    }

    pre {
      background-color: #eee;
      padding: 10px;
      font-size: 11px;
    }

    a { color: #000; }
    a:visited { color: #666; }
    a:hover { color: #fff; background-color:#000; }
  </style>
</head>
<body>

<h1>Routing Error</h1>
<p><pre>No route matches [GET] &quot;/socket.io/1&quot;</pre></p>
</body>
</html> 

知道如何通過 io.connect 連接到 nodejs 服務器嗎? 我不知道如何觸發 io.connect 以進入 server.upgrade 集團。

謝謝 !

使用 socket.io,您首先執行 http 握手。 此步驟不涉及websocket連接。 您從 http-proxy github 頁面的自述部分引用的上述代碼告訴您如何直接偵聽 websocket 請求。 在這里,您需要一個正常的路由入口(使用 HTTP 資源)到 socket.io,當握手完成時,您的連接將升級到 websocket,代理將自動處理它。

這是一個偽代碼。 我在生產中使用它來代理到多個 socket.io 服務器,這些服務器由實際物理資源(HTTP 資源)標識。

假設我有兩個 socket.io 服務器運行在以下 ip 和端口如下 -

  1. ip1:3000
  2. ip2:3001

現在我們代理中的代碼(帶有 ip ip3)看起來像-

var options = {
  "ip3/Socket1/socket.io" : "ip1:3000/socket.io",
  "ip3/Socket2/socket.io" : "ip2:3001/socket.io"
}

proxy = require('http-proxy').createServer(options).listen(80);

這里需要注意幾點——

  • 這里我使用Socket1Socket2作為別名,分別標識第一個和第二個 socket.io 服務器。
  • 只要您有權訪問它,您就可以代理到任何機器。 也就是說,您可以從代理服務器(此處為 ip3)ping 那些機器(此處為 ip1 和 ip2),並且沒有防火牆阻止您的連接(您是 same.network 的一部分)。
  • 如果您在同一台主機上擁有以上所有內容,則可以將ip1ip2替換為localhost

對於我當前的示例,客戶端 javascript 代碼看起來像這樣-

var socket1 = io.connect('http://ip3:80', {'resource': 'Socket1/socket.io'});
var socket2 = io.connect('http://ip3:80', {'resource': 'Socket2/socket.io'});

所有這些看起來需要一次消化很多。 如果您仍然遇到此問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM