欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何在Java中設(shè)置Socket超時(shí)時(shí)間

如何在Java中設(shè)置Socket超時(shí)時(shí)間?針對(duì)這個(gè)問(wèn)題,今天小編總結(jié)了這篇文章,希望能幫助更多想解決這個(gè)問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。

創(chuàng)新互聯(lián)是一家專業(yè)提供應(yīng)縣企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為應(yīng)縣眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

方式1:

Socket s=new Socket(); 
s.connect(new InetSocketAddress(host,port),10000);

方式2:

Socket s=new Socket("127.0.0.1",8080);
s.setSoTimeout(10000);

那么這兩種方式設(shè)置的超時(shí)時(shí)間各自代表了什么意義呢?有什么區(qū)別呢?

第1種方式

我們先來(lái)看一下第1種方式,我們來(lái)測(cè)試一下:

在 main 方法中我們創(chuàng)建 Socket 連接到

ip :29.212.19.201,端口:2132

public static void main(String[] args) {
    Socket socket = new Socket();
    SocketAddress endpoint = new InetSocketAddress("29.212.19.201", 2132);
    long timeMillis = System.currentTimeMillis();
    try {
      socket.connect(endpoint, 10000);
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.out.println(System.currentTimeMillis()-timeMillis);
    System.out.println("end");
  }

運(yùn)行這段代碼,控制臺(tái)10秒之前沒(méi)有任何信息輸出,10秒后打印如下信息:

10002
java.net.SocketTimeoutException: connect timed out
  at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
  at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
  at java.net.Socket.connect(Socket.java:589)
  at com.wakling.cn.SocketSever.main(SocketSever.java:33)
end

可以看出,我們嘗試連接到29.212.19.201:2132時(shí),連接了10秒都沒(méi)有連接上,于是就報(bào)了 java.net.SocketTimeoutException: connect timed out 的異常。

解釋一下,上述的 IP 是一個(gè)未知的 IP ,即我的 IP 在當(dāng)前網(wǎng)絡(luò)環(huán)境中訪問(wèn)不到這個(gè) IP ,這樣我們的這個(gè) Socket 才會(huì)去一直嘗試連接到此 IP 直到超時(shí)。如果 IP 是一個(gè)已知的 IP ,例如本地 127.0.0.1 加上一個(gè)未知的端口,那么此 Socket 連接會(huì)立馬報(bào)錯(cuò)。

另外,在不設(shè)置連接超時(shí)時(shí)間的情況下,Socket 默認(rèn)大概是21s(測(cè)試了3次都是21020毫秒)連接超時(shí)。如下是不設(shè)置連接超時(shí)時(shí)間的代碼:

Socket socket = new Socket("29.212.19.201", 2132);

第2種方式

然后我們來(lái)看一下第2種方式,這時(shí)候我們需要在我們本地寫一套 Socket 服務(wù)以及客戶端來(lái)模擬這個(gè)場(chǎng)景。

我們讓客戶端設(shè)置 setSoTimeout 為10s,在服務(wù)端代碼拿到客戶端請(qǐng)求信息后,休眠10s后再處理客戶端請(qǐng)求,返回響應(yīng)。

我們來(lái)看一下效果,關(guān)鍵代碼如下:

//服務(wù)端
System.out.println("進(jìn)入休眠,10s后醒來(lái)");
Thread.sleep(10000);
System.out.println("休眠結(jié)束");
//返回響應(yīng)
OutputStream outputStream = socket.getOutputStream();// 獲取一個(gè)輸出流,向服務(wù)端發(fā)送信息
PrintWriter printWriter = new PrintWriter(outputStream);// 將輸出流包裝成打印流
printWriter.print("你好,服務(wù)端已接收到您的信息");
printWriter.flush();

//客戶端
Socket socket = new Socket("127.0.0.1",2132);
socket.setSoTimeout(10000);//read的超時(shí)時(shí)間

運(yùn)行后,等待客戶端輸出,10s后客戶端控制臺(tái)輸出信息如下:

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)
  at com.wakling.cn.SocketClient.main(SocketClient.java:36)
10020
end

這里10s后客戶端報(bào)錯(cuò) java.net.SocketTimeoutException: Read timed out 查看客戶端控制臺(tái)信息正常輸出,即使客戶端已報(bào)超時(shí),服務(wù)端仍然繼續(xù)往下走,只是客戶端已經(jīng)收不到服務(wù)端10s后發(fā)給自己的消息。

另外經(jīng)測(cè)試發(fā)現(xiàn),服務(wù)端休眠很久很久,如500s,在客戶端不設(shè)置 setSoTimeout 時(shí),默認(rèn)120s超時(shí)。

區(qū)別和意義

下面我們就來(lái)說(shuō)一說(shuō)二者的意義和區(qū)別。

方式1是客戶端與服務(wù)端進(jìn)行連接的超時(shí)時(shí)間,即10秒內(nèi)建立不了連接就報(bào)java.net.SocketTimeoutException: connect timed out 連接超時(shí)的異常。此時(shí)二者未建立連接,更別說(shuō)服務(wù)端收到客戶端的消息了。

方式2是設(shè)置 inputStream.read() 方法的阻塞時(shí)間,即客戶端發(fā)出請(qǐng)求后等待服務(wù)端返回響應(yīng)的等待時(shí)長(zhǎng),超過(guò)這個(gè)時(shí)長(zhǎng)將會(huì)引發(fā) java.net.SocketTimeoutException: Read timed out 異常。此時(shí)二者正常建立連接,服務(wù)端接收到了客戶端的請(qǐng)求。

兩種方式控制超時(shí)的側(cè)重點(diǎn)不同,就像打電話一樣,方法1是打電話10秒你不接電話我就掛了,方法2是打電話接通后,等你10秒不說(shuō)話就掛,10秒后說(shuō)不說(shuō)話都不聽了。

關(guān)于在Java中設(shè)置Socket超時(shí)時(shí)間的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁(yè)名稱:如何在Java中設(shè)置Socket超時(shí)時(shí)間
網(wǎng)頁(yè)鏈接:http://www.chinadenli.net/article22/gjcjjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)小程序開發(fā)ChatGPT域名注冊(cè)定制開發(fā)外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司