「WebSocketはすでにCLOSINGまたはCLOSED状態になっています」という問題の解決策を探していましたが、これが見つかりました。
答え#1はMeteorに厳密に関連するもので、#2には答えがありません... Nodeサーバーアプリにソケットがあります:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(socket) {
socket.on('message', function incoming(data) {
console.log('Incoming data ', data);
});
});
クライアントは次のように接続します。
const socket = new WebSocket('ws://localhost:3090'); //Create WebSocket connection
//Connection opened
socket.addEventListener('open', function(event) {
console.log("Connected to server");
});
//Listen to messages
socket.addEventListener('message', function(event) {
console.log('Message from server ', event);
});
ただし、数分後、クライアントはランダムに切断し、機能
socket.send(JSON.stringify(data));
その後、「WebSocketはすでにCLOSINGまたはCLOSED状態になっています。」をスローします。
これらの切断を検出して対処し、すぐに再接続を試みる方法を探しています。
これを行うための最も正確で効率的な方法は何ですか?
最も簡単な方法は、送信前にソケットが開いているかどうかを確認することです。
たとえば、単純な関数を作成します。
function isOpen(ws) { return ws.readyState === ws.OPEN }
次に、socket.send
の前に、開いていることを確認します。
if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));
send
関数を this answer のように書き換えることもできますが、私のやり方ではこの状況を記録できます。
そして、あなたの2番目のリクエスト
すぐに再度接続を試みます
サーバーから実行する方法はありません。
クライアントコードはWebSocketの状態を監視し、必要に応じて再接続メソッドを適用する必要があります。
たとえば、 this VueJSライブラリが適切に動作することを確認してください。 WS再接続を自動的に有効にするセクションをご覧ください