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) + " bbLen 0x" + ChannelBuffers.hexDump( ChannelBuffers.copiedBuffer(dat))); } if (message.readableBytes() < bbLen.remaining()) {
bbLen.limit(bbLen.position() + message.readableBytes()); } message.readBytes(bbLen); bbLen.limit(bbLen.capacity()); if (bbLen.remaining() == 0) {
bbLen.flip(); if (LOG.isTraceEnabled()) {
LOG.trace(Long.toHexString(sessionId) +
|