服务器端如果不发送就让它处于长期接收状态(不设置setSoTimeout或设为0,然后运行
socket.receive();)。
这样客户端一断就会抛出异常的。

解决方案 »

  1.   

    SocketServer.setSoTimeout(int timeOut);
      

  2.   

    sock.isInputShutdown()在客户端开辟一个线程,时刻监测sock.isInputShutdown()返回是否为true如果是,说明该连接没有断开,如果返回为false则说明已经断开,在该情况下发送UDP数据包向服务段,服务段接受、判断断开连接~
      

  3.   

    开一线程定期对socket进行测试,如可以试图getOutputStream如果懒一点就用 beyond_xiruo的SocketServer.setSoTimeout(int timeOut);
    不过这个灵活性不如上面的
      

  4.   

    如果是TCP协议,客户断线时,read/write会抛出IOException try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
            String str;
            while ((str = rd.readLine()) != null) {
                process(str);
            }
            rd.close();
        } catch (IOException e) {
           //客户断线处理
        }   try {
            BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            wr.write("aString");
            wr.flush();
        } catch (IOException e) {
           //客户断线处理
        }
      

  5.   

    服务端Accept的Socket空闲时,一般都在用read等待客户端的请示
      

  6.   

    服务端Accept的socket空闲时,一般都在read等待客户的请求
      

  7.   

    客户断线:
      (发生异常)Exception{
        //-->发送错误给服务嚣(另一线程)
       }服务嚣:
    在启动时不断在某端口监听(在另一线程Thread)
      

  8.   

    客户端定期向服务器发送消息证明自己还活着(消息内容是不为空的字符串之类的)
    服务器开辟一个监听线程,如果一段时间没有受到客户端的消息,就判定其死掉
    具体可以用timer实现
      

  9.   

    实际上是这样的。  断开后,socket还可以写,并没有IOException发生。读,那就更不好说了。 因为我现在读不到数据可能是因为 客户端  没有发送数据过来。超时的说发和我要的是两码事。我是说断开了我如何知道?  而不是我去断开,就是因为网络原因 或者客户端关闭,我的socket被断开了连接。不过还是谢谢各位的解答。希望,还有参与者!
      

  10.   

    socket.setKeepAlive(true)如果底层连接出了问题,会产生SocketException
      

  11.   

    try 

    ServerSocket server = new ServerSocket(listenPort); 
    Socket incomingConnection = null; 
    while (true) 

    incomingConnection = server.accept(); 


    catch (BindException e) 

    System.out.println("Unable to bind to port " + listenPort); 

    catch (IOException e) 

    System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort); 

    这样可以么
      

  12.   

    setKeepAlive(boolean on)
    会断线了有例外吗?有的话,就是这个问题。
      

  13.   

    use listen! programming socket in delphi can use it.
      

  14.   

    Delphi我不知道,不过VC,断线了会通知到程序。setKeepAlive(boolean on)这个函数出现例外,是该函数调用时的,但是,我是其他时候断的线怎么办?前面说过了,发消息的方法不可行的原因。
    虽然TCP是通过返回判断连接是否断开了的。  但是,这个不是底层,更何况,底层已经被封装了。
      

  15.   

    Server.accept()是返回Socket的。当没有Socket返回时,就一直在这里等。
    当返回Socket后,就跟飞狐说的一样了。
      

  16.   

    遇到同样的问题。在我的代码里,客户端关闭后,服务器端接受到SocketException: Connection Reset。用这个可以判断的吧。
      

  17.   

    补充:是SocketInputStream的readLine()方法抛出的。
      

  18.   

    SocketInputStream 这个类没有找到。我不一定非要用readLine方法。因为特殊需求,必需采用其他方法。
      

  19.   

    我用的是ObjectInputStream(不能换用其他的,因为特别需求)。
      

  20.   

    read/writ时应该会抛出异常的,在catch块里给服务器发消息咯
      

  21.   

    1、“断开后,socket还可以写,并没有IOException发生”:奇怪哦,java里有参数可以在断网的情况下,继续读到在流中的剩余数据。
    2、客户端没有发送数据过来:read将阻塞,或返回0,和客户断开java里根本是不同处理。
    3、我是说断开了我如何知道?  一般客户端断开,肯定在服务端有异常抛出的。不必做啥判断的,直接处理。
    4、你写个程序试一下就知道了。
      

  22.   

    各位 所说 某非不知道。只是,事实不如所言。即使客户端关闭窗口,这样这个客户端的socket已经关闭,服务器会断开连接。所以,对我,根本不用关系他到底是因为 网络故障 还是客户端 导致的断线  造成的。至于程序,如果不写,我怎么敢断言不行?  何况是求教。网络程序,我还是做的不少,五子棋是做的第一个。其它,因为公司机密和非一言能详,不便相告。
      

  23.   

    顺便,TCP/IP自身就是通过发送消息超时得知断线的。  最为高层,没有必要再次实现,而且会导致性能下降。
    算了。  谢谢各位好意!