public class MyTask extends TimerTask{

public MyTask() { }
@Override
public void run() {
Socket s = null;
int flag=0;
try {
s=new Socket("192.168.0.150", 3456);
s.setSoTimeout(1000);
flag=1;
} catch (UnknownHostException e) {
flag=0;
System.out.println("找不到目标主机......");
} catch (IOException e) {
System.out.println("找不到目标主机......");
}finally
{
try {
if(s!=null)
{
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
if(flag==1)
{
System.out.println("Socket连接已建立......");
}else if(flag==0)
{
System.out.println("找不到目标主机......");
}else
{
System.out.println("未知错误......");
}
}
}上面是我在定时器任务里面写的一个socket连接的client端,我想处理它找不到server端目标主机的异常,由于我的定时器是每2秒执行一次,所以我希望socket如果连接超过1秒就直接报出异常,但s.setSoTimeout(1000);好象并没有达到我想要的效果,哪位给指点下,谢谢!

解决方案 »

  1.   

    这是你的程序的代码:try {
                s=new Socket("192.168.0.150", 3456);
                s.setSoTimeout(1000);
                flag=1;
            }在过了1秒钟以后,程序就会继续向下执行了。如果连接不上就会报错,程序也会终止的所以,不可能实现的。
      

  2.   

    try {
                s=new Socket("192.168.0.150", 3456);
                s.setSoTimeout(1000);
                //在这里要发一个消息到服务器端,如果1秒钟没返回结果,就会timeout
                flag=1;
                       } 
      

  3.   

    不是心跳检测,我只是想每2秒client去连接一次server,由于我的client是java做的,server是C++做的,在这个上不会做长连接,所以就弄成短连接,每两秒去连接次server,从server侧取点数据回来,但如果server的IP地址不存在,我想立即停止尝试连接,到定时器规定时间,再次去连接。
    现在的情况是如果我不设置那个s.setSoTimeout(1000);他要5秒后才抛出异常,5秒时间超过了定时器,导致定时器异常,设置了重新编译之后现在重新部署了下,貌似效果达到了,不过楼上有什么好的意见或说法,欢迎指点,谢谢!
      

  4.   

    楼主理解有错误,当目的IP地址格式错误或者根据主机名无法找到对应的主机,才抛UnknownHostException 。s=new Socket("192.168.0.150", 3456);以这种方式创建socket对象后会立即试图去建立连接,如果Server的IP合法,但是无法建立连接会立即抛java.net.ConnectException,这个时间很短,一般不会超过1秒。
    s.setSoTimeout(1000);用于设置Socket.read()方法允许的阻塞时间,超过这一时间read函数会抛java.net.SocketTimeoutException。
      

  5.   

    可是我在没加s.setSoTimeout(1000);这句的时候测试,s=new Socket("192.168.0.150",3456);如果无法建立连接,它会在5秒之后抛出异常,由于对这个底层的机制不太了解,所以我认为在这5秒之内,它多次去尝试连接,多次尝试连接失败后才抛出异常,不知道我的猜测对不对,了解底层封装的处理机制的哪位给指点下,谢谢!
      

  6.   

    启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。 
      

  7.   

    而且你你的代码似乎根本没运行到这里 System.out.println("~~");
    Socket s = new Socket("192.168.0.150", 3456);
    System.out.println("!!");
    InputStream inputStream = s.getInputStream();
    System.out.println("??");
    s.setSoTimeout(1);
    System.out.println("> <");
    inputStream.read();
      

  8.   

    http://www.cjsdn.com/post/view?bid=1&id=77373看看这个 。。 网站名真有趣。。
    s.setSoTimeout(1);
    跟建立连接的时间没啥关系
      

  9.   

    试一下这样行不行:
    SocketAddress socketaddress = new InetSocketAddress(address,port);
    try{
        socket = new Socket();
        socket.connect(socketaddress,connectTimeOut);
    }catch(Exception e){
    ...
    }