ZooKeeper源码分析之NIOServerCnxn

本文深入分析了ZooKeeper中NIOServerCnxn的实现,详述了其关键属性、构造函数以及核心的IO处理函数doIO()。在构造函数中,初始化Socket通道并设置相关参数,doIO()主要负责读写操作,而readPayload()和handleWrite()分别处理读取请求和响应写入。通过这些函数,ZooKeeper实现了高效的NIO通信机制。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

NIOServerCnxn继承了ServerCnxn抽象类,使用NIO来处理与客户端之间的通信。

源码分析

(1)属性

	//日志
    private static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxn.class);
    //基于NIO的ServerCnxn工厂
    private final NIOServerCnxnFactory factory;
    //面向流的连接套接字的可选择的通道
    private final SocketChannel sock;
    //Selector线程
    private final SelectorThread selectorThread;
    //表示可选择的通道在Selector中注册的标记
    private final SelectionKey sk;
    //是否初始化标志
    private boolean initialized;
    //分配四个字节缓冲区,以及赋值
    private final ByteBuffer lenBuffer = ByteBuffer.allocate(4);
    private ByteBuffer incomingBuffer = lenBuffer;
    //创建缓冲队列
    private final Queue<ByteBuffer> outgoingBuffers = new LinkedBlockingQueue<ByteBuffer>();
    //会话超时
    private int sessionTimeout;
    //会话ID
    private long sessionId;

(2)构造函数,在构造函数中会对Socket通道进行相应设置,如设置TCP连接无延迟、获取客户端的IP地址并将此信息进行记录,方便后续认证,最后设置SelectionKey感兴趣的操作类型为read。

    public NIOServerCnxn(ZooKeeperServer zk, SocketChannel sock, SelectionKey sk, NIOServerCnxnFactory factory, SelectorThread selectorThread) throws IOException {
   
        super(zk);
        //设置socket通道
        this.sock = sock;
        this.sk = sk;
        this.factory = factory;
        this.selectorThread = selectorThread;
        if (this.factory.login != null) {
   
            this.zooKeeperSaslServer = new ZooKeeperSaslServer(factory.login);
        }
        sock.socket().setTcpNoDelay(true);
        /* 设置linger为false,以便在socket关闭时不会阻塞 */
        sock.socket().setSoLinger(false, -1);
        //获取IP地址
        InetAddress addr = ((InetSocketAddress) sock.socket().getRemoteSocketAddress()).getAddress();
        //认证信息中添加IP地址
        addAuthInfo(new Id("ip", addr.getHostAddress()));
        //设置感兴趣的操作类型
        this.sessionTimeout = factory.sessionlessCnxnTimeout;
    }

(3)核心函数——doIO(),该函数主要是进行IO处理

    void doIO(SelectionKey k) throws InterruptedException {
   
        try {
   
            if (!isSocketOpen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值