日期:2014-05-20  浏览次数:20619 次

【socket】 图像传输?
我想做一个远程桌面控制的程序,则要涉及图片传输,反感有以下几个:

一、利用robot获得桌面的BufferedImage对象,利用ImageIO方法进行读和写,
  但是ImageIO.read()的时候经常出错,而且不能判断什么时候读完了,
  这样不能判断传送过来的是图像还是其他信息。

二、将BufferedImage序列化,利用ObjectInputStream进行接收,但似乎数据
  没有压缩,传输量太大,延迟太大。

三、导出BufferedImage中的象素矩阵,压缩后直接使用socket的输入输出流传输,
  但这样取出和压缩的时间又太长。

所以又很多问题:
1、ImageIO.read()经常读取图片出错,而且好像一次不能把传过来的数据一次读完,
  导致我无法判断是否已经读完,并且,读出来的图片经常出错。
2、BufferedImage如何序列化?

3、有没有更好的方法实现桌面图像和控制信息的发送和接收?





------解决方案--------------------
答:以前做机场项目时,做过这个全屏远程桌面实时传输与监控、共享。当时对实时性要求很高。最后采用c语言完成的(还有一个高效的数据压缩与还原算法),每抓一屏,实时压缩传输一屏。
楼主用JAVA加上Robot类,我也做过。不过当时是用UDP做的。抓一屏,传输一屏(当时没有进行数据压缩与还原)。
若楼主的实时性要求不是很高,可以抓一屏,高效数据压缩,UDP传输一屏,UDP接收,数据解压缩,显示。
------解决方案--------------------
而且接收的时候无法判断是否是图片还是字符串,
在传输的时候, 加上个标志, 区分字符串与图片.

无法知道图片传输何结束.
试试把图片用一个包一次性传输.
如果分段传输, 因为UDP的包到达顺序是不定的, 而且容易丢包, 所以确定结束是比较困难的(除非你自己处理, 如接收了几个包, 一共是几个包, 某个包丢了等等, 如果这样, 那还不如直接使用TCP)

------解决方案--------------------
这个是协议问题,你应该发送数据前,先发送数据的长度,4个字节足以。

BufferedImage 应该可以拿到数据大小吧!

建议你压缩后再传输,如果能mpeg 压缩就更好了