我想做一个远程桌面控制的程序,则要涉及图片传输,反感有以下几个:一、利用robot获得桌面的BufferedImage对象,利用ImageIO方法进行读和写,
    但是ImageIO.read()的时候经常出错,而且不能判断什么时候读完了,
    这样不能判断传送过来的是图像还是其他信息。二、将BufferedImage序列化,利用ObjectInputStream进行接收,但似乎数据
    没有压缩,传输量太大,延迟太大。三、导出BufferedImage中的象素矩阵,压缩后直接使用socket的输入输出流传输,
    但这样取出和压缩的时间又太长。所以又很多问题:
1、ImageIO.read()经常读取图片出错,而且好像一次不能把传过来的数据一次读完,
   导致我无法判断是否已经读完,并且,读出来的图片经常出错。
2、BufferedImage如何序列化?3、有没有更好的方法实现桌面图像和控制信息的发送和接收?

解决方案 »

  1.   

    答:以前做机场项目时,做过这个全屏远程桌面实时传输与监控、共享。当时对实时性要求很高。最后采用c语言完成的(还有一个高效的数据压缩与还原算法),每抓一屏,实时压缩传输一屏。
    楼主用JAVA加上Robot类,我也做过。不过当时是用UDP做的。抓一屏,传输一屏(当时没有进行数据压缩与还原)。
    若楼主的实时性要求不是很高,可以抓一屏,高效数据压缩,UDP传输一屏,UDP接收,数据解压缩,显示。
      

  2.   

    我也是这样想的,只不过用的是socket传输,问题是既要发送图片,又要发送字符串,而且接收的时候无法判断是否是图片还是字符串,无法知道图片传输何时结束。还请多多赐教!
      

  3.   

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

  4.   

     这个是协议问题,你应该发送数据前,先发送数据的长度,4个字节足以。BufferedImage 应该可以拿到数据大小吧!建议你压缩后再传输,如果能mpeg 压缩就更好了
      

  5.   

    ImageIO.write(bufferredImage, "png", outputStream);这样不是压缩吗?