java socket 字节读取_Java SocketChannel 读取ByteBuffer字节的处理模型
在JAVA中的流分为字节流或字符流,一般来说采用字符流处理起来更加方便。字节流处理起来相对麻烦,SocketChannel中将数据读取到ByteBuffer中,如何取出完整的一行数据(使用CRLF分隔)?
例如:
Socket收到的内容为:
1234567890CRLF
0123456789CRLF
注意:CRLF为回车换行符号
如果使用 SocketChannel.read(ByteBuffer buff)读取数据,如果buff的capatity为12, 则第一次读取的数据为 “1234567890CRLF” 刚好为一行,但是如果buff的capatity小于12,则要读取两次以上才能读到CRLF回车换行符号。如果buff.capatity大于12,则会读取到第二行的数据,那么下次读取操作时,如何处理第一次多读到的数据? 这个问题与 "回推流" 类似。
为解决此问题,并实现与“回推流”类似的功能。建立如下的处理模型
Source、Cursor接口实现从Channel中读取字节,并实现回推功能。
Source.ready() 函数返回已经从Channel中读取的数据。如果Buffer中还有数据,则返回Buffer中剩余的自己数,如果Buffer中的字节都已经读取了,则重新从Channel中读取数据到Buffer中。如果没有数据可以读取了,则返回-1;
Source.ready(byte[] dst, int off, int len) 函数重Buffer中读取数据到 dst中。
Source.reset(int len) 函数在Buffer层面上实现回退,即设置Buffer.position。
Cursor接口对Source接口进一步封装,同时提供push函数扩展了reset的回推功能。
Cursor.push(byte[] src, int off, int len) 将byte[]中的数据回推到Cursor中,下次读取操作时将把push进去的数据读取出来。
Consumer接口使用consumer函数从Cursor中读取数据,并进行相应的处理。根据不同的业务逻辑继承Consumer接口处理Cursor中的数据。
java socket 字节读取_Java SocketChannel 读取ByteBuffer字节的处理模型相关推荐
- java 读文件 二进制_JAVA中读取文件(二进制,字符)内容的几种方法总结
JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代码,需要的可以直接复制使用 public cla ...
- java 快速读文件_java快速读取文件
如何优雅读取文件,java想简单读写一个文件都要上10行代码.幸好guava和apache commons 都有提供简单操作文件工具. 简单介绍读取文件最后一行.读取文件第一行.读取大文件.往大文件追 ...
- java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...
java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...
- java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端
没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客 户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送 如何从Soc ...
- java socket远空_JAVA Socket超时浅析
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...
- java socket 报文解析_java socket解析和发送二进制报文工具(附java和C++转化问题)
解析: 首先是读取字节: /*** 读取输入流中指定字节的长度 * * 输入流 * *@paramlength 指定长度 *@return指定长度的字节数组*/ public static byte[ ...
- java socket 聊天室_java利用Socket实现聊天室功能实例
导读热词 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人. 目录结构: ChatClient: package com.p ...
- java字节字符_java中字符和字节的区别
byte(字节): byte即字节的意思,是java中的基本数据类型,用来申明字节型的变量,一个字节包含8个位,所以,byte类型的取值范围是-128到127. 通常在读取非文本文件时(如图片,声音, ...
- java socket 连接邮箱_Java与邮件系统交互之使用Socket验证邮箱是否存在
最近遇到一个需求:需要验证用户填写的邮箱地址是否真实存在,是否可达.和普通的正则表达式不同,他要求尝试链接目标邮箱服务器并请求校验目标邮箱是否存在. 先来了解 DNS之MX记录 对于DNS不了解的,请 ...
最新文章
- Oracle CDC配置案例
- 微软转型里程碑:云计算收入首次超过Windows业务
- ora-01033:oracle initializationgorshutdown 处理方法
- jquery easyui datagrid 排序列
- 开启多媒体台式计算机过程,计算机硬件的组成多媒体教学课件制作
- POJ - 2083 Fractal(dfs,递归画图)
- 这也许是你不曾留意过的 Mybatis 细节
- LeetCode 987. 二叉树的垂序遍历(递归/循环)
- NGUI字体贴图压缩以及相关Shader解读
- Android Studio增加assets目录、raw目录
- SGU 210 Acdream 1227 Beloved Sons KM
- .NET中过滤TextBox中输入的html标签
- lg手机历史机型_lg手机大全【详细介绍】
- Visio使用经验汇集
- DevOps前沿技术培训课程大纲
- 另辟蹊径,独树一帜的写作方法
- 如何带团队,怎么带团队。
- 计算机的模拟电路基础
- MFC 加入文件时有坑stdafx.h
- 网页游戏HTML5--爱心鱼实现过程
热门文章
- 最近项目重构的一些感想
- 死磕Java并发:Java内存模型之分析volatile
- matlab fft例程,c++ FFTW与Matlab FFT
- reg 只能导入二进制注册文件
- torch EOFError: Ran out of input
- Application provided invalid, non monotonically increasing dts to muxer in stream 0: -92233720368547
- spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别
- matlab 图像操作函数的详解
- gcc中extra qualification错误
- PMP-【第7章 项目成本管理】-2021-2-12(161页-179页)