1

ソケットプログラミングとJavaUDPシンプルクライアントサーバーアプリケーションのプログラミングは初めてです。私は時間/日付サーバークライアントを書いています。クライアントはサーバーに日時を要求でき、応答を待ちます。また、サーバーは毎分、すべてのクライアントを現在の時刻で更新します。クライアントはする必要があります

  1. サーバーとの接続を開始し、メッセージが返されるのを待つことができます

  2. サーバーからの定期的な更新をリッスンします

単一のDatagramSocketを使用してこれを行うにはどうすればよいですか?

私は2つのスレッドを作成することを考えていました。1つはリッスンし、もう1つは書き込みします。問題は、クライアントがサーバーとの接続を開始する場合、サーバーからの確認応答を受信するまで待機する必要があることです。そのため、書き込みスレッドはサーバーからのパケットをリッスンする必要がある場合もあります。しかし、この場合、2つのスレッドがリッスンしていて、間違ったスレッドが確認応答を受け取ります。

どのスレッドが入力を取得するかを指定する方法はありますか?または、この問題を解決する他の方法はありますか?

私はこの答えを探していましたが、見つけることができませんでした。私が見つけた最も近いものはJavaソケットです。あるスレッドから送信して別のスレッドで受信できますか?

4

1 に答える 1

0

ライター スレッドが 1 つしかない場合は、リクエストを送信して待機ループに入る可能性があります。次に、リスナー スレッドは応答を取得し、それを共有変数 (おそらくAtomicReference) に追加してから、応答を受信したことをライターに通知します。

  // both write and listener threads will need to share this
  private final AtomicReference<Response> responseRef =
     new AtomicReference<Response>();
  ...
  // writer-thread
  writeRequest(request);
  synchronize (responseRef) {
     while (responseRef.get() == null) {
        // maybe put a timeout here
        responseRef.wait();
     }
  }
  processResponse(response);
  ...

  // listener-thread
  Response response = readResponse();
  synchronize (responseRef) {
     responseRef.set(response);
     responseRef.notify();
  }

複数のライターまたは複数のリクエストが同時に送信されている場合は、さらに複雑になります。各リクエストである種の一意の ID を送信し、それをレスポンスで返す必要があります。その後、応答スレッドは要求と応答を一致させることができます。ConcurrentHashMapレスポンダーが特定のリクエストを照合し、レスポンスを追加し、適切な待機スレッドに通知できるようにするには、または他の共有コレクションが必要です。

于 2012-10-23T22:40:56.470 に答える