1. 程式人生 > >zookeeper源碼之客戶端網絡通信模塊

zookeeper源碼之客戶端網絡通信模塊

pri ext res buffer 底層io != quest code final

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源碼之客戶端網絡通信模塊