1

ファーストクラスでは、クライアントソケットをリッスンするメソッド「listen」があります

public void listen() throws IOException {       

        while (true) {
            socket = this.serverSocket.accept();

            DataOutputStream out = new DataOutputStream( socket.getOutputStream() );
            this.outputStreams.put(socket, out);


            Thread miltiServer;

            miltiServer = new Thread() {
                @Override
                public void run() {                    
                    InputStream sin = null;

                    try {                   
                        sin = socket.getInputStream();
                        ObjectInputStream in = new ObjectInputStream(sin);
                        message = (AgentData) in.readObject();

                    } catch (ClassNotFoundException ex) {

                    } catch (IOException ex) {

                    } 
                }
            };

            miltiServer.start();
        }

2番目のクラスでは、クライアントソケットから受信したメッセージを読み取って分析する必要があります。他のクラスでメッセージを取得する方法がわかりません。Callableインターフェースを使用することを考えていますが、それを使用すると、returnステートメントは不定詞サイクルを終了します。

4

1 に答える 1

2

Secondソケット リスナーがメッセージをクラスに伝達する簡単な方法は、 BlockingQueue. リスナーはソケット入力ストリームから読み取り、呼び出しqueue.put(...)てメッセージをキューに追加します。

次に、2 番目のクラスはqueue.take();、キューに追加されたときに各メッセージを返すループ呼び出しになります。無制限のメッセージをキューに入れたい場合は、うまくいきますLinkedBlockingQueue。メッセージを抑制したい場合は、 などの制限付きキューArrayBlockingQueueがより適切な場合があります。

両方のスレッドが同じものを共有する必要がBlockingQueueあるため、それを作成して両方のスレッドに渡すか、クラスに次のSecondような名前のメソッドを配置し、クラス内に配置する必要があります。次に、リスナーは を呼び出します。addMessage(...)BlockingQueueSecondsecond.addMessage(...);

于 2012-10-26T18:30:37.090 に答える