これは、質問というよりも議論の対象になるかもしれません。
背景:
サーバー/クライアントのペアが2つあり、1つはJavaで記述され、もう1つはC#で記述されています。両方のペアは同じことをしています。Java \ JavaとC#\ C#の組み合わせを使用している場合は問題ありません。Java \ C#とC#\Javaの組み合わせも機能させたいです。I \ Oに問題はありません。私は、XML形式の文字列を表すバイト配列を使用しています。私はTCPを使用する必要があります。
私は優雅な切断を気にする必要があります。Javaにはそのようなことはありません。クライアントのソケットを閉じると、サーバー側のソケットはパッシブクローズ状態のままになります。したがって、このソケットを処理するサーバースレッドはまだ存続しており、多くのクライアントの場合、何千もの不要なスレッドが発生する可能性があります。C#では、TcpClient.Availableを呼び出して、バッファーにデータがあるかどうか、またはクライアントが閉じられているかどうか(SocketException)を判別するだけで十分です。Javaでは、2つのアプローチを考えることができます。
- 反対側がまだ開いているかどうかを実際にテストするには、ソケットの基になるストリームに何かを書き込む必要があります。
- 接続を閉じる前に、接続の片側を閉じていることを反対側に認識させる必要があります。これを実装しました。クライアントソケットを閉じる前に、0x04バイト(送信の終わり)を含むパケットをサーバーに送信しています。サーバーは、ソケットのサーバー側を閉じることでこのバイトに反応します。
残念ながら、どちらのアプローチでも、client \ serverのC#\JavaとJava\ C#のペアに関してはジレンマが発生しました。これらのペアが相互に通信できるようにする場合は、0x04バイトをC#クライアントに送信するためのコードを追加する必要があります。もちろん、それを処理するコードをC#サーバーに送信する必要があります。これは一種のオーバーヘッドです。しかし、私は不要なネットワークトラフィックで生きることができました。主な問題は、このC#コードがコア通信ライブラリの一部であり、絶対に必要でない限り触れたくないということです。
質問:
Javaで正常に切断する他のアプローチはありますか?これは、ソケットの基になるストリームへの書き込みと結果のチェックを必要としないため、C#コードでもこれを処理する必要はありませんか?使用済みライブラリに関してはフリーハンドです。JavaSE\EEだけを使用する必要はありません。