我尝试使用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;
}
我知道这是一个常见的问题,但通常的解决方案似乎并没有这样做。
答案 0 :(得分:0)
readObject()
将阻塞。你有一个无限循环,它应该在EOFException
或除IOException
之外的任何SocketTimeoutException
终止,但它不会,所以当然它会阻止,除非对等是永恒的瞬间物体来源。