利用Java实现远程控制(2)
public void eventDispatched(AWTEvent event) { KeyEvent e = (KeyEvent)event;
if(e.getID()= =KeyEvent.KEY_PRESSED) { //
向
被
控
端
发
送
KEY_PRESSED,e.getKeyCode(),e.getKeyChar(),e.getKeyLocation() }
else if(e.getID()= =KeyEvent.KEY_RELEASED) {
//
向
被
控
端
发
送
KEY_RELEASED,e.getKeyCode(),e.getKeyChar(),e.getKeyLocation()
} }
},AWTEvent.KEY_EVENT_MASK);
被控端程序接收来自控制端的鼠标和键盘操作指令后,可以根据具体指令执行Robot类的相应方法即可实现操作模拟(参见2.2)。需要说明的是,控制端程序需要根据被控端程序发送的屏幕图象的大小来设置显示被控端屏幕图象的窗口组件的大小,这样,被控端程序收到控制端程序发送的鼠标坐标就可以准确定位本地鼠标位置。
2.3.2屏幕图象的压缩/解压缩
屏幕图象是以位图格式获得的,直接传输会造成比较大的延
6
时,为了提高远程控制的实时性,需要对获取的屏幕图象数据进行压缩后再传输,另外,不应该使用文件的形式进行屏幕图象传输,而是应该直接传输内存数据,这样也会明显地减小延时。屏幕图象的压缩方法如下: //获取屏幕图象 BufferedImage
image=robot.createScreenCapture(new
Rectangle(toolkit.getScreenSize()));
ByteArrayOutputStream out=new ByteArrayOutputStream();//建立输出流
//创建JPEGEncodeParam对象(封装了压缩所需必要参数) JPEGEncodeParam
param=JPEGCodec.getDefaultJPEGEncodeParam(image); param.setQuality(0.5f,false); //设置压缩后清晰度(数值范围0—1之间)
//创建JPEGImageEncoder对象 JPEGImageEncoder
encoder=JPEGCodec.createJPEGEncoder(out,param); encoder.encode(image); //图象压缩
byte[] bytes=out.toByteArray(); //生成位数组
output.write(bytes,0,bytes.length); // 把位数组写入输出流 output.flush(); //刷新输出流
压缩后的屏幕图象数据的解压缩方法如下:
7
//创建JPEGImageDecoder对象,input为输入流 JPEGImageDecoder
decoder=JPEGCodec.createJPEGDecoder(input); //把JPEG数据流解压缩
BufferedImage image=decoder.decodeAsBufferedImage(); //显示图象
2.3.3屏幕图象及指令的传输
在TCP/IP协议组中,TCP是一种面向连接的协议,为用户提供可靠的、全双工的流式服务,具有确认、流控制、多路复用和同步等功能,适用于多种不同数据类型的传榆。UDP协议则是无连接的,每个分组携带完整的目的地址,各分组在系统中独立传送。它不能保证分组的先后顺序,不进行分组出错的恢复与重传,因此不保证传输的可靠性,但是它提供高传输效率的数据报服务,适于实时的语音、图像、广播消息等网络传输。
在选择传输协议时,屏幕图象的压缩率是一个重要因素。因为UDP协议的数据包最大长度是64KB[2],如果屏幕图象的压缩率设置得比较小,屏幕图象压缩后的数据量超过了64KB,那么,就不宜使用UDP协议。一般地,屏幕图象的压缩率设置得不宜太大(设置压缩后的清晰度要≥0.5),否则,传到客户端的屏幕图象会不够清晰,所以,一般可以选择使用TCP协议。网络通讯是普遍的编程技术[3],在这里简要介绍实现步骤:
8
服务器端: //在PORT端口侦听
ServerSocket server=new ServerSocket(PORT); //接受客户机连接请求 Socket client=server.accept(); //与客户机建立输入输出流
BufferedOutputStream output = new BufferedOutputStream (client.getOutputStream(), BUFFER_SIZE); BufferedReader
input
=
new
BufferedReader
(new
InputStreamReader (client.getInputStream())); //进行数据传输 ... ... 客户端: //与服务器连接
Socket client= new Socket(server,PORT); //与服务器建立输入输出流
PrintWriter output = new PrintWriter(client.getOutputStream(),true); BufferedInputStream
input
=
new
BufferedInputStream(client.getInputStream(), BUFFER_SIZE); //进行数据传输 ... ...
另外,由于服务器端屏幕图象的获取、压缩和传输以及客户
9
端屏幕图象的接收、解压缩和显示需要不断地、频繁地进行,所以,程序的设计需要采用多线程技术[4],服务器端屏幕图象的获取、压缩和传输以及客户端屏图象的接收、解压缩和显示应该分别由一个专门的线程来处理。多线程的使用,限于篇幅不在赘述。 3 结束语
本文介绍了远程控制的原理,详细地叙述了利用Java实现远程控制软件的程序设计方法和要点,并给出了要点的具体实现方法。为了使所实现的软件具有更好的实用性,可以把软件设计成支持TCP和UDP两种协议,让用户在使用时自己设置所要使用的协议和屏幕图象压缩率大小。 参 考 文 献
[1] 常永昌.一种远程控制软件的设计与实现[J].计算机应用,
2003,23(3):127-128,131.
[2] Andrew S. 计算机网络(第3版)[M]. 北京:清华大学出
版社,2002.
[3] Spell B. Java专业编程指南[M]. 北京:电子工业出版社,2001.
[4] Eckel B. Java编程思想(英文版?第三版)[M]. 北京:机械
工业出版社,2004.
10
…… 此处隐藏:1128字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [资格考试]机械振动与噪声学部分答案
- [资格考试]空调工程课后思考题部分整合版
- [资格考试]电信登高模拟试题
- [资格考试]2018年上海市徐汇区中考物理二模试卷(
- [资格考试]坐标转换及方里网的相关问题(椭球体、
- [资格考试]语文教研组活动记录表
- [资格考试]广东省2006年高应变考试试题
- [资格考试]LTE学习总结—后台操作-数据配置步骤很
- [资格考试]北京市医疗美容主诊医师和外籍整形外科
- [资格考试]中学生广播稿400字3篇
- [资格考试]CL800双模站点CDMA主分集RSSI差异过大
- [资格考试]泵与泵站考试复习题
- [资格考试]4个万能和弦搞定尤克里里即兴弹唱(入
- [资格考试]咽喉与经络的关系
- [资格考试]《云南省国家通用语言文字条例》学习心
- [资格考试]标准化第三范式
- [资格考试]GB-50016-2014-建筑设计防火规范2018修
- [资格考试]五年级上册品社复习资料(第二单元)
- [资格考试]2.对XX公司领导班子和班子成员意见建议
- [资格考试]关于市区违法建设情况的调研报告
- 二0一五年下半年经营管理目标考核方案
- 2014年春八年级英语下第三次月考
- 北师大版语文二年级上册第十五单元《松
- 2016国网江苏省电力公司招聘高校毕业生
- 多渠道促家长督导家长共育和谐 - 图文
- 2018 - 2019学年高中数学第2章圆锥曲线
- 竞争比合作更重要( - 辩论准备稿)课
- “案例积淀式”校本研训的实践与探索
- 新闻必须客观vs新闻不必客观一辩稿
- 福师大作业 比较视野下的外国文学
- 新编大学英语第二册1-7单元课文翻译及
- 年产13万吨天然气蛋白项目可行性研究报
- 河南省洛阳市2018届高三第二次统一考试
- 地下车库建筑设计探讨
- 南京大学应用学科教授研究方向汇编
- 2018年八年级物理全册 第6章 第4节 来
- 毕业论文-浅析余华小说的悲悯性 - 以《
- 2019年整理乡镇城乡环境综合治理工作总
- 广西民族大学留学生招生简章越南语版本
- 故宫旧称紫禁城简介




