0

node-http-proxy を使用して、ルーティング リクエスト用のリバース プロキシをセットアップしました。

var httpProxy = require('http-proxy');
var server = httpProxy.createServer({
    hostnameOnly: true,
    router: {
        'www.example.com': 'localhost:3002'
    }
}).listen(80);

ここで、 http://socket.io/#how-to-useで最初の例を実行すると、ソケットがクライアントに接続しないことがあります。これをテストするために、server.js と index.html という 2 つのファイルを作成しました。node アプリケーションを開始するには、server.js を実行します。

サーバー.js:

var app = require('http').createServer(handler)
    , io = require('socket.io').listen(app)
    , fs = require('fs')

app.listen(3002);

function handler (req, res) {
    fs.readFile(__dirname + '/index.html',
    function (err, data) {
        if (err) {
            res.writeHead(500);
            return res.end('Error loading index.html');
        }

        res.writeHead(200);
        res.end(data);
    });
}

io.sockets.on('connection', function (socket) {
    console.log("Socket connected");
});

index.html:

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect();
    setInterval(function() {
        console.log(socket.socket.connected);
    }, 1000)
</script>

クライアントが接続しない場合、ソケットがサーバーに接続した後、次の出力が +/- 10 秒間隔で繰り返し表示されます。

debug - setting request GET /socket.io/1/xhr-polling/Cqcw5xUjQ-B-Hw3FGF7Y?t=1385128607702
debug - setting poll timeout
debug - discarding transport
debug - cleared heartbeat interval for client Cqcw5xUjQ-B-Hw3FGF7Y

ここで、ブラウザーを数回更新すると、ソケットは常にサーバーに接続します (つまり、常に"Socket connected"をログに記録します) が、クライアント側に接続しない場合があります。インデックスを更新した後、"false"console.log(socket.socket.connected)を繰り返し出力することがあります。 html であり、別のページの更新後、ソケットがクライアントに接続しなかった、または接続した場合、「true」または「false」を繰り返し出力することがあります。

この例は、リバース プロキシを使用しない場合でもクライアント側で機能するため、www.example.com のポート 80 で server.js を実行すると、. 誰かがこの問題の原因を指摘できれば素晴らしいと思います。node.js v0.8.23、socket.io バージョン 0.9.14、node-http-proxy バージョン 0.10.1 を使用しています。

アップデート

おそらく、私は実際にノード v0.10.21 を使用しています。nvm を使用してノードのバージョンを切り替えてv0.8.23を使用していると思っていましたが、何らかの理由で v0.10 に戻ってしまいます。http-proxy がノード バージョン 0.8 以降の Web ソケットをサポートしていないことは既知の問題であるため、それが原因である可能性があります。もっと良いものが見つかるまで、robertklepのソリューションを使用しています。

4

2 に答える 2

1

それは実際に私が使用していたノードのバージョンでした。Node-http-proxy は、ノード バージョン >0.8 では機能しません (プロキシ テーブルと websockets を使用したノード http プロキシ を参照してください)。v0.8.23 を使っていると思っていたら、実は v0.10.21 を使っていました。nを使用することで、確かに v0.8.23 でノードを動作させることができましたが、今では動作しているようです。ノードのバージョンをリセットするには、n を強くお勧めします。

于 2013-11-22T17:47:35.710 に答える
1

問題socket.ioは、最初にWebSocketをトランスポートメディアとして使用しようとしていて、それが機能しない場合(WS接続をプロキシできるかどうかわかりませんnode-http-proxy)、機能するトランスポートにフォールバックすることだと思います(xhr-polling)が、その過程でクライアントやサーバーが混乱します。

websocketトランスポートとトランスポートを無効にしてflashsocket、信頼性が向上するかどうかを確認してください。

io.set('transports', [ 'xhr-polling', 'jsonp-polling', 'htmlfile' ]);

(詳細)

于 2013-11-22T14:27:16.727 に答える