不可能不抛出异常的,你设置一下setSoTimeout

解决方案 »

  1.   

    public void ConnectHNM() throws ConnectHNMException{
      try{
        //建立SOCKET连接
        socket = new Socket(ip,HNMPort);
        //成功则状态为1
        State = 1;
        socket.setReceiveBufferSize(5);
        socket.setSendBufferSize(1024);
        }catch(Exception err){
        //失败抛出错误,状态为0
        State = 0;
        socket = null;// or socker.close();
        throw new ConnectHNMException();
        }
      }
    在SERVER端判断,如果连接断了,关闭连接试试看
      

  2.   

    setSoTimeout(int timeout)  Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds.Throws:
       SocketException - if there is an error in the underlying protocol, such as a TCP error.用超时判断
      

  3.   

    怎么搞出个超时出来了? 大家是不是搞错了? 我不是问这个啊。又不是问TCP连接不上,要超时。
    SERVER端也存在和客户端一样的问题啊,如果是中间某个如路由断了,谁也判断不了啊。
      

  4.   

    正如clane说的,不是不抛异常,只是时间未到,把socket的timeout时间设短点。你拔掉服务器端的网线,服务器的socket也会抛异常啊,不可能还会给你发数据了,更何况你这边的socket已经没用了,数据在你新实例化的socket里怎么可能接收到呢?连接是socket之间的一对一,而不是两台机器之间的一对一。我想你的目的是不想重复传输一些数据?
      

  5.   

    socket断了肯定有有异常的,如果你没有捕获到,一定是你的程序有问题。
    建议读写为两个线程。
      

  6.   

    不对,没有异常啊。除非是在本机断了,如:你拔了本机的线,你才会知道,如果拔了其他网络上的设备,你根本就不知道。robber(海盗) 你自己去试试就知道了。
    我的程序已经是多线程了。只不过不是每个连接开一个线程而已。violetrose(violetrose) :
      如果你说的正确的话,能不能说下这个TIMEOUT的含义?
      

  7.   

    假如我的SOCKET一直开着,但是没有数据过来,难道这个TIMEOUT也来个错误给我?!!
      

  8.   

    :)
    搞半天你就没搞懂TimeOut是干嘛的……
    比如设置超时为60秒,则SOCKET每收到一次包就重新开始计时,如果过了60秒还没有新的包到达,就会抛出一个超时异常……你只要捕捉这个异常,然后把SOCKET断开就行了……
      

  9.   

    那你可以发一些没有意义的命令啊……用过FTP软件吗?
      

  10.   

    我想问一下,你的server端有没有使用多线程?如果使用了多线程,那末在通讯过程中出现异常退出时,server端会自动让这个socket消亡。
      

  11.   

    foxnt(吴剑明) :
    只不过不是每个连接开一个线程而已。应该是一个读一个写,至少两个线程。至于你说你情况,我大概了解了。实际不是超时的问题。这种问题需要每隔一段时间发一些数据来监测连接是否已经断掉。这是没有办法的。
      

  12.   

    还是不很明白你到底要做什么。正如你说的,用心跳呗,检测到断了就重新连呗。如果你想记住客户的状态,你就加入session吧,客户初次连接,服务器给客户返回一个clientID,以后客户要求重连,就向服务器发送这个clientID让服务器知道是你不就行了?