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网别的相干文章!