java中socket连接超时默认,socket超时设置
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
爪哇岛中对窝设置超时时间主要有以下两种方式,我们来看一下:(推荐:java视频教程)
方式1:
Socket s=new Socket();
连接(新InetSocketAddress(主机,端口),10000);方式2:
插座s=新插座( 127.0.0.1 ,8080);
s。setsotimeout(10000);那么这两种方式设置的超时时间各自代表了什么意义呢?有什么区别呢?
第1种方式
我们先来看一下第一种方式,我们来测试一下:
在主要的方法中我们创建窝连接到
ip :29.212.19.201,端口:2132
公共静态void main(String[] args) {
插座插座=新套接字();
SocketAddress端点=新InetSocketAddress( 29。212 .19 .201 ,2132);
长时间毫秒=系统。当前时间毫秒();
尝试{
套接字.连接(端点,10000);
} catch (IOException e) {
e。printstacktrace();
}
系统。出去。println(系统。当前时间毫秒()-时间毫秒);
系统。出去。println( end );
}运行这段代码,控制台10秒之前没有任何信息输出,10秒后打印如下信息:
10002
Java。网。套接字超时异常:连接超时
在爪哇。网。dualstackplainsocketimpl。waitforconnect(本机方法)
位于Java。网。dualstackplainsocketimpl。套接字连接(dualstackplainsocketimpl。Java:85)
位于Java。网。abstractplainsocketimpl。doc connect(abstractplainsocketimpl。Java:350)
位于Java。网。abstractplainsocketimpl。connectto address(abstractplainsocketimpl。Java:206)
位于Java。网。abstractplainsocketimpl。connect(abstractplainsocketimpl。Java:188)
位于Java。网。plainsocketimpl。connect(plainsocketimpl。Java:172)
位于Java。网。sockssocketimpl。连接(sockssocketimpl。Java:392)
位于Java。网。插座。连接(插座。Java:589)
位于com。瓦克林。cn。套接字服务器。主服务器(套接字服务器。Java:33)
目标可以看出,我们尝试连接到29.212.19.201:2132时,连接了10秒都没有连接上,于是就报了Java。网。套接字超时异常:连接超时的异常。
解释一下,上述的互联网协议(互联网协议)是一个未知的IP,即我的互联网协议(互联网协议)在当前网络环境中访问不到这个IP,这样我们的这个窝才会去一直尝试连接到此互联网协议(互联网协议)直到超时。如果互联网协议(互联网协议)是一个已知的IP,例如本地127.0.0.1 加上一个未知的端口,那么此窝连接会立马报错。
另外,在不设置连接超时时间的情况下,插座默认大概是21s(测试了3次都是21020毫秒)连接超时。如下是不设置连接超时时间的代码:
插座插座=新插座( 29.212.19.201 ,2132);第2种方式
然后我们来看一下第2种方式,这时候我们需要在我们本地写一套窝服务以及客户端来模拟这个场景。
我们让客户端设置setSoTimeout为10s,在服务端代码拿到客户端请求信息后,休眠10s后再处理客户端请求,返回响应。
我们来看一下效果,关键代码如下:
//服务端
System.out.println(进入休眠,10s后醒来);
线程。睡眠(10000);
System.out.println(休眠结束);
//返回响应
输出流输出流=套接字。获取输出流();//获取一个输出流,向服务端发送信息
PrintWriter PrintWriter=新的PrintWriter(输出流);//将输出流包装成打印流
printWriter.print(你好,服务端已接收到您的信息);
版画家。flush();
//客户端
插座插座=新插座( 127.0.0.1 ,2132);
插座。setsotimeout(10000);//读取的超时时间运行后,等待客户端输出,10s后客户端控制台输出信息如下:
Java。网。套接字超时异常:读取超时
位于Java。网。套接字输入流。套接字读取0(本地方法)
位于Java。网。套接字输入流。套接字读取(套接字输入流。Java:116)
位于Java。网。套接字输入流。读取(套接字输入流。Java:171)
位于Java。网。套接字输入流。读取(套接字输入流。Java:141)
位于星期日nio。cs。流解码器。读取字节(流解码器。Java:284)
位于星期日nio。cs。流解码器。impl read(流解码器。Java:326)
位于sun . nio . cs . stream decoder . read(stream decoder . Java:178)
位于Java . io . inputstreamreader . read(inputstreamreader . Java:184)
位于Java . io . buffered reader . fill(buffered reader . Java:161)
位于Java . io . buffered reader . readline(buffered reader . Java:324)
位于Java . io . buffered reader . readline(buffered reader . Java:389)
位于com . wakling . cn . socket client . main(socket client . Java:36)
10020
这里,结束10s后,客户端报错Java . net . sockettimeoutexception:read超时检查客户端控制台信息正常输出。即使客户端已经报告超时,服务器继续宕机,但是客户端在服务器10s后没有收到发送给自己的消息。
另外,测试显示服务器休眠时间较长,比如500s。当客户端没有设置setSoTimeout时,默认超时是120秒。
差异和意义
下面就来说说两者的意义和区别。
方法一是客户端与服务器的连接超时,即如果10秒内无法建立连接,将会报告Java . net . socket time out exception:connect timed out连接超时异常。此时,两者之间的连接并未建立,更不用说服务器接收来自客户端的消息了。
2.方法是设置inputStream.read()方法的阻塞时间,即客户端发送请求后等待服务器返回响应的时间。超过此时间将导致Java . net . socket time out exception:read timed out异常。此时连接正常建立,服务器收到客户端的请求。
两种控制超时的方式侧重点不同,就像调用一样。第一种方法是打10秒钟,如果你不接电话,我就挂断。第二种方法是10秒不说话就挂电话,10秒不说话就不听了。
更多java知识,请关注java基础课程专栏。以上是Java中设置Socket超时的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。