Netty バージョン: 4.0.10.Final
Netty を使用してクライアントとサーバーを作成しました。クライアントとサーバーが行うことは次のとおりです。
サーバ:
- クライアントからの接続を待つ
- クライアントからメッセージを受け取る
- メッセージが悪い場合は、エラー メッセージ (6 バイト) を書き込み、それをフラッシュし、ソケットを閉じて、ソケット内の未読メッセージを読み込まないようにします。それ以外の場合は、メッセージを読み続けます。良いメッセージには何もしないでください。
クライアント:
- サーバーに接続します。
- N 個の良いメッセージを書いた後、悪いメッセージを 1 つ書き、M 個の良いメッセージを書き続けます。このプロセスは別のスレッドで行われます。このスレッドは、チャネルがアクティブになった後に開始されます。
- サーバーからの応答がある場合は、ログに記録してソケットを閉じます。(サーバーはエラーが発生した場合にのみ応答することに注意してください)
クライアントとサーバーの両方を追跡しました。エラーメッセージを書き込んだ後、サーバーが接続を閉じていることがわかりました。悪いメッセージの後に良いメッセージを書き込んでいるときに、クライアントで壊れたパイプ エラーが発生するようになりました。これは、サーバーが不正なメッセージを検出し、エラー メッセージを返し、ソケットを閉じたためです。接続は、リスナーを使用して書き込み操作が完了した後にのみ閉じられます。クライアントは常にサーバーからエラー メッセージを読み取っていません。クライアントでの前のステップ (2) は、I/O スレッドで実行されます。これにより、K 回の実験で受信したエラー メッセージの割合が非常に低くなりました (<10%)。ステップ (2) を別のスレッドに移動した後、% は (70%) になりました。いずれにせよ、それは正確ではありません。壊れたパイプが原因で書き込みが失敗した場合、netty はチャネルの読み取りをトリガーしますか?
更新 1 : 私はここで尋ねられた質問を明確にして回答しているので、誰もが尋ねられた質問/説明を 1 か所で見つけることができます。「あなたは、リセットを引き起こす悪いメッセージを書き、その後に、すでに通らないことがわかっている良いメッセージを書き、破棄された可能性のある応答を読み取ろうとしています。私には意味がありません。何でも」 - EJP より
-- 現実の世界では、クライアントが事前に知ることができない何らかの理由で、サーバーが何かを悪いものとして扱う可能性があります。簡単にするために、クライアントがサーバーからのリセットを引き起こす悪いメッセージを意図的に送信すると言いました。総メッセージに悪いメッセージがあっても、すべての良いメッセージを送信したいと思います。
私がやっていることは、Apple Push Notification Serviceによって実装されたプロトコルに似ています。