0

現在、サーバー/クライアント - アプリケーションを実装しようとしていますが、問題が発生しました。解決策が見つかりません。

ログインをServer待っている を実行し、それらを に追加し、それぞれに新しいものを開始して、個々のリクエストなどを処理します。ClientscachedThreadPoolRunnableClient

サーバーが処理を行った後にブロードキャストする必要がある、これらの要求に対する応答がいくつかあります。

        this.mOos = new ObjectOutputStream(this.mSocket.getOutputStream());
        this.mOos.flush();
        this.mOis = new ObjectInputStream(this.mSocket.getInputStream());

        while(true)
        {
            Object o = this.mOis.readObject();

            if(o !=null && this.mInputList.size() < 20)
            {
                this.mInputList.add(o);
            }

            if(!this.mInputList.isEmpty())
            {
                handleIncomingObject();
            }

            if(!this.mOutputList.isEmpty())
            {                       
                try 
                {
                    this.mOos.writeObject(this.mOutputList.remove(0));
                    this.mOos.flush();
                    this.mOos.reset();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }               
        }

今私が問題を抱えているのは、リクエストを処理するときです:

handleIncomingObject();

これは放送する必要があります。

私のアプローチはExecutorService、実行可能ファイルを作成するときにオブジェクトへの参照を与えて、さまざまなスレッドのスレッドプールにアクセスできるようにすることです。

ご覧のとおり、すべてのクライアントは独自のものを持っています

LinkedList<Object> mInputList
LinkedList<Object> mOutputList

着信メッセージと発信メッセージをバッファリングします。

私はhandleIncomingObject()次のようなことをしたいと思います:

//assume exec as ExecutorService
for(Thread t : exec)
{
        mOutputList.add(new Message(message));
}

すべてのヘルプや提案を事前に感謝します。

こんにちは、ベン。

4

1 に答える 1

1

すべてのクライアントを含むベクターを使用し、このベクターを繰り返し処理してブロードキャスト メッセージを送信します。次のような方法を使用できます。

public static synchronized void broadcast(Message msg) {
    for(Client c : vector) {
        c.mOutputList.add(msg);
    }
}
于 2014-06-15T13:16:06.807 に答える