我有很多客户端在等待服务器消息。所以客户端使用accept()并等待服务器。当服务器有消息时,打开与客户端的连接并发送消息,然后关闭通信并重新启动循环。
我通常看到逆向方法,服务器接受()并且客户端连接到它。我已经编写了这段代码,但客户端(确实接受())在 3 点被阻止,而服务器(创建与客户端的连接)在 2 >上被阻止
当然我的代码有些问题(不知道在哪里),但是......这是正确的方法吗?
客户端(接受()并等待新消息)
try {
System.out.println("Waiting..");
receiver = serverSocket.accept();
System.out.println("1");
ObjectInput fromServerReader = new ObjectInputStream(receiver.getInputStream());
ObjectOutputStream toServerWriter = new ObjectOutputStream(receiver.getOutputStream());
System.out.println("2");
toServerWriter.writeObject("dummy");
toServerWriter.flush();
System.out.println("3");
ScheduledEvent scheduledEvent = (ScheduledEvent) fromServerReader.readObject();
System.out.println("4");
receiver.close();
System.out.println("5");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// Should never happen
}
服务器(当有新消息发送给客户端时,创建 连接)
try {
InetAddress address = InetAddress.getByName(sendToUser
.getMachineName());
socket = new Socket(address, port);
log.debug("1");
ObjectOutputStream toClientWriter = new ObjectOutputStream(
socket.getOutputStream());
ObjectInputStream fromClientReader = new ObjectInputStream(socket.getInputStream());
log.debug("2");
String read = (String)fromClientReader.readObject();
log.debug("3");
// Compose the message
ScheduledEvent scheduledEvent = new ScheduledEvent();
scheduledEvent.setSubject(event.getSubject());
scheduledEvent.setMessage(event.getText());
log.debug("4");
toClientWriter.writeObject(scheduledEvent);
toClientWriter.flush();
log.debug("5");
socket.close();
log.debug("6");
} catch (UnknownHostException e) {
// TODO handle
e.printStackTrace();
} catch (IOException | ClassNotFoundException e) {
// TODO handle
e.printStackTrace();
}
答案 0 :(得分:1)
在客户端代码中,而不是使用
PrintWriter writer;
使用
ObjectOutputStream writer;
然后使用
writer.writeObject("dummy");
writer.flush();
答案 1 :(得分:-1)
尝试使用println
代替write
toServerWriter.println("dummy");
。服务器可能正在等待换行符。