我正在尝试使用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);
}
}
}
我知道这是一个常见的问题,但通常的解决方案似乎并没有这样做。
readObject()
将阻止,而没有对象或流的结尾或可用的例外。你有一个无限循环,它应该终止于EOFException
或IOException
以外的任何SocketTimeoutException
,但它没有,所以当然它会阻止,除非对等体是瞬间对象的无穷无尽的来源。