我的程序卡在/#34; in.readObject()"即使有了flush()

时间:2015-12-14 02:14:27

标签: java multithreading sockets flush

我尝试使用Java与多线程客户端和服务器实现聊天(服务器正在运行2个线程/客户端,1个用于接收,1个用于发送),现在我正在使用#m; m在执行in.readObject();时客户端遇到问题。 我搜索了大多数答案是由于flush() in缺少flush()会阻止,但是我已经在任何地方插入run()来发送消息,甚至之后初始化流。我知道我发送了一条消息,但客户似乎没有收到消息。 客户端仅使用1个线程来接收和发送。 客户端目前陷入以下行中的obj = in.readObject(); 方法。

public Cliente(JTextArea panel, String Utilizador, String destinatario,String title){
    super();
    this.panel = panel;
    this.Utilizador = Utilizador;
    this.destinatario = destinatario;
    this.title = title;

    try {
        cliente = new Socket(host,porto);
        out = new ObjectOutputStream(cliente.getOutputStream());
        out.flush();
        in = new ObjectInputStream(cliente.getInputStream());

    } catch (Exception e) {
        e.printStackTrace();
    }

}


public void run() {
    System.out.println("Inside RUN! (Receiving) - Cliente");

        System.out.println("in variable declared - Cliente");
        //escuta as mensagens do servidor e mostra no painel
        while(true){
            Object obj;
            try{
            //----------------------------------------------
            System.out.println("Last sentence. RIP");
            obj = in.readObject(); // MUDAR MUDAR MUDAR MUDAR MUDAR MUDAR MUDAR  MUDAR MUDAR  MUDAR MUDAR  MUDAR MUDAR
            System.out.println("Recebido um objecto - Cliente");
            if(obj instanceof Message){
                String mensagem;
                mensagem = ((Message) obj).getMessage();
                mensagem += "\n";
                panel.append(mensagem+"\n");
                GuardarConversa();
            }       
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

//envia mensagens ao servidor
public void enviarMsg(Message msg){
    try {
        System.out.println("A Enviar msg! - Client.java");
        out.writeObject(msg);
        out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是客户端代码。 (对不起混合语言)

private void EnviarMensagem(){

    //EnviarListaContactos();

    while(true){
            Message msg;
            if(MessageQueue.getMessage().getDestiny().equals(MyName)){

                System.out.println("Encontrada uma mensagem na fila - EnviarDados");

                msg = MessageQueue.getMessage();
                try {
                    System.out.println("A enviar mensagem para o cliente - Enviar Dados");
                    out.writeObject(msg);
                    out.flush();
                    System.out.println("Mensagem enviada - Enviar Dados");
                    System.out.println("Out="+out);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                MessageQueue.removeMessage(msg);                    
            }
        }
}

这是服务器类,只是发件人。这似乎是在传递信息。

.jumbotron {
    background-color:transparent !important; 
}

我知道这是一个常见的问题,但通常的解决方案似乎并没有这样做。

1 个答案:

答案 0 :(得分:0)

当没有对象或流的结尾或可用的异常时,

readObject()将阻塞。你有一个无限循环,它应该在EOFException或除IOException之外的任何SocketTimeoutException终止,但它不会,所以当然它会阻止,除非对等是永恒的瞬间物体来源。