編集 2名前を変更した質問
C# (サーバー) で記述された別のプロセスを開始する Java コード (クライアント) があります。C# プロセスには、ソケットのペアが渡されます (1 対listen
on、1 対reply
)。ソケットで接続を受信するとlisten
、送信されたデータを処理し、reply
ソケット上の同じ IP に応答します。このプロセスは、継続的に実行され、接続をリッスンして応答するように設計されています。常に同じ IP に応答するため、もちろん多くの異なるクライアントからのメッセージを受け入れることができます。Java コードは、プロセスの応答をリッスンします。
非常に基本的なシステムですが、セットアップは 1 つの問題を除いて完全に機能しています。Process.waitFor()
Java コードは、や などのメソッドを使用して、メッセージを送信する前にプロセスが実行されているかどうかを判断しますProcess.exitValue()
。私が抱えている問題は、プロセスが開始してから数秒間、実際にメッセージを受信する準備ができていないことです。
私の質問は、サーバーがクライアントに起動したことを伝えるために使用する最適なパターンは何ですか? 私が考えたオプションは次のとおりです。
- Java プロセスは接続とテスト メッセージの送信を繰り返し試行し、応答を受信したときにのみ停止します
- C# プロセスは、開始時にクライアント IP のリストにブロードキャストします。
- Java は数秒待ってから接続を試みます。
私はオプション1に傾いていますが、上記のオプションのどれも特に好きではありません)。ここで使用する確立されたパターンはありますか?
この通信に既存のフレームワークを使用したくないことに注意してください。実際のメッセージは非常に単純で、メッセージ コードが両端に「手動で」エンコードされ、バイト ストリームにデコードされます。数百行のコードを節約するために、これを変更したくありません。
この種の「最善の方法」の質問は非建設的であるために閉じられる可能性があることは理解していますが、何時間もグーグル検索しても何も思いつきません. どんな助けやアドバイスも大歓迎です:)
編集 - もう少しコンテキスト
ほとんどのクライアント/サーバー関係では、クライアントが接続を試みるかなり前にサーバーを起動する必要がありますが (したがって、この問題を完全に回避できます)、ここでのセットアップは少し異なります。
この場合、クライアントは必要に応じてサーバーを効果的に起動します。さらに、サーバー プロセスが実行されていないことをクライアントが確認できる場合、クライアントは新しいプロセスを開始します。どちらの場合も、クライアントは最初のメッセージを送信する前に、(プロセスが開始されたときだけでなく) サーバーがいつ初期化されたかを知る必要があります。