56

このコードを使用して websocket 接続を構築します (例):

var socket = new WebSocket("ws://94.12.176.177:8080");

そして、私はこれとの接続を閉じます:

socket.close();

しかし、どうすれば接続を再確立できますか?

私はいくつかの研究を行い、いくつかの方法を試しました。この質問は私を助けることができませんでした: Socket.io reconnect on disconnect? 私が探しているものに近い唯一の結果です。

これを行う理由は、ユーザーが Web へのデータの送信を一時的に停止し、一定期間後に再送信できるようにするためです。再接続しないと、ユーザーは再送信するためにページを更新する必要があります。これにより、一部のデータが失われる可能性があります。ありがとうございました。

4

5 に答える 5

89

サーバーが接続を閉じると、クライアントは再接続を試みません。いくつかの JS フレームワークを使用している可能性がありますが、質問は、この回答の時点で、プレーンなバニラ JS としてタグ付けされていました。

受け入れられ、支持された回答が明らかに間違っているため、私は少しイライラしています。正しい解決策を見つけるのに時間がかかりました。

ここにあるもの: WebSocket でサーバーが再起動したときのクライアントの再接続

于 2016-06-30T05:44:01.080 に答える
26

このページで素晴らしい解決策を見つけました:sam-low.com

元の接続が閉じられたら、新しいイベント リスナーを使用して新しい WebSocket オブジェクトを作成する必要があります。

function startWebsocket() {
  var ws = new WebSocket('ws://localhost:8080')

  ws.onmessage = function(e){
    console.log('websocket message event:', e)
  }

  ws.onclose = function(){
    // connection closed, discard old websocket and create a new one in 5s
    ws = null
    setTimeout(startWebsocket, 5000)
  }
}

startWebsocket();

再接続で問題が発生した場合でも、新しい WebSocket オブジェクトは別のクローズ イベントを受け取ることに注意してください。つまり、onclose()技術的に開かれなくても実行されます。そのため、5 秒の遅延は理にかなっています。遅延がなければ、何千もの Websocket 接続を作成および破棄する速度で、おそらく何かが壊れる可能性があります。

于 2018-10-17T15:38:44.637 に答える
13

注: 質問にはタグが付けられsocket.ioているため、この回答は特に に関するものsocket.ioです。
多くの人が指摘しているように、この回答は、どのような状況でも再接続を試みないバニラ websocket には当てはまりません。

Websocket は自動的に再接続を試みません。新しい接続を取得するには、ソケットを再作成する必要があります。唯一の問題は、ハンドラーを再アタッチする必要があることです。

しかし実際には、Websocket は開いたままになるように設計されています。

より良い方法は、サーバーに接続を閉じることです。このようにして、Websocket はoncloseイベントを発生させますが、接続を試行し続けます。サーバーが再びリッスンすると、接続は自動的に再確立されます。

于 2012-12-10T08:30:45.940 に答える