基于Netty高性能RPC框架Nifty协议、传输层、编解码( 五 )


private byte[] i32rd = new byte[4];public int readI32() throws TException {byte[] buf = i32rd;int off = 0;if (trans_.getBytesRemainingInBuffer() >= 4) {buf = trans_.getBuffer();off = trans_.getBufferPosition();trans_.consumeBuffer(4);} else {readAll(i32rd, 0, 4);}return((buf[off] }复制代码这里的trans_在前面说过 , 就是TNiftyTransport , 由nifty包提供的 。

  • trans_.getBytesRemainingInBuffer()表示的是内部持有的channelBuffer剩余字节数 , 即bufferEnd - bufferPosition; 如果有四个字节就读取4个字节 , 否则读取所有;
  • buf = trans_.getBuffer()是获取transport内部的的buffer数组;
  • off = trans_.getBufferPosition();是获取transport内部buffer当前读取到的位置 , 即bufferPosition;
  • trans_.consumeBuffer(4);则是transport内部buffer消费4个字节 , 即bufferPosition += 4;
  • 关于返回值 , 注意到16进制的0xff就是二进制的11111111 , 最终结果就是将四个字节拼接在一起构成一个int值
关于readByte,readShort,readLong都是类似的 。
再来看readString:
public String readString() throws TException {int size = readI32();checkStringReadLength(size);if (trans_.getBytesRemainingInBuffer() >= size) {String s = new String(trans_.getBuffer(), trans_.getBufferPosition(), size, "UTF-8");trans_.consumeBuffer(size);return s;}return readStringBody(size);}复制代码首先读取四个字节构成的size , 表示需要读取多少byte从而来构造string 。 在获取buffer和position , 从而从buffer的position位置读取size个字节 , 构造出string;最后需要移动position再返回string结果 。
作者:可以回家加班吗链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。


推荐阅读