最近用SocketChannel进行网络编程比较多,中间也遇到了几个问题,出现的bug也主要来自于对于ByteBuffer的使用不当。现在终于调通了,对ByteBuffer及Socket网络编程也有了更深的认识,特此总结一下。

对于ByteBuffer主要需要注意的是几个标志的含义:position,limit,capability,mark.几个操作的影 响:flip(),clear(),rewind().还有就是在读取或者写入时,标志的变化,比如get()方法导致position加1.

SocketChannel采用的是非阻塞异步读取流数据,在读取的时候,通常是

ByteBuffer.clear();

SocketChannel.read(ByteBuffer);

如果流中有数据,就会把数据从position开始读到ByteBuffer中,在读取之前ByteBuffer的clear操作会把 position置为0,limit置为capability,也就是相当于清空了之前的内容,但是ByteBuffer中数组的内容在read之前是没 有改变的.

read之后,通常就是开始从ByteBuffer中提取读到的数据,如果你的数据是以自己定义的数据包的格式进行发送的,那你还需要判断是否读到 了数据包的结尾,因为对流数据本身来说是没有结尾这一说的。在提取数据之前,要先把position放到开始读取时的位置,把limit放到当前位置,所 以要flip一下,表示从position到limit的位置都是需要的数据。

ByteBuffer.flip();

while(ByteBuffer.hasRemaining()){

bytec=ByteBuffer.get();

if(b==PACKAGE_END){

//you can return the package here

}else{

//you can append the byte here.like StringBuilder.append().

}

}

这样以来也存在一个问题,当一次读到的ByteBuffer不包含完整的数据包或者包含多个数据包.那么就需要在下一次继续把这些包分拆出来.那么在读取数据的代码处就可以改为,这样就把之前读取到的未完整的包保留了下来:

if(!ByteBuffer.hasRemaining){

ByteBuffer.clear();

SocketChannel.read(ByteBuffer);

}

另外一个可能会用到的操作就是ByteBuffer.rewind(),他会把position置为0,limit保持不变,可以用于重复读取一段数据.

ByteBuffer是nio中一个非常方便的工具.设计思想也非常值得借鉴.

java bytebuffer 清空_Java ByteBuffer用法总结相关推荐

  1. java buffer类_Java ByteBuffer类

    我正在从设备读取byte [],并尝试通过ByteBuffer类将其解释为Java中的整数数组,但是我得到了索引超出范围的错误.看这里: byteBuffer.put(bytes); // put t ...

  2. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  3. java 注解使用_Java 注解用法

    Java 注解用法 1.简述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) 与程序元素(类.方 ...

  4. java assert函数_Java Assert 用法简介

    在JDK1.4中增加了Assert的新功能,用于开始.调试时期的错误检测,它可以通过-ea 的JVM参数关闭,关闭以后对程序的性能没有任何影响. 最好的教程 请见:http://java.sun.co ...

  5. java switch 变量_Java switch 用法实例

    首页 > 基础教程 > 循环条件语句 > 条件语句switch Java switch 用法实例 switch允比对一个变量的值,来执行不同情况的代码.switch使用规则如下: 1 ...

  6. java enum使用_java enum用法详解

    我们都知道,enum是java的一个语法糖,实际编译后的文件仍然是一个java类,今天我们就拨开语法糖的外衣,看一看原始的java类应该是什么样的. 首先写一个enum类: enum Color { ...

  7. java contains方法_Java contains用法示例

    学习Demo contains方法:用于判断list集合是否包含某个元素 containsKey方法:用于判断Map键中是否包含某个键 containsValue方法:用于判断map中是否包含某个va ...

  8. java jpanel清空_java怎么清除JPanel里面所有组件并重绘

    我拿我自己正在做的一个界面来介绍一下 这是是解决了清除JPanel组件并能重绘的代码 import java.awt.*; import java.awt.event.ActionEvent; imp ...

  9. java stringbuilder清空_Java中StringBuilder的清空方法比较

    StringBuilder 没有提供clear或empty方法. 清空有3种方法: 1)新生成一个,旧的由系统自动回收 2)使用delete 3)使用setLength 将三种方法循环1000万次,代 ...

最新文章

  1. 生成24位字符串ID__IdGenerator.java
  2. Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?
  3. c语言 内存搜索,怎么在一段内存中搜索一个十六进制串
  4. 通过SEH 非inline hook
  5. 10个最好的 jQuery 视频插件(转)
  6. iOS 12.0-12.1.2 完整越狱支持 Cydia
  7. 康托展开逆展开算法笔记
  8. 2011-5-学习总结
  9. 爬虫教程( 1 ) --- 初级、基础、实践
  10. Oracle 中文排序 Oracle 中文字段排序
  11. iPad横竖屏代码适配
  12. USACO CONTEST FEB07 白银莲花池 silvlily 分析
  13. CVPR 2020 《Graph-Structured Referring Expression Reasoning in The Wild》论文笔记
  14. c8t6高电平电压_什么是高电平和低电平?
  15. LDAP未授权漏洞验证
  16. r语言进行go富集分析_好用的在线GO富集分析工具
  17. charindex 和patindex详解(转)
  18. 运筹学基础(名词解释题总结)
  19. qq飞车与服务器未响应,QQ飞车游戏安装失败系统错误提示问题解决方法_QQ飞车游戏安装失败怎么办_游戏堡...
  20. 主导资源公平DRF:多种资源类型的公平分配

热门文章

  1. 他在BAT等大厂研发10年,总结了12条开发经验给你
  2. JSP+Servlet使用commons-fileupload上传文件连接被重置解决方案
  3. 计算机服务器机房属于什么辐射,服务器机房中的辐射有多大?如何减少服务器机房中的辐射...
  4. ppt如何导出成高清图片
  5. Python语法入门之流程控制if判断
  6. 用easyPoi导出excel,带多sheet,合并单元格,合计,单元格金额类型
  7. 贵阳经开区管委会考察团到访数澜科技,共探城市数据运营解决方案
  8. 华为开发者大会2021鸿蒙系统,鸿蒙2.0来了!华为开发者大会HDC 2020宣布
  9. Scrapy爬取图片网站——最详细的入门爬虫教程,新手入门干货,不进来看一下?
  10. 中文文件如何翻译为英文