【socket】 超时连接

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.");
        }
	}
}

猜你喜欢

转载自blog.csdn.net/myblogzz/article/details/81701968