java中Socket設(shè)置超時(shí)時(shí)間的兩種方式
Socket設(shè)置超時(shí)時(shí)間的兩種方式
方法1
調(diào)用Socket的connct 方法打開(kāi)連接,并設(shè)置連接超時(shí)時(shí)間
Socket socket = new Socket() socket.connect(new InetSocketAddress(ip, port), 3000); //設(shè)置超時(shí)3000毫秒
以上代碼是設(shè)置Socket的連接超時(shí)時(shí)間,當(dāng)連接超時(shí)時(shí),會(huì)拋出如下異常:
在不設(shè)置連接超時(shí)時(shí)間的情況下,socket默認(rèn)的超時(shí)時(shí)間應(yīng)該是20毫秒左右(我試了5次大概都是20毫秒就會(huì)拋出異常)
方法2
調(diào)用Socket的setSoTimeout 方法設(shè)置io讀取/寫出超時(shí)時(shí)間
socket.setSoTimeout(5000); //設(shè)置超時(shí)時(shí)間5000毫秒 OutputStream out = socket.getOutputStream(); InputStream in = socket.getInputStream();
當(dāng)socket創(chuàng)建的IO流讀取或?qū)懗龀^(guò)了設(shè)定時(shí)間時(shí),就會(huì)拋出異常
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流讀寫超時(shí)時(shí)間大概是120秒(真是相當(dāng)久?。?/p>
整理一下二者的區(qū)別
雖然兩種超時(shí)拋出的異常都是SocketTimeoutException ,但是第一種連接超時(shí),出現(xiàn)這種異常一般是ip或者端口填錯(cuò)了。而第二種情況能出現(xiàn)的話,說(shuō)明連接肯定建立成功了,可能是通訊的另一端響應(yīng)的過(guò)慢,導(dǎo)致等待數(shù)據(jù)傳達(dá)的過(guò)程中超時(shí)了。
用一個(gè)現(xiàn)實(shí)生活中的例子的話。第一種情況就是打電話過(guò)去沒(méi)人接,等了10秒都沒(méi)人接我就掛了。第二種情況就是電話打通了,我等了你10秒你不給我說(shuō)話,那我就掛了
設(shè)置socket超時(shí)時(shí)間的那些坑
通常情況下 這樣設(shè)置socket超時(shí)時(shí)間
方式1
final Socket socket = new Socket("ip","port");//自動(dòng)開(kāi)始連接ip ? socket.setSoTimeout(Constants.userRequestOutTime);//設(shè)置超時(shí)時(shí)間 OutputStream outStream = socket.getOutputStream();
方式2
? ? ? ? final Socket socket = new Socket(); ? ? ? ? InetSocketAddress socketAddress = new InetSocketAddress(Constants.ip, ? ? ? ? ? ? ? ? Integer.parseInt(Constants.port)); ?? ? ? ? ? //設(shè)置 超時(shí)時(shí)間 ? ? ? ? socket.setSoTimeout(Constants.userRequestOutTime); ? ? ? ? socket.connect(socketAddress);//開(kāi)始連接ip ? ? ? ?// ? ? ? OutputStream outStream = null; ? ? ? InputStream inStream = null;
但是 發(fā)現(xiàn) 在服務(wù)端沒(méi)有開(kāi)啟的情況下 超時(shí)時(shí)間實(shí)際是30s,不是所設(shè)置的,結(jié)果研究發(fā)現(xiàn)
socket.setSoTimeout設(shè)置的是讀取/輸入io流數(shù)據(jù)時(shí)的超時(shí)時(shí)間 //-- socket.connect(socketAddress, Constants.userRequestOutTime);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java8通過(guò)CompletableFuture實(shí)現(xiàn)異步回調(diào)
這篇文章主要介紹了Java8通過(guò)CompletableFuture實(shí)現(xiàn)異步回調(diào),CompletableFuture是Java?8?中新增的一個(gè)類,它是對(duì)Future接口的擴(kuò)展,下文關(guān)于其更多相關(guān)詳細(xì)介紹需要的小伙伴可以參考一下2022-04-04java通過(guò)jni調(diào)用opencv處理圖像的方法
今天小編就為大家分享一篇java通過(guò)jni調(diào)用opencv處理圖像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08SpringBoot配置文件、多環(huán)境配置、讀取配置的4種實(shí)現(xiàn)方式
SpringBoot支持多種配置文件位置和格式,其中application.properties和application.yml是默認(rèn)加載的文件,配置文件可以根據(jù)環(huán)境通過(guò)spring.profiles.active屬性進(jìn)行區(qū)分,命令行參數(shù)具有最高優(yōu)先級(jí),可覆蓋其他所有配置2024-09-09springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程
網(wǎng)上關(guān)于寶塔運(yùn)行springBoot的東西說(shuō)有點(diǎn)迷糊,但是有一句話很重要,Spring boot項(xiàng)目只需要JDK環(huán)境即可部署成功,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程,需要的朋友可以參考下2023-05-05SpringCloud?hystrix斷路器與全局解耦全面介紹
什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁(yè)面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作2022-10-10