光阴似箭催人老,日月如移越少年。
修正してください: 問題の考えられるキーポイント: クライアントは accept() を 1 回だけ実行し、出力ストリームを閉じません
1. クライアントは clientSocket インスタンスを維持し (connect は 1 回だけ呼び出されます)、サーバーは ServerSocket インスタンスを維持します。 1 つのクライアント ソケットを維持し、2 番目の入力処理を期待しているだけで、長い接続に備えているようです。
出力ストリームが閉じられると、出力ストリームに対応するソケットも閉じられます - 『クレイジーJava講義ノート(第3版)』p786
2. サーバーを見下ろしてみましょう。 ss.accept() は複数のクライアント接続を処理するためのループ内に配置されています。ちなみに、クライアントごとに読み取り操作があり、その後の読み取り操作はありません。これが問題である可能性があります。
短い接続ですか、それとも長い接続ですか? 連続して複数の通信を行う場合は、1つの接続で複数回の読み取りと書き込み(長い接続)を使用することも、複数の接続で1回の接続ごとに1回の読み取りと書き込み(短い接続)を使用することもできますクライアントは長い接続を望んでいますが、サーバー は短い接続を望んでいるように見えます。提案:
長い接続: クライアントは変更されず、サーバーはクライアントごとに 1 回だけ accept() を実行し、複数の入力通信をループで処理し、 ストリームを監視しますが、ソケットは閉じません。
: クライアントが新しいソケット接続を開始する (新しいソケット インスタンスを作成する) たび、操作が完了するたびに、 ストリームを閉じてソケットを閉じます。サーバーのループ本体は変更されず、ストリームはループ本体内で閉じられ、毎回 accept() によって返されるソケットは閉じられます。 自分のビジネスを知らないため、コードの本当の意図がわかりません。さらに拡張する価値のあるその他の点は次のとおりです: マルチクライアント接続、複数接続、セッション管理、同時実行性など。
while ループでコードを閉じるたびに、コードをよく見ることができます。
修正してください:
問題の考えられるキーポイント: クライアントは accept() を 1 回だけ実行し、出力ストリームを閉じません
1. クライアントは clientSocket インスタンスを維持し (connect は 1 回だけ呼び出されます)、サーバーは ServerSocket インスタンスを維持します。 1 つのクライアント ソケットを維持し、2 番目の入力処理を期待しているだけで、長い接続に備えているようです。
2. サーバーを見下ろしてみましょう。 ss.accept() は複数のクライアント接続を処理するためのループ内に配置されています。ちなみに、クライアントごとに読み取り操作があり、その後の読み取り操作はありません。これが問題である可能性があります。
短い接続ですか、それとも長い接続ですか? 連続して複数の通信を行う場合は、1つの接続で複数回の読み取りと書き込み(長い接続)を使用することも、複数の接続で1回の接続ごとに1回の読み取りと書き込み(短い接続)を使用することもできます
クライアントは長い接続を望んでいますが、サーバー は短い接続を望んでいるように見えます。提案:
長い接続: クライアントは変更されず、サーバーはクライアントごとに 1 回だけ accept() を実行し、複数の入力通信をループで処理し、 ストリームを監視しますが、ソケットは閉じません。
短い接続: クライアントが新しいソケット接続を開始する (新しいソケット インスタンスを作成する) たび、操作が完了するたびに、 ストリームを閉じてソケットを閉じます。サーバーのループ本体は変更されず、ストリームはループ本体内で閉じられ、毎回 accept() によって返されるソケットは閉じられます。 自分のビジネスを知らないため、コードの本当の意図がわかりません。さらに拡張する価値のあるその他の点は次のとおりです: マルチクライアント接続、複数接続、セッション管理、同時実行性など。
while ループでコードを閉じるたびに、コードをよく見ることができます。