node.js サーバーとクライアント間のリンクが切断され、切断イベントがまだタイムアウトによってトリガーされていない場合、クライアント側で発行された特定のイベントを配信できなかったかどうかを検出する方法はありますか? Socket.IO によるサーバー側?
1 に答える
私は socket.io や node.js の専門家ではないので、これについて詳しく調べました。
- ソケットの種類は?
sockets.io は、ブラウザの機能に応じて、サーバーへの接続に使用する方法を抽象化します。デフォルトでは、WebSocket (HTML5) を使用します。
ただし、サーバー側の sockets.io は node.js の Web サーバーにアタッチするため、常に TCP を使用します。これは HTTP が実行されるためです。したがって、クライアントが使用している方法が何であれ、常にその下で TCP が使用されます。したがって、UDP ソケットについて心配する必要はありません。
- socket.io はエラーを出していますか?
TCP は理論的には各パケットが到着することを確認するため、TCP は socket.io ライブラリへの接続エラーをバブルアップする必要があります。したがって、次のようなものを試すことができます。
<script>
var socket = io.connect('http://localhost/');
socket.on('error', function (message) {
alert( 'error in transport: ' + message );
});
ところで、私はこれを自分で試したことはありませんが、socket.io.js のコードを読みました (これは、トランスポートの構成に応じて socket.io によって動的に作成されるため、ブラウザーで見つける必要があります)。 publish() を使用して発行されるイベントを見ました。エラーは切断、再接続シーケンスもトリガーする必要がありますが、「閉じる」は完全に閉じられるまで起動しません (私には見えます)。これには時間がかかる場合があります。しかし、error
すぐに発砲する必要があるようです。
- それ以外の場合は、2 つのアイデアが
あります。node.js socket.setTimeOut を使用してタイムアウトを短く設定し、何が起こるかを確認します。 b. または、何らかの方法でソケットにエラーを強制してみてください。つまり、読み取りループの読み取りの合間に (おそらくノンブロッキング ソケットを使用しているため、これが必要です)、ソケットへの書き込みを試みます。