2

私は Java を初めて使用し、現在取り組んでいるアプリケーションに手を加えています。これが私がやろうとしていることです。

QuickServer をサーバーとして使用するクライアント/サーバーのセットアップがあります。私はそれをうまく実行しました。「\ r」\ n」を使用してコマンドを1行ずつ送受信するため、クライアントは

public class CommandHandler extends Thread {
   public void run() {    
      while (connected) {
          //read and write
          if (command.equals("USERNAME")) {
             AsynchEventBusSingleton.$().postEvent(new TellParentToGiveUN())
          }

          ...
      }
}

Thread を拡張しないと GUI がフリーズするため、CommandHandler には独自のスレッドが必要であると推測します。ただし、問題は AsyncEventBusSingleton です。

public class AsyncEventBusSingleton {
private EventBus ebEventBus = null;
final static AsyncEventBusSingleton aebInstance = new AsyncEventBusSingleton();

public synchronized static AsyncEventBusSingleton $() {
    return aebInstance;
}

private AsyncEventBusSingleton() {
    ebEventBus = new AsyncEventBus(Executors.newCachedThreadPool());
}

public void registerSubscriber(Object subscriber) {
    ebEventBus.register(subscriber);
}

public void unRegisterSubscriber(Object subscriber) {
    ebEventBus.unregister(subscriber);
}

public synchronized void postEvent(Object e) {
    ebEventBus.post(e);
}
}

CommandHandler スレッド内でこのクラスを呼び出すと、メイン スレッドの他のクラスはイベントを受け取りません。「同期」キーワードを削除すると、一部のイベントが受信/繰り返し/エラーが生成されます。

CommandHandler からイベントをスローせずに、CommandHandler をインスタンス化するクラスの参照を渡し、CommandHandler のメソッドを呼び出すようにすると、すべてが正常に機能するように見えます。

public class ServerConnectionHandler {
   private CommandHandler commandhandler;

   public void ConnectToServer() {
        commandhandler = new CommandHandler(this);
   }

   public void dispatchServerEvent() {
     commandhandler.sendResponse("MyUN");
   }
}

public class CommandHandler extends Thread {
   private PrintWriter printWriter;
   private ServerConnectionHandler serverconnectionhandler;

   public sendResponse(String s) {
        this.printWriter.println(s);
   }

   public void run() {    
      while (connected) {
          //read and write
          if (command.equals("USERNAME")) {
             this.serverconnectionhandler.dispatchServerEvent();
          }

          ...
      }
}

クライアントに特定のコマンドをリッスンさせ、イベントをディスパッチして応答させるためのベスト プラクティスは何ですか?

4

0 に答える 0