远程屏幕监视使得控制方可以在远程主机上监视其它一台机器,其主要实现原理就是将被控制机器的屏幕作为图片传送给监视方,在Java中要实现远程屏幕监视,主要解决以下几个问题即可: 1:将当前屏幕的显示内容捕捉为图片 2:将捕捉的图片发送到远程控制主机 3:远程控制主机接收到在本地显示 4:利用多线程重复上面三步达到实时更新
说起来怎么这么简单啊,今天试着做了一下远程屏幕监视的实验,发现还真不是这么简单的,把我的心得总结出来共享一下,希望对你有用。
将当前屏幕显示内容捕捉为图片
通过上面几行代码就把屏幕的当前显示内容保存为内存中的BufferedImage对象,这个确实简单.
将捕捉的图片发送到远程控制主机 要达到实时监控,怎么保证发送效率,在网络状况不良好时怎么保证发送时使用带宽 因为要不停地往控制机上发送图片,所以传送的图片不能太大,否则会影响实时性,当网络状况不好时,占用带宽过多则更加会给实时性带来严峻的考验,解决的方法有两个: 1:使用jpg格式的图片进行传输。 jpg是一种支持高度压缩技术的图片格式,它所存储的信息不包含透明度,同等质量的情形下相对来说比png,gif等格式的图片要小很多,当然,文件大小是以图像质量为代价的,如果你一味地追求压缩后的大小,图像质量就会受损了。我在实验中使用大小为28394字节的png图片经过jpg压缩后大小仅剩5815字节(不是PS,整个过程全部使用Java完成)。 2:将用图片生成的字节数据先压缩再传送。 这一步是仁者见仁,智者见智了,有人说没有必要,jgp格式的图片再压缩也小不了多少。确实是这样的,我在实验中把5815字节大小的jpg经过zip压缩后为大小变为5702,有点小作用,实际应用中压缩与否就看你了(压缩其它格式的图片效果可能会明显一点,我在实验中把一个大小为883078字节的bmp图片压缩后大小仅为16849字节,很可观,达到了52:1)。
我能想到的就是这两点了,欢迎各位仁智双全的人补充。下面就是这两点用到的Java技术,Java高手就直接跳过吧。
好了,这个时候就可以把字节数组发往监控机器了,如果你发了,你就知道,问题又来了(不会吧!)。 1:既然是采用多线程发送多张图片,那么对于一张图片,接收方怎么知道你发完了呢? 2:如果要发其它的数据,比如鼠标点击等,接收方又怎么区分什么时候发的是图片,什么时候发的是其它的……
对于这两点问题,最直接的解决方法是当数据发送完成后关闭发送字节的输出流,第二次发送时重新建立连接(网上确实有人这样肆无忌惮地做),这种方法采用不采用就看良心了(汗)。我采用的解决方法是,每次发送数据前都告诉接收方要发什么东西(解决问题2),同时告诉它我发了多少字节(解决问题1),接收方只要接收了这么多字节数,就表示本次发送完成,最后再发送真正要发送的内容(图片等),说简单点就是,发送的消息结构如下: 【标识位 大小 消息】 标识位:采用一个整型,其实是一个byte,占一个字节 大小:一个整型,占四个字节 消息:实际要发送的字节数组,长度就是字节数组的长度 这样接收方每次都是先读取一个整数,判断发送方是要发送什么消息,然后再判断消息的大小,然后再接收指定大小的消息,最后完成本次发送转入下一次接收工作。
最后,就是使用多线程重复上面的步骤进行实时监控了。有什么问题欢迎指正。
本次实验进行的还算成功,成功偷窥了自己的桌面。谢谢你坚持看完我这么烂的文章,向你致敬!
下面是本次实验的运行图: 本文所使用的源代码: 源代码下载
posted on 2010-02-10 23:45 paulwong 阅读(442) 评论(0) 编辑 收藏 所属分类: J2SE
Powered by: BlogJava Copyright © paulwong