0

クライアントを受け入れ、ソケット接続ごとにクライアントにサービスを提供する新しいスレッドを作成するオークションサーバーがあります。各スレッドにはプロトコルがあります。サーバーには、Auction オブジェクトのインスタンスが 1 つだけあります。Auctionobject はオブジェクトのリストを保持しLotます。Auctionobject が引数としてクライアント スレッドに渡されます。Protocol入札を行い、何らかの方法ですべてのクライアント スレッドに通知する方法が必要です。makeBidメソッドが存在し、Lot入札リストに入札を入れます。次のステップは、すべてのクライアント スレッド フォームmakeBidメソッドに通知することです。これを行うためのベストプラクティスは何ですか? ここに画像の説明を入力

メッセージを保持するために Thread のフィールド (MSG) を使用しようとしました。!MSG.isEmpty()スレッドは、中にあるかどうかをチェックしrun()ます。If !MSG.isEmpty()thenClientThreadはソケット this に出力しますMSG。もっと良い解決策があると思います。


public class ClientServiceThread extends Thread  {
public String PRINT_NEW_MSG = "";
while (m_bRunThread) {

                if(!PRINT_NEW_MSG.isEmpty()){
                    out.println("PRINT_NEW_MSG: "+PRINT_NEW_MSG);
                    PRINT_NEW_MSG = "";
                String clientCommand = in.readLine();
                                 ...
            }
}
4

2 に答える 2

1

このオブジェクトを使用して「makeBid」メソッドを同期することをお勧めします。次に、notifyAll メソッドを呼び出します

makeBid の最後に。

于 2012-06-02T21:04:15.850 に答える
1

lotUpdated()クライアントがロットに入札するたびにメソッドを呼び出すサブスクリプション デザインを作成できます。それぞれが、通知を受け取りたい にClientThreadサブスクライブします。Lots

public class Lot {
  private List<ClientThread> clients = new ArrayList<ClientThread>();
  private List<Integer> bids = new ArrayList<Integer>();

  public synchronized void subscribe(ClientThread t){
    clients.add(t);
  }

  public synchronized void unsubscribe(ClientThread t){
    clients.remove(t);
  }

  public synchronized void makeBid(int i){
    bids.add(i);
    for (ClientThread client : clients){
      client.lotUpdated(this);
    }
  }
}

public ClientThread {
  public void lotUpdated(Lot lot){
    //called when someone places a bid on a Lot that this client subscribed to
    out.println("Lot updated");
  }
}
于 2012-06-02T21:50:11.250 に答える