Java屏幕共享客户端代码中while循环条件作用解析
屏幕共享客户端do-while循环条件的作用解析
咱们先拆解这个循环条件,搞清楚它到底在做什么:
while(!(count>4 && bytes[count-2]==(byte)-1 && bytes[count-1]==(byte)-39))
核心逻辑:判断是否接收到完整的JPEG截图
这段代码是在接收JPEG格式的屏幕截图数据,而这个循环的作用就是持续读取网络流中的数据,直到获取到一整张完整的JPEG图像。下面逐个分析条件里的细节:
count>4:
JPEG图像文件有固定的头部结构,至少会占用几个字节的长度。这个条件是为了避免数组越界——毕竟要检查count-2和count-1的位置,得确保已经读取到足够多的数据才行。bytes[count-2]==(byte)-1和bytes[count-1]==(byte)-39:
这是JPEG格式的关键标记!JPEG图像的结束符是0xFFD9,而在Java中,byte类型是有符号的:0xFF对应的十进制值是-10xD9对应的十进制值是-39
所以这两个字节组合起来,就代表一张JPEG图像的结尾。只要读到这两个字节,就说明当前已经接收到了一整张完整的屏幕截图数据。
为什么要用do-while循环?
因为网络传输是流式的,一次oin.read()调用不一定能把整张截图的所有数据都读进来。do-while会先执行一次读取操作,然后检查是否满足结束条件,如果没读到JPEG结束符,就继续循环读取,直到凑齐完整的图像数据为止。
服务器端的逻辑应该是每次发送一整张JPEG格式的屏幕截图,并且截图数据的最后两个字节就是这个FF D9结束符,客户端靠这个标记来判断什么时候停止读取、开始解析图像。
内容的提问来源于stack exchange,提问作者Suit Up
相关产品推荐
相关产品推荐

