Java socket有两种timeout :
建立连接timeout,
读取数据timeout,
注意:如果想实现超时连接,需要采用一下方式进行socket连接
Socket socket = null;
socket=new Socket();
socket.connect(new InetSocketAddress("localhost", 8080),1000);
错误方式:
Socket s = new Socket(String host, String port);
建立连接timeout,
当不设置该参数时,指客户端请求和服务端建立tcp连接时,会一直阻塞直到连接建立成功,或抛异常。当设置了connectTimeout, 客户端请求和服务端建立连接时,阻塞时间超过connectTimeout时,就会抛出异常java.net.ConnectException: Connection timed out: connect。
读取数据so timeout
这个参数通过socket.setSoTimeout(int timeout)方法设置,可以看出它的意思是,socket关联的InputStream的read()方法会阻塞,直到超过设置的so timeout,就会抛出SocketTimeoutException。当不设置这个参数时,默认值为无穷大,即InputStream的read方法会一直阻塞下去,除非连接断开。
总结
可以通过设置connect timeout来控制连接建立的超时时间
可以通过设置so timeout可以控制流读取数据的超时时间(注意位置)。
package socket;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author TSY
*
* @Date: 2018-08-15
*
*
*/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server连接已创建。。。。。");
Socket accept = serverSocket.accept();
System.out.println("Server连接已关闭。。。。。");
}
}
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class Client {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
Socket socket = null;
socket=new Socket();
long t1 = 0;
try {
t1 = System.currentTimeMillis();
socket.connect(new InetSocketAddress("localhost", 8080),1000);
socket.setSoTimeout(2000);
System.out.println("Client已建立连接。。。。。。");
System.out.println("Connected.");
InputStream inputStream = socket.getInputStream();
System.out.println("reading...");
inputStream.read();
System.out.println("read end");
} catch (SocketTimeoutException e) {
long t2 = System.currentTimeMillis();
e.printStackTrace();
System.out.println(" Connect failed, take time -> " + (t2 - t1) + "ms.");
}catch (IOException e) {
long t2 = System.currentTimeMillis();
e.printStackTrace();
System.out.println(" Connect failed, take time -> " + (t2 - t1) + "ms.");
}
}
}