3

UDP に基づくチャット クライアントの作成に取り組んでいます。主な構造は、クライアントが登録するサーバーがあり、クライアントがサーバーに登録されている別のクライアントとの接続を要求できることです。クライアントは、疑似コードを使用した次のような構造です。

public UDPClient() {
    // Create datagram socket

    // Execute RECEIVE thread using datagram socket above
    // Execute SEND thread using datagram socket above
}

アイデアは、送信と受信を別々のスレッドで実行して、受信時にブロックされた I/O を取得しないようにすることです。これらのスレッドはどちらも run メソッド内にループを持っているため、メッセージを継続的に送受信できます。私が抱えている問題はこれです。SEND の実行方法を変更するメッセージが RECEIVE スレッドに届いた場合、これを SEND スレッドに伝えるにはどうすればよいですか? 自分自身にデータグラムを発射する必要がありますか、それともコードでこれを何らかの方法で伝えることができますか?

4

3 に答える 3

1

SEND スレッドには、RECEIVE スレッドからアクセスできるパブリック (アクセス可能な) メソッド (可能であれば同期) が必要です。このメソッドを使用して、.send(yourPacket); あなたのSENDスレッドから。

于 2012-10-12T17:47:07.937 に答える
1

両方のスレッドが相互に参照していないと仮定して、読み取り/送信スレッド (クラス) の両方が参照する 3 番目のシングルトンvolatileクラスを作成します。このクラスには、共有する状態データを格納するためのメンバー フィールドがあり、synchronizedアクセスできます。

このvolatileキーワードを同期アクセスと組み合わせることで、あるスレッドによってフィールドに加えられた変更が別のスレッドに表示されることが保証されます。これがないと、Java メモリ モデルの仕様により、変更が表示されない場合があります。

編集:

「懸念の分離」設計ガイドラインに従って、読み取り/送信スレッドがお互いを認識しないようにし、3 番目のクラスを使用してそれらのアクティビティ/動作を調整することをお勧めします。などへの読み取り/送信クラスにメソッドを追加しstop()start()他のクラスからこれらを呼び出します。

別のクラスを使用すると、次のことも可能になります。

  • 管理 Web ページの「送信停止」ボタンなど、他の手段による動作制御
  • 各タイプの複数のスレッドを許可しながら、中心点を介して適切に制御し、おそらくそのようなスレッドのプールを使用します (個別のクラスがなければ、多対多の悪夢と、関係のない多くのコードが発生します)目の前の仕事: つまり終了と受信)
  • ワーカー クラスのテストがより簡単になります。
  • 他の用途のためにスタンドアロンで移植/埋め込む
于 2012-10-12T17:53:56.833 に答える
0

コードが読み取り可能なメンバー変数を READ メソッドに用意し、その変数に基づいて SEND メソッドを変更します。

于 2012-10-12T17:37:00.953 に答える