一个Selector可以不只生成一个SelectionKey!如果要把这些客户连接进行分类,建议多监视几个端口!!!
ServerSocketChannel能支持多少个客户连接,这就不知道了呵呵。。

解决方案 »

  1.   

    能有多少个客户端要看操作系统,以及系统资源。正常情况下,几百个肯定没问题。你可以用几个Selector对象分类注册管理。不是一个Selector只能生成一个SelectionKey。是在同一个Selector对象中注册一个ServerSocketChannel或SocketChannel只能生成一个SelectionKey对象
      

  2.   

    还有一个问题:
    public void startServer() throws IOException {
    ...........   
     SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT);    while (acceptKey.selector().select() > 0) {
          try {
                  Thread.currentThread().sleep(1);
                }
                catch (Exception ex) {
                }      Set readyKeys = sel.selectedKeys();
          Iterator it = readyKeys.iterator();      while (it.hasNext()) {
            SelectionKey key = (SelectionKey) it.next();
            it.remove();
            if (key.isAcceptable()) {
              System.out.println("Key is Acceptable");
              ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
              socket = (SocketChannel) ssc.accept();
              socket.configureBlocking(false);
              SelectionKey another = socket.register(sel,        //此处设置有什么用?
                                                     SelectionKey.OP_READ |
                                                     SelectionKey.OP_WRITE);
            }
            if (key.isReadable()) {//此处的key.isReadable()在什么条件下才会执行
              System.out.println("Key is readable");
              String ret = readMessage(key);
              if (ret.length() > 0) {
                writeMessage(socket, ret);
              }
            }
            if (key.isWritable()) {//此处的key.isWritable()在什么条件下才会执行
              String ret = readMessage(key);
              socket = (SocketChannel) key.channel();
              if (result.length() > 0) {
                System.out.println("SendMSG:"+result);
                writeMessage(socket, ret);
              }
            }
          }
        }
      }
    为什么客户端连接后发送消息总是由key.isWritable()这一块进行处理
      

  3.   

    1.注册这个socket对象到selector对象中。selector对象select的时候会观察这个socket对象是否准备好进行读和写,如果准备好进行操作,就将相应的SelectionKey对象放入readyKeys中。2.key.isReadable: 当对端发数据过来,selector察觉到就会把SelectionKey放入readyKeys 中,同时改变对象内部状态,使key.isReadable()返回true。这时就可以进行读操作了3.我觉得,是当socket的缓冲区有空的时候,selector察觉到就会把SelectionKey放入readyKeys中,同时改变对象内部状态,使key.isWritable()返回true。这时就可以进行写操作了。
      

  4.   

    谢谢大家!
    我测试了一把发现:
    SelectionKey another = socket.register(sel,SelectionKey.OP_READ)
    这样key.isReadable是可以起作用的,而且发送也没有问题.如果是
    SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE)
    这样就算是把key.isWritable屏蔽掉,key.isReadable也是不起作用的,
    这是为什么?