我知道这个问题已被问了好几次了。然而,在遵循所有其他问题的建议之后,我仍然坚持问题是什么。新ObjectInputStream导致挂起/超时
我有一个服务器和客户端。一个简单的ping/pong程序。运行服务器,然后运行客户端,并给它一些时间来运行它的过程中,超时异常开始被抛出时不时...
超时有防止块,但是,如果删除,它会导致程序停顿。
有没有办法来防止这种情况发生?
Server.java
public static void main(String args[]) {
try {
ServerSocket serverSocket = new ServerSocket(3000);
while (true) {
Socket socket = serverSocket.accept();
String message = null;
try {
socket.setSoTimeout(3000);
try (ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream())) {
message = (String) objectInputStream.readObject();
System.out.println("Server received " + message);
}
socket.close();
} catch (IOException | ClassNotFoundException ex) {
//This exception is thrown because it hangs, but why does it hang?
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
if ((message != null) && (message.equals("Ping"))) {
try {
Socket pongSocket = new Socket("localhost", 3000);
pongSocket.setSoTimeout(3000);
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(pongSocket.getOutputStream())) {
objectOutputStream.writeObject("Pong");
objectOutputStream.flush();
System.out.println("Server sent Pong");
}
pongSocket.close();
continue;
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
Client.java
public static void main(String args[]) {
while (true) {
try {
Socket pingSocket = new Socket("localhost", 3000);
pingSocket.setSoTimeout(3000);
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(pingSocket.getOutputStream())) {
objectOutputStream.writeObject("Ping");
System.out.println("Client sent Ping");
objectOutputStream.flush();
}
pingSocket.close();
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
除了冲水()ANS迅速一部分,看看这个问题:http://stackoverflow.com/questions/33106127/swift-socket-readline-writeline/33106252#3310 6252。一旦serverSocket.accept()调用创建一个新的Socket,我更愿意创建一个线程来处理IO。创建一个线程并传递客户端Socket并在那里执行你的IO –