你好,这分为两种情况。Socket.connect连接超时有二种情况:
创新互联是一家企业级云计算解决方案提供商,超15年IDC数据中心运营经验。主营GPU显卡服务器,站群服务器,电信内江机房,海外高防服务器,成都机柜租用,动态拨号VPS,海外云手机,海外云服务器,海外服务器租用托管等。
1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间。
这在国外访问weibo时,并且网络环境极差的情况下有可能发生。解决的办法:调大socket.connect方法中的timeout参数值,比如50s,linux默认最高是70s,如果超过70s没有意义,linux会采用70s.但是当调大之后,发现不到10s就报timeout exception。
通过国外的机器ping api.weibo.com发现unreachable。说明客户端在传输层之下的网络层就发现连个Syn的报文都发不出去,更不用说三次握手了,客户端直接失败并抛timeout exception。经验:在connection timeout诊断的第一步应该是ping一下确认网络层没有问题。注:客户端设置了timeout,但并不会等到超时才返回异常。客户端只要第一时间发现连接失败,就会抛timeout exception。
2.如果timeout设置的时间足够,但是由于服务器端的处理能力较差,比如缓冲连接队列较小,而应用层的处理能力没有连接缓冲快,导致缓冲连接占满,而拒绝新的连接。
在服务端因为连接队列占满而拒绝服务的期间,客户端的通过TCP协议重试三次。每次的时间翻倍。
如果三次时间的累加
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消.
非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的
一、你调用read的时候,实际上调用的是socketchannel的read方法,而你设置的阻塞模式是ServerSocketChannel的模式,所以调用read时依然会采用默认的阻塞方式,如果你希望用非阻塞的方式,只要设置一下socketchannel的阻塞模式就OK了。
二、默认情况下,read的方法是阻塞模式的,所以没有办法设置他的超时时间,如果客户端异常退出,当前的连接将永远等待下去,如果你修改成非阻塞模式就没有这个问题了,非阻塞模式你可以判断read返回值,如果超过N时间返回值一直都是0,就把当前的连接关闭。
三、我并没有这样混合用过,还没遇到过这样的问题,我猜想有可能是跟关闭的socketchannel、socket等等有关吧,可能关闭socket和关闭channel有些区别,我也不确定,反正建议你,想要NIO就用NIO,要是想要serversocket和scoket,那就只用这两个,尽量不要混合使用。希望对你有帮助。
到此,以上就是小编对于socketaccept阻塞的问题就介绍到这了,希望这3点解答对大家有用。
当前文章:socket超时什么意思?windowssocket阻塞
分享网址:http://www.shufengxianlan.com/qtweb/news46/26996.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联