⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpreactor.java

📁 java实用系统开发指南里面包含好多很好的系统讲解
💻 JAVA
字号:
package com.jdon.jserver.connector.tcp;

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;

import com.jdon.util.Debug;

/**
 * TCP包接受核心功能类
 * <p>Copyright: Jdon.com Copyright (c) 2003</p>
 * <p>Company: 上海解道计算机技术有限公司</p>
 * @author banq
 * @version 1.0
 */
public class TCPReactor implements Runnable {

  private final static String module = TCPReactor.class.getName();

  private final Selector selector;
  private final ServerSocketChannel ssc;

  public TCPReactor(int port) throws IOException {

    selector = Selector.open();
    ssc = ServerSocketChannel.open();

    InetSocketAddress address =
        new InetSocketAddress(InetAddress.getLocalHost(), port);
    ssc.socket().bind(address);
    Debug.logVerbose("-->Start host:" + InetAddress.getLocalHost() + " port=" +
                     port);

    ssc.configureBlocking(false);
    //向selector注册该channel
    SelectionKey sk = ssc.register(selector, SelectionKey.OP_ACCEPT);

    //利用sk的attache功能绑定Acceptor 如果有事情,触发Acceptor
    sk.attach(new Acceptor(selector, ssc));

    Debug.logVerbose("-->TCP Server started");
  }

  public void run() {

    while (true) {
      try {

        selector.select();
        Set selected = selector.selectedKeys();
        Iterator it = selected.iterator();
        //Selector如果发现channel有OP_ACCEPT或READ事件发生,下列遍历就会进行。
        while (it.hasNext())

          //来一个事件 第一次触发一个accepter线程
          //以后触发SocketReadHandler
          dispatch( (SelectionKey) (it.next()));
        selected.clear();
      } catch (IOException ex) {
        Debug.logError("reactor error" + ex, module);
      }

    }
  }

  //运行Acceptor或SocketReadHandler
  private void dispatch(SelectionKey key) {
    Runnable r = (Runnable) (key.attachment());
    if (r != null) {

      r.run();
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -