- 浏览: 579489 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
Robot robot = new Robot(); //要捕捉的屏幕显示范围,下面以全屏示例说明 Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); BufferedImage bm = robot.createScreenCapture(rect);
通过上面几行代码就把屏幕的当前显示内容保存为内存中的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高手就直接跳过吧。
使用Java将图片处理成jpg格式
//outputstream就是要写入处理后的jpg图片的输出流,要保存到文件的话就用FileOutputStream JPEGCodec.createJPEGEncoder(outputstream).encode(bm); ImageIO.write(bm, "jpg", outputstream);这两种方法有什么差别呢?别的我不知道,就平均效率来说,第二种是第一种的2倍,我实验中转换了10次,使用的时间分别是125和250(单位是百分之一毫秒,机子有点慢的说).
把图片数据转换为字节数组
ByteArrayOutputStream bos = new ByteArrayOutputStream(); JPEGCodec.createJPEGEncoder(bos).encode(bm); // 上句也可以用 ImageIO.write(bm, "jpg", bos)实现 bos.flush(); byte[] data = bos.toByteArray();将生成的字节数组进行zip压缩
ZipOutputStream zos = new ZipOutputStream(bos); zos.setLevel(Deflater.BEST_COMPRESSION); //下面我以ScreenCapture.jpg说明 zos.putNextEntry(new ZipEntry("ScreenCapture.jpg")); zos.write(data); zos.closeEntry();好了,这个时候就可以把字节数组发往监控机器了,如果你发了,你就知道,问题又来了(不会吧!)。
1:既然是采用多线程发送多张图片,那么对于一张图片,接收方怎么知道你发完了呢?
2:如果要发其它的数据,比如鼠标点击等,接收方又怎么区分什么时候发的是图片,什么时候发的是其它的……
对于这两点问题,最直接的解决方法是当数据发送完成后关闭发送字节的输出流,第二次发送时重新建立连接(网上确实有人这样肆无忌惮地做),
这种方法采用不采用就看良心了(汗)。我采用的解决方法是,每次发送数据前都告诉接收方要发什么东西(解决问题2),同时告诉它我发了多少字节(解决问题
1),接收方只要接收了这么多字节数,就表示本次发送完成,最后再发送真正要发送的内容(图片等),说简单点就是,发送的消息结构如下:
【标识位 大小 消息】
标识位:采用一个整型,其实是一个byte,占一个字节
大小:一个整型,占四个字节
消息:实际要发送的字节数组,长度就是字节数组的长度
这样接收方每次都是先读取一个整数,判断发送方是要发送什么消息,然后再判断消息的大小,然后再接收指定大小的消息,最后完成本次发送转入下一次接收工作。
采用Socket的方式进行消息的发送
DataOutputStream dos = new DataOutputStream(client.getOutputStream()); //SEND_IMAGE_SYMBOL是一个标识位,你随便定义,只要保证能与其它标识位区分就行 dos.write(SEND_IMAGE_SYMBOL); dos.writeInt(data.length); dos.write(data); dos.flush();啊,真不容易,终于发送出去了!不知道那边接收到了没有?那现在就去追踪报道吧。
远程控制主机接收消息
//先要判断消息的类型 DataInputStream reader = new DataInputStream(socket.getInputStream()); int msgSymbol = reader.read(); //还记得这个SEND_IMAGE_SYMBOL吗 if (msgSymbol == SEND_IMAGE_SYMBOL) { //哦,是要发送图片啊。让我看看你的图片有多大 int msgSize = reader.readInt(); //晕,你网速好也不用发这么大吧,我一次接收不完的,不过幸好我有准备 byte[] buffer = newbyte[msgSize]; int length = 0; while (length < msgSize) { int readSize = reader.read(buffer, length, msgSize - length); if (readSize > 0) { length = length + readSize; } else{ break; } } //这是非常关键的,图片太大时一次性是读不完的,一定要使用缓冲重复读取。 //人家给我发送的消息是图片,怎么把字节数组还原成图片呢? ByteArrayInputStream bis = new ByteArrayInputStream(buffer); ZipInputStream zis = new ZipInputStream(bis); //读取压缩的数据内容。 ZipEntry ze = zis.getNextEntry(); BufferedImage bi = ImageIO.read(zis); //或者BufferedImage bi = JPEGCodec.createJPEGDecoder(zis).decodeAsBufferedImage(); //上面两行代码的差别已经说过了 //另外,如果在发送的时候你没有进行压缩,把上面的zis换成bis就行。 //有了BufferedImage对象,剩下的就是把它显示出来了进行远程"偷窥",任何一个支持图片显示的swing组件你都以用,我在实验中用的是JPanel,一个简单又支持双缓冲的组件。 }
发表评论
-
BCD Conversion in java
2016-03-31 23:39 1851/** * Copyright 2010 Firat ... -
在java代码中获取JVM参数
2014-04-08 11:16 14271近日关注性能调优,关注JMX,发现java.lang.man ... -
GC日志分析配置与工具
2013-05-08 11:32 1370-verbose:gc(打印GC日志) -Xloggc:( ... -
java 实现HTTP PROXY
2012-12-06 17:21 7595日常应用中使用过很多次代理,主要停留在配置级别。 近期无意看 ... -
运行时获取方法调用堆栈信息(java)
2012-09-14 10:53 9707前几日系统流程回调时,一个方法莫名其妙被调用,无法定位调用点。 ... -
EL表达式在tomcat7.0下的new关键字不能使用
2012-08-24 17:25 4079最近生产系统部署个小应用,服务器选型tomcat7.0,一直运 ... -
xfire设置连接超时问题
2012-08-01 17:25 5163近期使用xfire作为客户端访问WS,结果因为目标主机假死 ... -
将多个对象写到一个文件
2012-07-20 17:08 1263来看一段ObjectOutputStream构造方法的源代码 ... -
多线程学习笔记:synchronized
2011-12-15 17:32 852Java语言的关键字,当它 ... -
(转)使用 Eclipse Memory Analyzer 检测内存泄漏问题
2011-12-14 18:10 1157本文是关于在开发 Talend RCP 过程中碰 ... -
多线程学习笔记:thread 线程中的sleep()、wait()、yield()、join()
2011-12-14 17:46 12901.sleep()方法 在指定时间内让当前正在执行的线程暂 ... -
jconsole监控JVM
2011-12-12 17:46 1577本地监控: Jconsole [processed] ... -
Java 6 JVM参数选项大全(中文版)
2011-11-03 15:19 1050本文 是基于最新的SUN官方 文档Java SE 6 ... -
java线程池 常用方法
2011-09-24 22:52 1399在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于 ... -
JAVA 调用Web Service的方法
2011-08-15 10:28 11641.使用HttpClient 用到的jar文件:comm ... -
JVM监控工具--jvmstat
2011-08-02 15:42 1287首先就是下载这个工具链接:http://java.sun.co ... -
java性能优化
2011-07-18 15:19 1117一、避免在循环条件中 ... -
jvm内存参数设定
2011-07-17 20:30 1394在开发java应用时经常出 ... -
怎样解决Java内存泄漏
2011-07-15 11:38 1468解决Java 内存泄漏 Java内存泄漏是每个 ... -
HttpClient学习整理
2011-05-20 16:20 2633HttpClient 学习整理 HTTP ...
相关推荐
基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的...
用java socket写的远程屏幕监视软件。 有详细文档,新手看也很容易懂,可以实时屏幕监控,截图,调图片大小,刷新率啊。是我java课程设计的作业,传上来相互学习啊。 绝对是能用滴。报错的话,在eclipse里右键点击...
Java技术实现跨平台的远程屏幕监视是指通过Java语言实现的远程屏幕监视系统,该系统可以在不同的操作系统平台上实现屏幕监视,具有跨平台的特点。本文将详细介绍Java技术实现跨平台的远程屏幕监视的原理、关键技术和...
Java Robot对象实现服务器屏幕远程监视
要实现远程服务器的屏幕监视,可以将上述的Java屏幕截图工具与网络通信技术结合。例如,使用Socket编程或者HTTP协议将截取的图像数据发送到服务器,或者将图像文件上传至云存储服务,然后在客户端通过网络请求获取并...
6. **安全考虑**:由于涉及远程屏幕监视,必须注意隐私和安全问题。确保数据在传输过程中的安全性,例如使用SSL/TLS加密,以及限制谁可以连接到服务器。 7. **错误处理**:在实际应用中,必须考虑到网络中断、...
##### 3.2 Java实现远程屏幕监视的关键技术 - **屏幕截屏的实现**:Java提供了`Robot`类,其中的`createScreenCapture()`方法可用于屏幕截屏,这是实现远程屏幕监控的基础。 - **屏幕大小的获取**:通过`Toolkit`类...
【JAVA开发的远程桌面监视小程序】是一个基于Java技术实现的简易版远程监控应用程序,它能够让你在一台设备上查看另一台设备的桌面活动。这个小程序是作者在大学期间完成的一次中级软件实作项目的成果,作为大三上...
基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文) 基于JAVA C/S远程监控系统软件的实现 摘 要 近年来,网络技术的不断发展,为远程监控技术的发展创造了条件。远程监控系统软件越来越受到人们的重视,...
笔者在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能连续获得被监控端机器屏幕变化;实现被监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现在远程机器上执行任意DOS命令;远程关机...
笔者在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能连续获得被监控端机器屏幕变化;实现被监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现在远程机器上执行任意DOS命令;远程关机...
在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能连续获得被监控端机器屏幕变化;实现被监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现在远程机器上执行任意DOS命令;远程关机、...
【作品名称】:基于JAVA CS远程监控系统软件的实现【毕业设计】(源代码+毕业论文) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 ...
在Java中实现一个简单的远程监控程序,主要涉及两个核心功能:远程屏幕监视和远程控制。以下将详细解释这两个功能的实现方法。 **功能一:远程屏幕监视** 远程屏幕监视的关键在于能够实时捕获并传输被监控端的屏幕...
【基于WebRtc网页远程桌面监控】是一种创新的技术解决方案,它允许用户在浏览器中实现对远程计算机的实时监控,无需安装额外的插件或应用程序。这一特性极大地提升了用户体验,因为用户不再需要面对传统远程桌面软件...
远程屏幕监视是远程监控程序的基础功能,其工作流程包括以下几个关键步骤: 1. **监控端与被监控端**:程序需要在两台计算机上同时运行,一台作为监控端,另一台作为被监控端。 2. **截图与传输**:被监控端通过...
笔者在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能连续获得被监控端机器屏幕变化;实现被监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现在远程机器上执行任意DOS命令;远程关机...
本系统采用 Java网络编程和 Java图形编程实现。 笔者在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能 连续获得被监控端机器屏幕变化;实现被监控端硬盘文件的上传、下载;实现对 鼠标、键盘的...