查看了jdk的api后,Socket的connect(SocketAddress endpoint, int timeout)第二个参数是可以设置超时时间的,在时间没有到之前,连接请求会一直阻塞。
 我代码如下:
 try {
 String path = "/";
 String host = "127.0.0.1";
 int port = 8079;
 Socket socket = new Socket();
 InetSocketAddress address=new InetSocketAddress(host, port);
 socket.connect(address,30000);
 System.out.println("连接成功");
 ........... 
 } catch (Exception e) {
 System.out.println(e.getMessage());
 }
 }
 
 我没有开启服务器,直接启动的客户端,我是预计在30秒超时后跳到异常,但现实是,连接设置的超时无效,直接跳到了异常
 Connection refused: connect
 请教这是什么问题?莫非api里面写的阻塞超时设定就是坑我?根本不是阻塞的?不支持超时设置?
 我目前用下面的手动循环连接来做连接超时的: 
 int i=0;
 while(!socket.isConnected()){
 try{
 socket.connect(address,3000);
 }catch (Exception e) {
 System.out.println("超时失败:"+i+"次");
 i++;
 if(i>30){break;}
 Thread.sleep(1000);
 }
 }
 
 
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
怎么会坑你呢?
你理解错了,超时异常抛出SocketTimeoutException,
你catch的是啥?你catch了 Exception (这样写好么?
你说你都没开服务端,那意味着远程套接字不可用,客户端的套接字已经确定连接没戏了,此时应该抛出的是IOException,还等条毛的超时?
######嗯,知道了,我刚才试了连www.youtube.com:80,的确可以触发超时,我之前那个异常是socket已经判定失败了,就没有阻塞直接就返回异常了