1. 程式人生 > >【socket】 超時連線

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