私はソケットを使って作成したクライアント/サーバーアプリケーションを持っています。 問題は、いくつかの情報を要求するコマンドを送信し、返信を待つときにその返信が来るまでブロックすることです。これにより、双方向のリクエスト/応答を実装することが難しくなります。 私は一つの例を使って説明しましょう: クライアントは、サーバーのディレクトリ内のファイルを一覧表示することができますので、私はコードでそのようにいろいろ書い操作を行います。クライアント/サーバーの会話 - 間違っていますか?
クライアントコード: 1 - 送信要求コマンド:LS/ 2 - ブロックLSが応答するのを待つ。 3ファイルリストを取得します。
私がした理由は、クライアントがファイルを転送する必要があるためです。 1ファイルの転送要求を送信します。 2サーバが受け入れるかどうかを調べるためにread()をブロックします。 3そうした場合にのみ、ファイルを送信します。
それで、サーバーに何かを要求する機能を追加するまで、それは問題ありませんでした。 私のコードでは、クライアントは何かを要求し、応答を待つのをブロックすることができます。 サーバは、クライアントが待っているレスポンスに意味をなさないリクエストコマンドを送信することがあります。これは会話をねじ込むだろう。
1つの解決策は、決して応答をブロックしないことです。 私はリクエストコマンドを送信してから、サーバーからの任意の要求または応答を待つために戻ります。応答が到着したら、ファイルを送信します。 それで、どのリクエストがどのレスポンスであるかを知るために、各リクエスト/レスポンスのペアにIDのように追加する必要がありますか?
PS:ホスト間のネットワーク会話をどのように設計するか、ネットワークアプリケーションのデザインパターンについての本を読んだことはありません。
PS2:SRY私の悪い英語;)
私はすべてのメソッドが(Javaで)そのようなものであるクラスクライアントを持っています:publicリスト listRemoteDir(String dir)は例外をスローします –
fredcrs