3

私はこのコードで立ち往生していて、本当に重要な何かが欠けていると思います。スレッドが実行されているときは、ベクターにメッセージを追加できますが、notifyを呼び出すとgetNextMessageFromQueue()、待機し続けるように見えます。

メッセージ変数をロックしていますか?

ご協力いただきありがとうございます。

クライアントにすべてのメッセージを送信するディスパッチャクラス:

private Vector<Message> messages = new Vector<Message>(); 

public synchronized void addMessage(Message message) {
    messages.add(message);
    notify(); 
}

private synchronized Message getNextMessageFromQueue() throws InterruptedException { 
    while (messages.size() < 1) {
        wait(); 
    }

    Message message = (Message) messages.get(0); 
    messages.removeElementAt(0);

    return message; 
}

private void sendMessageToAllClients(Message message) {     
    for (int i=0; i < clients.size(); i++) { 
        Client client = (Client) clients.get(i); 
        client.sendMessage(message); 
    } 
}

public void run() { 
    try { 
        while (true) { 
            Message message = getNextMessageFromQueue(); 
            sendMessageToAllClients(message); 
        } 
    } catch (InterruptedException ie) {
        ie.printStackTrace();
    } 
}

ここでクライアントクラス:

private Socket socket;

private ObjectOutputStream out;
private ObjectInputStream in;

public Client(Socket s) throws IOException {
    socket = s;

    out = new ObjectOutputStream(socket.getOutputStream());
    in = new ObjectInputStream(socket.getInputStream());
}

public Socket getSocket() {
    return socket;
}

public void sendMessage(Message message) { 
    try {
        out.writeObject(message);
        out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }           
}

これがの主な呼び出しですaddMessage

Message message = new Message();
message.setMessage("Welcome to " + client.getSocket().getLocalAddress() + ":" + client.getSocket().getPort());

dispatcher.addMessage(message);
4

1 に答える 1

1

行に誤りがあると思いますin = new ObjectInputStream(socket.getInputStream()); 。必要でない場合は削除するか、別の方法で再構築してください。このJava ソケットを読んでください: プログラムは socket.getInputStream() w/o エラーで停止しますか?

inputData が空かどうかを理解するには、socket.getInputStream().available() を使用して、入力バイトのサイズを返します。

于 2013-01-06T13:49:28.317 に答える