一、问题描述
我们在做图片传输时,通常都是打开一个http请求,然后去下载一张图片,下载完成后,这个链接就断开了,在这样的情况下,我们最多允许传送一张图片,那么,像刚才那样的做法就不行了。而我的需求是,比如我有100张图片,我想传输完一百张图片在断开链接,或者更夸张点,我做了一个屏幕广播程序,需要把截图来的图片一张张的发给客户端,不想断开,也不能断开,然后我想什么时候断开就断开,不传图片我也不断开。这样的需求,用http请求就不太划算了,因为不断的请求链接然后在断开,是会降低传输效率的。那么有什么办法可以实现像刚才那样的需求呢,办法肯定是有的,接下来,我将我所积累的方法告诉大家。
二、方法
说到方法,那么我们就要用最原始的通信工具了,那就是Socket,要实现在一个链接上不停的传输图片(比如屏幕广播程序),就需要自定义一个应用层协议,才能实现样的需求,废话不多说,请看我自己定义的协议:
图片数据包头(8byte) | 图片编号(4byte) | 图片名称长度(4byte) | 图片名称 | 图片字节数据长度(8byte) | 图片数据 | 奇偶校验(4byte)
协议解释:
图片数据包头:定义这个包头就是表示我这是一张图片数据的开始,当我找到这个头之后,才可以去读取图片数据信息,不是随便找一个字节就开始读,那样的话,你永远也得不到一张图片。包头是你自己随意定义的一段特殊的数据,这样才可以和图片数据分开。
图片编号:为啥是4byte呢,其实它就是一个int型的值,协议中我写了这些单位的,都是Java的基本数据类型(除包头和奇偶校验外),相应的,图片数据 长度就是long型。
别的协议段不再解释,相信都看得懂,如果你的图片编号超过了int能承受的值,可以使用8byte,也就是long类型。有了这个协议,那么我们就可以传输图片了。
三、实现代码
1、先定义好协议包头,这个是随机的,想怎么定义就怎么定义,越特殊越好。
//协议包头和奇偶校验
public final static byte[] PICTURE_PACKAGE_HEAD = {(byte) 0xFF, (