[英]Java Socket - Inverse Communication
我有許多正在等待服務器消息的客戶端。 因此,客戶端使accept()並等待服務器。 當服務器收到消息時,打開與客戶端的連接並發送消息,然后關閉通信並重新啟動周期。
我通常會看到相反的方法,即服務器執行accept()並由客戶端連接到該方法。 我已經編寫了這段代碼,但是客戶端(做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();
}
在客戶端代碼中,而不是使用
PrintWriter writer;
采用
ObjectOutputStream writer;
然后用
writer.writeObject("dummy");
writer.flush();
嘗試使用println
而不是write
toServerWriter.println("dummy");
。 服務器可能正在等待換行符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.