所以我有这个Java TCP套接字客户端应用程序。非常简单:
public class Main {
public static void main(String argv[]) throws Exception {
String hostName = "localhost";
int portNumber = 5000;
Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
echoSocket.close();
}
}
现在您可以在while循环中看到,当用户输入内容时。它被发送到服务器。然后客户端等待对服务器的响应。如果服务器只是回应客户端输入的内容,那么这非常有效!
“但是”当服务器没有响应任何东西时,我的程序就会挂起......等待来自服务器的输入永远。
所以我的问题是,如何修改代码,以便在服务器没有返回任何内容时,它不会停止?
我必须使用线程吗? 1,从阅读和发送客户端输入,另一个打印出来自服务器的响应?
答案 0 :(得分:4)
您可以在套接字上使用setSoTimeout()
:
Socket echoSocket = new Socket(hostName, portNumber);
echoSocket.setSoTimeout(10000); // Readings are timeouting after 10 seconds
来自javadoc:
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。如果超时到期,则引发
java.net.SocketTimeoutException
,尽管Socket仍然有效。在进入阻止操作之前,必须启用选项才能生效。超时必须> 0.超时为零被解释为无限超时。<强>参数:强>
超时指定的超时,以毫秒为单位。
因此,当您阅读该行时,您可以这样做:
try {
System.out.println("echo: " + in.readLine());
} catch (SocketTimeoutException ste) {
// Do something
System.out.println("nothing received");
}