Socket.IOとBouncyとの間にいくつかの非互換性があるようです:ChromeやFirefox(Edgeではなく)では、5以上開いたときにブラウザのタブがハングアップします。Socket.IO(> = 1.0)と弾き語りの問題
NPMモジュール「Bouncy」が原因です。なぜなら、それを使用するコードを削除すると、すべて正常に動作し、何個のブラウザタブを開くことができるのかに制限がないからです。もう一つの原因は、Socket.IOの新しいバージョン(> = 1.0、これまでに更新したバージョン)です。なぜv0.9.16にダウングレードすると問題が解決されるからです。ここで
は、いくつかの関連サーバーのコードです:
var port = 8502;
var bouncy = require('bouncy');
var socketio = require('socket.io');
var express = require("express");
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(port);
var serverBouncer = bouncy(function(req, res, bounce) {
var path = req.url;
var url = req.headers.host;
if (typeof url !== "string") {
res.send(500);
res.end();
return;
}
var urlArray = url.split('.');
var bouncePort = port;
if (!isNaN(urlArray[0]))
bouncePort = parseInt(urlArray[0]);
else if (String(urlArray[0]).toLowerCase() === "www" && !isNaN(urlArray[1]))
bouncePort = parseInt(urlArray[1]);
bounce(bouncePort);
});
serverBouncer.listen(80);
io.on("connection", function(socket) {
//Some events...
});
はここにいくつかの関連するクライアントコードです:
var client = io.connect();
私は任意のヘルプは非常に高く評価され、過去3日間、この問題を解決しようとして立ち往生してきました。
更新:2
更新:
は私がの設定を変更するここで は、クロームのdevのツールのネットワークタブは次のようになります。 WebSockを強制するsocket.io(サーバー側)ら:クライアント側のために同じ
io.set('transports', ['websocket', 'polling']);
:
var client = io({transports: ['websocket', 'polling']});
しかし、今、私が発したイベントがサーバーに到達しません。
アップデート3:ここでは、ネットワーク]タブは次のようになります主要コンポーネントの バージョン:
- NodeJS V6.2.2
- Socket.IO v1の。 4.8
- バウンシーv3.2.2 私はnginxので弾むモジュールを交換するために管理
- CORS v2.7.1
- Expressのv4.14.0
- NPMのv3.10.5
あなたのsocket.io接続はどのポートに接続されていますか? socket.io接続はHTTPリクエストとして開始されます。そのため、bouncyが確実にソケットをsocket.ioサーバーに転送する必要があります。 1.0の前後のsocket.ioの違いの1つは、最新のソケットです。ioは、webSocketが動作していることを確認してからwebSocketに切り替える前に、単純なHTTPリクエストでいくつかのメッセージを送信することがよくあります。 – jfriend00
Socket.ioはポート8502でリッスンしているアプリケーションにバインドされています。弾みのあるサーバーはポート80でリッスンしています.5つのブラウザタブでうまく動作し、その後問題が発生します。 ioまたは弾みを取り除くことで問題は解決しますが、私はこれらのことをしたくありません。 –
弾力のあるサーバーの背後にある理由は、5555.domain.comなどのURLを持つ他のポート上で実行されている他のアプリケーションにクライアントをリダイレクトすることができるためです。 –