Ejemplo n.º 1
0
  public void run() {
    System.out.println("Server started ...");
    System.out.println("Server listening on port: " + port);
    // 监听
    while (true) {
      try {
        int num = 0;
        num = selector.select();

        if (num > 0) {
          Set selectedKeys = selector.selectedKeys();
          Iterator it = selectedKeys.iterator();
          while (it.hasNext()) {
            SelectionKey key = (SelectionKey) it.next();
            it.remove();
            // 处理IO事件
            if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
              // Accept the new connection
              ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
              notifier.fireOnAccept();

              SocketChannel sc = ssc.accept();
              sc.configureBlocking(false);

              // 触发接受连接事件
              Request request = new Request(sc);
              notifier.fireOnAccepted(request);

              // 注册读操作,以进行下一步的读操作
              sc.register(selector, SelectionKey.OP_READ, request);
            } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
              Reader.processRequest(key); // 提交读服务线程读取客户端数据
              key.cancel();
            } else if ((key.readyOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) {
              Writer.processRequest(key); // 提交写服务线程向客户端发送回应数据
              key.cancel();
            }
          }
        } else {
          addRegister(); // 在Selector中注册新的写通道
        }
      } catch (Exception e) {
        notifier.fireOnError("Error occured in Server: " + e.getMessage());
        continue;
      }
    }
  }