我有許多客戶端正在等待服務器消息。所以客戶端接受()並等待服務器。當服務器有消息時,打開與客戶端的連接併發送消息,然後關閉通信並重啓循環。Java Socket - 反向通信
我通常看到了服務器接受()和客戶端連接的反向方法。我已經編寫了這段代碼,但客戶端(接受())在點上被阻塞,並且服務器(創建到客戶端的連接)在點上被阻塞。
當然我在我的代碼中有一些問題(不知道在哪裏),但是......這是正確的方法?
客戶端(即不接受(),並等待新的消息)
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();
}
服務器試圖讀取一個對象,而不是一條線。 – EJP 2015-04-03 23:26:55