java中Socket設(shè)置超時時間的兩種方式
Socket設(shè)置超時時間的兩種方式
方法1
調(diào)用Socket的connct 方法打開連接,并設(shè)置連接超時時間
Socket socket = new Socket() socket.connect(new InetSocketAddress(ip, port), 3000); //設(shè)置超時3000毫秒
以上代碼是設(shè)置Socket的連接超時時間,當(dāng)連接超時時,會拋出如下異常:

在不設(shè)置連接超時時間的情況下,socket默認(rèn)的超時時間應(yīng)該是20毫秒左右(我試了5次大概都是20毫秒就會拋出異常)
方法2
調(diào)用Socket的setSoTimeout 方法設(shè)置io讀取/寫出超時時間
socket.setSoTimeout(5000); //設(shè)置超時時間5000毫秒 OutputStream out = socket.getOutputStream(); InputStream in = socket.getInputStream();
當(dāng)socket創(chuàng)建的IO流讀取或?qū)懗龀^了設(shè)定時間時,就會拋出異常
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
如果不設(shè)置setSoTimeout的話,默認(rèn)的io流讀寫超時時間大概是120秒(真是相當(dāng)久?。?/p>
整理一下二者的區(qū)別
雖然兩種超時拋出的異常都是SocketTimeoutException ,但是第一種連接超時,出現(xiàn)這種異常一般是ip或者端口填錯了。而第二種情況能出現(xiàn)的話,說明連接肯定建立成功了,可能是通訊的另一端響應(yīng)的過慢,導(dǎo)致等待數(shù)據(jù)傳達(dá)的過程中超時了。
用一個現(xiàn)實生活中的例子的話。第一種情況就是打電話過去沒人接,等了10秒都沒人接我就掛了。第二種情況就是電話打通了,我等了你10秒你不給我說話,那我就掛了
設(shè)置socket超時時間的那些坑
通常情況下 這樣設(shè)置socket超時時間
方式1
final Socket socket = new Socket("ip","port");//自動開始連接ip
?
socket.setSoTimeout(Constants.userRequestOutTime);//設(shè)置超時時間
OutputStream outStream = socket.getOutputStream();方式2
? ? ? ? final Socket socket = new Socket(); ? ? ? ? InetSocketAddress socketAddress = new InetSocketAddress(Constants.ip, ? ? ? ? ? ? ? ? Integer.parseInt(Constants.port)); ?? ? ? ? ? //設(shè)置 超時時間 ? ? ? ? socket.setSoTimeout(Constants.userRequestOutTime); ? ? ? ? socket.connect(socketAddress);//開始連接ip ? ? ? ?// ? ? ? OutputStream outStream = null; ? ? ? InputStream inStream = null;
但是 發(fā)現(xiàn) 在服務(wù)端沒有開啟的情況下 超時時間實際是30s,不是所設(shè)置的,結(jié)果研究發(fā)現(xiàn)
socket.setSoTimeout設(shè)置的是讀取/輸入io流數(shù)據(jù)時的超時時間 //-- socket.connect(socketAddress, Constants.userRequestOutTime);
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring MVC參數(shù)自動綁定List的解決方法
這篇文章主要為大家詳細(xì)介紹了Spring MVC參數(shù)自動綁定List的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
基于SpringBoot實現(xiàn)上傳2種方法工程代碼實例
這篇文章主要介紹了基于SpringBoot實現(xiàn)上傳工程代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
java對象轉(zhuǎn)成byte數(shù)組的3種方法
這篇文章主要為大家詳細(xì)介紹了java對象轉(zhuǎn)成byte數(shù)組的3種方法,具有一定的參考價值,感興趣的朋友可以參考一下2018-06-06
Intellij IDEA集成JProfiler性能分析工具
作為Java程序員,性能分析是我們必須掌握的技能之一,在性能分析中,JProfiler是一款非常強(qiáng)大的工具,本文就來介紹一下Intellij IDEA集成JProfiler性能分析工具,就有一定的參考價值,感興趣的可以了解一下2023-12-12
SpringBoot整合EasyExcel實現(xiàn)批量導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合EasyExcel實現(xiàn)批量導(dǎo)入導(dǎo)出功能的相關(guān)知識,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2024-03-03

