if (key.isAcceptable()) { // 接收请求
            ServerSocketChannel server = (ServerSocketChannel) key.channel();
            SocketChannel channel = server.accept();
            channel.configureBlocking(false);
            channel.register(selector, SelectionKey.OP_READ);
        } else if (key.isReadable()) { // 读信息
            SocketChannel channel = (SocketChannel) key.channel();
            int count = channel.read(clientBuffer);
            if (count > 0) {
                clientBuffer.flip();
                CharBuffer charBuffer = decoder.decode(clientBuffer);
                System.out.println("Client >>" + charBuffer.toString());
                SelectionKey wKey = channel.register(selector,
                        SelectionKey.OP_WRITE);
                SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
 }
              问一下 :
                     SelectionKey wKey = channel.register(selector,SelectionKey.OP_WRITE);
                       SelectionKey skTest = wKey.interestOps(4);
                     这两句话的作用有什么区别?
    Server端是通过什么知道一个channel的数据已经全部写到clientBuffer里面了(因为read 方法不堵塞,所以一次读多少是不确定的),一般大家又是通过什么方法判断的呢?

解决方案 »

  1.   

    SelectionKey wKey = channel.register(selector,SelectionKey.OP_WRITE);
    是注册的时候为其添加写事件
    而SelectionKey skTest = wKey.interestOps(4);是注册后为其添加感兴趣的写事件(4对应的就是SelectionKey.OP_WRITE)
      

  2.   

     
     呵呵 做server的 刚开始学NIO 有些问题不太明白。
     
      

  3.   

    需要自己写方法检测数据的完整性
    可以参考下比如mina里的相关实现
      

  4.   

    你的代码前面个会有这selector.select()。这个方法会阻塞,(不是在read方法阻塞)直到有可用的channel可用时,他才会返回。
    然后调用selecter.selectedKeys(),通过迭代key可以找到可用的channel。
    if (key.isReadable()) { // 读信息
    这行表名这个channel可以读数据。
      

  5.   


    SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
    看变量名,就知道,仅仅是用于测试而已
      

  6.   

       channel.register(selector,SelectionKey.OP_WRITE);
       SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
      简单点 这两句话在这里的作用是不是一样的,是不是单独写任何一句都是同样的作用?
      

  7.   

    channel.register(selector,SelectionKey.OP_WRITE);这句是向selecter里注册这个channel的写操作。默认是注册几个事件就关心几个事件。 SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);这句让你的selecter只关心写操作。不关心读操作
      

  8.   

    SelectionKey skTest = wKey.interestOps(SelectionKey.OP_WRITE);
    有了这句话,读操作就不起作用了