本帖最后由 xiajun868 于 2011-09-15 15:38:39 编辑

解决方案 »

  1.   

    不要接收到连接就注册SelectionKey.OP_WRITE事件,那个事件基本上管道不堵塞一直就绪的。先只注册可读事件。socketChannel.register(selector, SelectionKey.OP_READ,buffer);
    当需要写数据时才这样注册一个可写事件。socketChannel.register(selector, SelectionKey.OP_WRITE, buffer);
      

  2.   

    补充一下。
    数据写完后,记得将写事件取消掉。
    key.interestOps(SelectionKey.OP_READ);
      

  3.   

    非常感谢etnet的帮助。问题解决了。现在遇到另一个问题:
      就是我客户端主线程main注册了读事件 socketChannel.register(selector, SelectionKey.OP_READ);
      子线程有写需求时注册写事件socketChannel.register(selector, SelectionKey.OP_WRITE);
    socketChannel 是主类的成员变量。
    现在是能接收到服务端的信息,客户端却发发不出去了。
      

  4.   

    数据写完后,记得将写事件取消掉。
    key.interestOps(SelectionKey.OP_READ);
     
      

  5.   

    SelectionKey.OP_WRITE事件取消了。
    key.interestOps(SelectionKey.OP_READ);写操作完成后这句话已经加上了
      

  6.   

    有点要注意一下,关于同步的问题。
    定义一个同步变量。final Object synchronizedObj = new Object();
    运行时注册事件需要在同步块中完成。
      synchronized (synchronizedObj) {
             selector.wakeup();
             channel.register(selector, SelectionKey.OP_WRITE, manager);
      }
    同时在事件的循环中也需要进行同步synchronized (synchronizedObj) {}
    一个空的同步块就行了。
      

  7.   

    if (key.isReadable()) {
    //receive(key);     你要不读取的话, 会一直有读取事件。  死循环。
    }ByteBuffer buffer = ByteBuffer.allocate(1024); 这据代码, 在循环里面, 是会要你命的哦。