全て、
そこで、クライアントがサーバーと通信するために使用したい単純なプロトコルを作成することを発明しました。これは典型的な(私が思うに)三相レイアウトです:
- 接続の確立(最終的には機能のネゴシエーションが含まれます)
- 実際のデータ交換-パケットは楽しく行き来し、それに応じて動作するそれぞれの受信者によって解釈されます
- 接続のティアダウン-一方の側は「これ以上したくない」と言い、もう一方の側は「そうなる」と言います(最終的には、会話を閉じるだけでなく、完了するまでもう一方の側がデータを送信できるようになります)
フレームワークは単純なセットアップです。サーバーはjava.net.ServerSocket.accept()を実行し、クライアントによる着信接続を処理するスレッドを開始します。これにより、サーバーが存在するホスト/ポートへのjava.net.Socket()が作成されます。が待っています。双方がjava.io.InputStreamとjava.io.OutputStreamを使用し、互いにデータを吐き出し、送信メッセージを組み立て、受信メッセージを解析します。これまでのところ、問題ありません。
これまでのところ、プロトコルはハードコーディングされています。接続の確立とティアダウンはほとんど問題ありませんが、データ交換の部分(私は全二重になりたい)はかなり混乱しています。
それで、私は考えます。これを良い方法で行い、同じ名前のデザインパターンを使用してステートマシンをセットアップしましょう。サーバーとクライアントのそれぞれの状態、遷移が発生するために発生する必要のあるイベントの種類、および遷移が発生したときに実行する必要のあるアクションについては、かなり明確です。それはよさそうだ-紙の上では、つまり。実際には、紙では解決できないいくつかの質問に悩まされてきました。
特に、ステートマシンの入力は...少し多様です。どうすれば、データの書き込み、データの読み取り、接続の確認(接続が閉じているか、切断されている可能性があります)を同時に行うことができますか?また、第1フェーズと第3フェーズでは、応答の待機時間が無限になる可能性を回避するためにタイマーを取得する必要があります。
ですから、理論ステートマシンとコードステートマシンの間のギャップを埋める助けに感謝します。
ところで、私はC / C ++ / C#も読むことができます-Javaに翻訳する必要はありません(これは私が使用しているものです)。