【发布时间】:2015-10-20 17:38:29
【问题描述】:
我知道这个问题已经被问过好几次了。但是,在遵循所有其他问题的建议后,我仍然不知道问题可能是什么。
我有一个服务器和一个客户端。一个简单的乒乓球程序。在运行服务器和客户端并给它一些时间来运行它的过程之后,超时异常开始时不时地抛出......
超时是为了防止阻塞,但是,如果删除,它会导致程序停止。
有没有办法防止这种情况发生?
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);
}
}
}
【问题讨论】:
-
除了 flush() 和 swift 部分,看看这个问题:stackoverflow.com/questions/33106127/…。一旦 serverSocket.accept() 调用创建一个新的 Socket,我更喜欢创建一个线程来处理 IO。创建一个线程并传递客户端 Socket 并在那里做你的 IO
标签: java