码迷,mamicode.com
首页 > 其他好文 > 详细

zookeeper源码之客户端网络通信模块

时间:2018-02-19 10:55:19      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:err   log   int   stat   empty   public   数据包   封装   soc   

ClientCnxn

  为客户端发送请求到服务端,管理底层IO连接。 将用户调用的请求对象(RequestHeader、Request)封装成Packet对象,存入发送队列。内部有一个线程会不断读取发送队列中的Packet对象,通过NIO将Packet对象发送到服务端,然后将Packet对象放入pending队列,该线程会不断读取服务端的返回信息,并且将结果设置到Packet对象的Response,ReplyHeader对象中。

//等待发送的数据包队列
private final LinkedList<Packet> outgoingQueue = new LinkedList<Packet>();
//发送后等待结果的数据包队列
private final LinkedList<Packet> pendingQueue = new LinkedList<Packet>();

class SendThread extends Thread {
        boolean doIO() throws InterruptedException, IOException {
            ...if (!outgoingQueue.isEmpty()) {
                        ByteBuffer pbb = outgoingQueue.getFirst().bb;
                        sock.write(pbb);
                        if (!pbb.hasRemaining()) {
                            sentCount++;
                            Packet p = outgoingQueue.removeFirst();
                            if (p.header != null
                                    && p.header.getType() != OpCode.ping
                                    && p.header.getType() != OpCode.auth) {
                                pendingQueue.add(p);
                            }
                        }
                    }
                }
            ...
        }
     ...
        @Override
        public void run() {
            ...while (zooKeeper.state.isAlive()) {
                ...if (doIO()) {
                                lastHeard = now;
                             }
                ...
            }
            ...

    }

 通信协议

  通信协议即客户端和服务端之间的序列号和反序列号方式。详见zookeeper源码之通信协议

zookeeper源码之客户端网络通信模块

标签:err   log   int   stat   empty   public   数据包   封装   soc   

原文地址:https://www.cnblogs.com/zhangwanhua/p/8439077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!