【发布时间】:2015-04-04 03:35:59
【问题描述】:
我有许多客户端正在等待服务器消息。所以客户端 make accept() 并等待服务器。当服务器有消息时,打开与客户端的连接并发送消息,然后关闭通信并重新启动循环。
我经常看到相反的方法,服务器执行 accept() 并且客户端连接到它。我已经编写了这段代码,但是客户端(执行 accept() )在点 3 被阻止,服务器(创建与客户端的连接)在点 2 被阻止强>。
当然我的代码有一些问题(不知道在哪里),但是......这是正确的方法吗?
客户端(执行 accept() 并等待新消息)
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();
}
【问题讨论】: