【socket】 超時連線
阿新 • • 發佈:2018-11-02
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."); } } }