| public void receiveMessage(ChannelBuffer message) {
try {
while(message.readable() && !throttled) {
if (bb != null) { //ByteBuffer不为空 if (LOG.isTraceEnabled()) {
LOG.trace("message readable " + message.readableBytes() + " bb len " + bb.remaining() + " " + bb); ByteBuffer dat = bb.duplicate(); dat.flip(); LOG.trace(Long.toHexString(sessionId) + " bb 0x" + ChannelBuffers.hexDump( ChannelBuffers.copiedBuffer(dat))); } //bb剩余空间大于message中可读字节大小 if (bb.remaining() > message.readableBytes()) {
int newLimit = bb.position() + message.readableBytes(); bb.limit(newLimit); } // 将message写入bb中 message.readBytes(bb); bb.limit(bb.capacity()); if (LOG.isTraceEnabled()) {
LOG.trace("after readBytes message readable " + message.readableBytes() + " bb len " + bb.remaining() + " " + bb); ByteBuffer dat = bb.duplicate(); dat.flip(); LOG.trace("after readbytes " + Long.toHexString(sessionId) + " bb 0x" + ChannelBuffers.hexDump( ChannelBuffers.copiedBuffer(dat))); } if (bb.remaining() == 0) { // 已经读完message,表示内容已经全部接收 packetReceived(); // 统计接收信息 bb.flip(); ZooKeeperServer zks = this.zkServer; if (zks == null || !zks.isRunning()) {
//Zookeeper服务器为空 ,说明服务端挂了 throw new IOException("ZK down"); } if (initialized) {
//处理客户端传过来的数据包 zks.processPacket(this, bb); if (zks.shouldThrottle(outstandingCount.incrementAndGet())) {
disableRecvNoWait(); } } else {
LOG.debug("got conn req request from " + getRemoteSocketAddress()); zks.processConnectRequest(this, bb); initialized = true; } bb = null; } } else { //bb为null的情况,大家自己去看,我就不细讲了 if (LOG.isTraceEnabled()) {
LOG.trace("message readable " + message.readableBytes() + " bblenrem " + bbLen.remaining()); ByteBuffer dat = bbLen.duplicate(); dat.flip(); LOG.trace(Long.toHexString(sessionId) +
|