本帖最后由 theflycloud 于 2011-01-25 11:33:47 编辑

解决方案 »

  1.   

    长话短说,给你看篇文章
    http://julyboxer.javaeye.com/blog/298244
    希望对你有帮助
      

  2.   

    为防止重复迭代要执行remove,在执行selector.select()时,
    会自动加入去掉的key。
      

  3.   

    while (true) // 不断的轮询
    {
    debug("NBTest: Starting select"); // Selector通过select方法通知我们我们感兴趣的事件发生了。
    nKeys = selector.select();
    // 如果有我们注册的事情发生了,它的传回值就会大于0
    if (nKeys > 0) {
    //debug("NBTest: Number of keys after select operation: " + nKeys); // Selector传回一组SelectionKeys
    // 我们从这些key中的channel()方法中取得我们刚刚注册的channel。
    Set selectedKeys = selector.selectedKeys();
    Iterator i = selectedKeys.iterator();
    while (i.hasNext()) {
    s = (SelectionKey) i.next();
    //printKeyInfo(s);
    //debug("NBTest: Nr Keys in selector: "
    // + selector.keys().size()); // 一个key被处理完成后,就都被从就绪关键字(ready keys)列表中除去
    i.remove();
    if (s.isAcceptable()) {
    // 从channel()中取得我们刚刚注册的channel。
    Socket socket = ((ServerSocketChannel) s.channel())
    .accept().socket();
    SocketChannel sc = socket.getChannel(); sc.configureBlocking(false);
    sc.register(selector, SelectionKey.OP_READ
    | SelectionKey.OP_WRITE);
    //System.out.println(++channels);
    debug("NBTest: Channel  acceptable");
    } else {
    debug("NBTest: Channel not acceptable");
    }
    }
    } else {
    debug("NBTest: Select finished without any keys.");
    } }我也是刚学,网上找的代码不是已经remove了么,但是还是不行