旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

Java中对Socket设置超时时候【JAVA教程】,Java

作者:搜教程发布时间:2019-11-29分类:JAVA教程浏览:25评论:0


导读:java中对Socket设置超时时候主要有以下两种体式格局,我们来看一下:(引荐:java视频教程)体式格局1:Sockets=newSocket();s....

java中对Socket设置超时时候主要有以下两种体式格局,我们来看一下:(引荐:java视频教程)

体式格局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);

那末这两种体式格局设置的超时时候各自代表了什么意义呢?有什么区分呢?

第1种体式格局

我们先来看一下第1种体式格局,我们来测试一下:

在 main 要领中我们竖立 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");
  }

运转这段代码,掌握台10秒之前没有任何信息输出,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时,衔接了10秒都没有衔接上,于是就报了 java.net.SocketTimeoutException: connect timed out 的非常。

解释一下,上述的 IP 是一个未知的 IP ,即我的 IP 在当前收集环境中接见不到这个 IP ,如许我们的这个 Socket 才会去一向尝试衔接到此 IP 直到超时。假如 IP 是一个已知的 IP ,比方当地 127.0.0.1 加上一个未知的端口,那末此 Socket 衔接会立马报错。

别的,在不设置衔接超时时候的情况下,Socket 默许大概是21s(测试了3次都是21020毫秒)衔接超时。以下是不设置衔接超时时候的代码:

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

第2种体式格局

然后我们来看一下第2种体式格局,这时候我们需要在我们当地写一套 Socket 效劳以及客户端来模仿这个场景。

我们让客户端设置 setSoTimeout 为10s,在效劳端代码拿到客户端要求信息后,休眠10s后再处置惩罚客户端要求,返回相应。

我们来看一下结果,症结代码以下:

//效劳端
System.out.println("进入休眠,10s后醒来");
Thread.sleep(10000);
System.out.println("休眠完毕");
//返回相应
OutputStream outputStream = socket.getOutputStream();// 猎取一个输出流,向效劳端发送信息
PrintWriter printWriter = new PrintWriter(outputStream);// 将输出流包装成打印流
printWriter.print("你好,效劳端已吸收到您的信息");
printWriter.flush();

//客户端
Socket socket = new Socket("127.0.0.1",2132);
socket.setSoTimeout(10000);//read的超时时候

运转后,守候客户端输出,10s后客户端掌握台输出信息以下:

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后客户端报错 java.net.SocketTimeoutException: Read timed out 检察客户端掌握台信息一般输出,纵然客户端已报超时,效劳端依然继承往下走,只是客户端已收不到效劳端10s后发给本身的音讯。

别的经测试发明,效劳端休眠很久很久,如500s,在客户端不设置 setSoTimeout 时,默许120s超时。

区分和意义

下面我们就来说一说两者的意义和区分。

体式格局1是客户端与效劳端举行衔接的超时时候,即10秒内竖立不了衔接就报java.net.SocketTimeoutException: connect timed out 衔接超时的非常。此时两者未竖立衔接,更别说效劳端收到客户端的音讯了。

体式格局2是设置 inputStream.read() 要领的壅塞时候,即客户端发出要求后守候效劳端返回相应的守候时长,凌驾这个时长将会激发 java.net.SocketTimeoutException: Read timed out 非常。此时两者一般竖立衔接,效劳端吸收到了客户端的要求。

两种体式格局掌握超时的侧重点差别,就像打电话一样,要领1是打电话10秒你不接电话我就挂了,要领2是打电话接通后,等你10秒不说话就挂,10秒后说不说话都不听了。

更多java学问请关注java基础教程栏目。

以上就是Java中对Socket设置超时时候的细致内容,更多请关注ki4网别的相干文章!

标签:Java


欢迎 发表评论: