首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ByteBuffer 到底如何用?网络编程中一点总结

2012-08-30 
ByteBuffer 到底怎么用?网络编程中一点总结!做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接

ByteBuffer 到底怎么用?网络编程中一点总结!

做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读取到的不是需要转换的对象,而是要直接根据字节流和协议来生成自己的数据对象。

按照之前的编程思维,总是请求然后响应,当然Socket也是请求和响应,不过与单纯的请求响应是不同的。

这里Socket连接往往是要保持住的,也就是长连接,然后设置一个缓冲区,网络流不断的追加到缓冲区。然后后台去解析缓冲区的字节流。

ByteBuffer 到底如何用?网络编程中一点总结

如图所示,网络的流一直在传递,我们收到也许是完成的数据流,也可能是没有传递完的。这里就需要监视管道,不断读取管道中的流数据,然后向缓冲区追加。程序从头开始解析,如果目前缓冲区包含了数据,则解析,没有则放弃继续读取管道流。

就算管道中包含了数据,也不一定包含了完成的数据。例如,100个字节是一个数据体,可是目前缓冲区内包含了120个字节,这就是说缓冲区包含了一条数据,但是还有没有传递完的字节流。那么就要把前100个字节拿出来解析,然后从缓冲区清除这100个字节。那缓冲区就剩下20个字节了,这些数据可能在下次流中补充完成。

如何建立缓冲?

/**  * 全局MVB数据缓冲区 占用 1M 内存  */  private static ByteBuffer bbuf = ByteBuffer.allocate(10240);    /**  * 线程安全的取得缓冲变量  */  public static synchronized ByteBuffer getByteBuffer() {      return bbuf;  }

获取方法加了synchronized,但是获取的ByteBuffer不是线程安全的。
想要线程安全的话:
(1)使用ThreadLocal
(2)每次分配重新分配
(3)每次使用bbuf时synchronized或者加锁
这么牛逼的人物竟然是新申请的号,难道是专门出来灭我们的 3 楼 canghailan 2012-03-08   现在JavaEye的大牛基本都归隐了。。。 4 楼 cuisuqiang 2012-03-09   canghailan 写道现在JavaEye的大牛基本都归隐了。。。
只有我们这些小辈的瞎折腾了

热点排行