我的程序在“in.readObject()”中被卡住/阻塞,即使是flush()

问题描述 投票:2回答:1

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

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);                    
            }
        }
}

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

java multithreading sockets flush
1个回答
0
投票

readObject()将阻止,而没有对象或流的结尾或可用的例外。你有一个无限循环,它应该终止于EOFExceptionIOException以外的任何SocketTimeoutException,但它没有,所以当然它会阻止,除非对等体是瞬间对象的无穷无尽的来源。

© www.soinside.com 2019 - 2024. All rights reserved.