可以假定客户收到c1000@@!@!@!#@!#数据的时候必须在10秒内回送一个'Kkkk(*&3493"否则认为客户已经断线,断开连接,这个就是协议

解决方案 »

  1.   

    服务器端要求客户端定时发送空数据包过来,如果没收到相应客户端的数据包!关闭socket!
    还可以在服务器端直接多每个socket进行连接超时设置,详细见JDK API 说明Socket部分!
      

  2.   

    1.手动设置协议,如接收到"disconnect"则断开连接
    2.socket.setSoTimeout(Timeout); //设置超时
      

  3.   

    考虑用其他通信模型,例如各平台均支持的SELECT。如果你不用它并使用非阻塞就不能单单以READ返回0来判断是否断线,如果能与客户端保持协议就最好,但因为你客户端不是自己写的所以没办法,有一个方法不知道可行不,在服务器端记录每个SOCKET的数据收发时间,开一个线程检查每个SOCKET的时间是否超过一定范围的时间,如果是则CLOSE并移除记录。
      

  4.   

    定时接受客户端发过来的消息,要是发生异常,根据异常判断Socket是否断开~~~~~~~~
      

  5.   

    专业的搜索引擎技术提供商(磐志搜索),访问www.panzhi.net了解详细介绍。
      

  6.   

    JAVA 爱好者加群  38236097
    JAVA 爱好者加群  38236097
      

  7.   

    这是个老问题了,算个经典的问题吧。----------------------------------------------------
    不能通过阻塞在Socket.read方法,当抛出异常时将其断开!
    ----------------------------------------------------为什么不能,不要以为NEW I/O读取一个关闭了的Socket时不会抛出异常,而是什么也读不到。
    你这样解理是错误的。新IO一样会抛出异常。
    “服务器永远也不会关闭连接,它等待客户端中断Socket。当Socket中断时,会抛出一个异常。”这是《java网络编程》第三版399页一个句话,详见第十二章 非阻塞I/O 中ChargenServer.java。
      

  8.   

    因为项目的原因,很久没上来了!
       楼上说的那本书,我找了份英文的看了一下(没有页脚),似乎那个ChargenServer的例子也没有针对这方面的处理!
       另外,“不能通过阻塞在Socket.read方法,当抛出异常时将其断开!”我说这句话不是说做不到,而是由于需求或者其他原因,不能在读取某个连接的时候阻塞这个线程。
       也可能是对你的回复理解有误,希望能给出更具体的处理方式,若确实解决,300分一定奉上!
      

  9.   

    补充说明一下,服务器和客户端的连接需要保持很久,而且通常会有很长一段时间没有与业务相关的数据包通讯,并且双方遵循一个开放的应用协议,无法额外的加入一些测试数据。
      示例如下:在一个循环体内执行如下代码段:
    Set selectedKeys=selector.selectedKeys();
    Iterator iterator=selectedKeys.iterator();
    while(iterator.hasNext()){
      SelectionKey selectionKey=(SelectionKey)iterator.next();
      try{
        if(!selectionKey.isValid()) destroy(selectionKey);
        if(selectionKey.isAcceptable()) accept(selectionKey,selector);
        if(selectionKey.isConnectable()) connect(selectionKey);
        if(selectionKey.isReadable()) read(selectionKey);
        if(selectionKey.isWritable()) write(selectionKey);
      }catch(Exception e){
        destroy(selectionKey);
      }
      iterator.remove();
    }
    如此来在单个线程中实现为多客户端服务,所有的通道被设置为非阻塞模式。当客户端关闭或者断开时,selector只是为选择该键,并且由于没有数据供写入或读出,根本不会发生异常!
    服务器不能主动关闭连接,除非确定这个客户端已经断开!
      

  10.   

    zoeg(沉香),你的邮箱是多少?
    我发邮箱跟你交流吧!
      

  11.   

    看这里,向一个已经关闭了的Client写东西会报错:使用非阻塞IO读取时,如果客户端已经关闭,它会立刻报错而不是读取不到任何东西。
    即如果客户端已经关闭,再对从集合中取出的selector进行操作就会报错。
    SocketChannel client = (SocketChannel) key.channel();
    ByteBuffer buffer = (ByteBuffer) key.attachment();
    try {
        client.write(buffer);
    } catch (IOException e) {
        org.apache.log4j.Logger.getLogger(ChargenServer.class)
                .info("向通道写buffer时出错,Client端可能已经关闭。"+e.getMessage());
        // 客户端断开时,再读取会抛出异常
        key.cancel(); // 取消对应的键
        try {
            key.channel().close();// 关闭对应的通道
        } catch (IOException cex) {
        }
        e.printStackTrace();
    }