名称终被备注代替 2015-05-21 02:04 采纳率: 0%
浏览 3774

java socket connect超时设置无效!

查看了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);
}
}

  • 写回答

1条回答 默认 最新

  • pl3121605999 2015-05-21 02:27
    关注

    应该不能这么理解,所谓超时不过就是在等待对方的反馈,当等待时间到达一个数字之后就是超时了,向你说的这种情况,因为你的服务端是在未开启的状态下,
    所以当客户端试图连接的之后,立即得到了一个反馈 就是 拒绝连接,连接不上,,那么既然已经得到反馈了 也就没什么超时一说了.......
    而你要做的是抓取不同的异常:

     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 (ConnectException e) {
                 System.out.println("连接失败");
                }catch (SocketTimeoutException e) {
                     System.out.println("连接超时");
                }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)