nio中从socket读取数据到缓冲区,如果缓冲区太小,多出来的数据会怎么样

如题。会丢吗?不会丢的话,后面的数据是怎么处理的呢

5个回答

数据量大时,发送端和接收端都可能分成多个包,但是不用去管它,我们只要知道完成数据的长度就可以

发送端分多次发送,每次取得实发长度累加,只到达到总长度。

发送端在onRead事件中处理,当次接收到的包连接到接收缓冲区中,该缓冲区生存期是高于本过程的,当缓冲区的数据长度达到传送的总长度时,认为一次完整的数据传输结束,这时进行后续处理,然后清空缓冲区,等待下一次传输!

不知道是不是这样!

具体情况有几种:
在读数据的时候,比如说客户端发过来1024个字节.这样的话正好 requestLineBuffer 一次读到1024个字节.这时 responseSize==requestLineBuffer里面数据的大小. 这正是你需要的完整数据;
如果客户端发送过来100个字节.这时responseSize 如果客户端发送过来2048个字节,第一次最多也就读1024个字节的数据.这时 responseSize>requestLineBuffer,你就要判断如果第一次没有把数据读完整的话,还要再去把剩下的1024个字节的数读过来;
如果客户端发送过来 2048 个字节,但是分2次或多次发送过来,比如说前两次读到 1548 个字节,这时你判断发现还没有接收到完整数据但再去用int count = socketChannel.read(requestLineBuffer);读,就是读不到数据.这样的话你就需要把这次读到的数据保存下来,再注册一个读的事件去读,等到下次把剩下的 500 个字节 数据读过来后再去处理逻辑.这样的情况就是socketChannel.read的数据并不是一次把数据读到的,而是分多次;
最后一种情况就是 如果客户端发送过来 5000 个字节,但是每次请求的数据只有 1000 个字节,这说明客户端发送太快,或是服务器处理太慢,系统把这5次的请求的数据加到一起了.这时你就要把这5个请求一个一个的分别取出来一个一个的去处理相应的逻辑.

如果数据大,缓冲小,那就每读一次,把缓冲中的数据倒出来放到一个临时容器,比如一个大的byte[],或者文件其他...当你的读到的总数count>=数据长度时候,把你需要的长度取出来处理

比如一次逻辑数据是"ABCDE"5个长度,缓冲只有1个长度,也就是说读一次最多拿到一个长度的数据。所以每次拿到的数据对于逻辑数据肯定是不完整的。因此要循环的读。直到读到的数据总长度>=5.才做一次逻辑处理。不知道这次说的对不对题:)

[quote]在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。

缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
[/quote]

引用了书上的原话~~这里说得很清楚我想

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问