java实现远程控制应用
现在在公司上班经常需要远程到项目进行一些问题的出来。大家知道qq远程再网络比较好的情况下还是可以的。 但是网络不是很给力的情况下大家应该也知道。经常用tv,也算比较好用,但是现在的高版本都是收费的,不买正版的5分钟就断一次所以基本没法用。再尝试多个后也都有缺点。周末没事自己就研究这怎么去写个可以实现远程控制的东东。
去网上找了些资料发现远程控制实现并不难。原理就如下。(完全是自己理解的写的不喜勿喷)
远程控制当然是一个控制端 一个被控制端。 被控制端降电脑屏幕截图发到控制端,(这时我们当然会快速的截图形成流畅即时效果)。控制端这时候要操作被控制端也就是把控制端的事件发送到被控制端,并且进行事件回放。完成控制操作
涉及知识点:
java socket编程
java io流操作
java 多线程
Robot类
个人感觉这些知识点差不多了都
大家理解下面的代码也可以下载我程序运行看看效果http://pan.baidu.com/s/1qXN0cYo
这里贴一下关键代码有助于大家理解:
被控制端: 开启服务
public static void main(String[] args) {try {new RemoteServer().setupServer(9090);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
控制端:
public static void main(String[] args) {try {Cntroller cn = new Cntroller();cn.showui(); //显示页面链接cn.conn2Server("localhost", 9090); //链接被控制端cn.start();} catch (Exception e) {e.printStackTrace();}}
根据刚下表示的原理被控制端要完成2件事:
第一就是屏幕截屏发到控制端
package com.wfg.server;import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;import javax.imageio.ImageIO;/*** 发送图片的线程* @author wfg**/
public class CaptureThread extends Thread{private DataOutputStream dataOutputStream;private Toolkit tk ;private Dimension dm ;private Rectangle rec;private Robot robot ;public CaptureThread(DataOutputStream dataOutputStream) throws AWTException {this.dataOutputStream = dataOutputStream;tk = Toolkit.getDefaultToolkit();dm = tk.getScreenSize();//根据屏幕设定图片的大小rec = new Rectangle(0, 0, (int)dm.getWidth(), (int)dm.getHeight());robot = new Robot();}@Overridepublic void run() {while(true){byte[] data = createCature();try {dataOutputStream.writeInt(data.length);dataOutputStream.write(data);dataOutputStream.flush();try {Thread.sleep(1000/20);} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();System.out.println("网络有问题,截屏失败");}}}private byte[] createCature() {//获得一个屏幕的截图BufferedImage bimage = robot.createScreenCapture(rec);创建一段内存流ByteArrayOutputStream byout = new ByteArrayOutputStream();try {//将图片数据写入内存流中ImageIO.write(bimage, "jpg", byout);} catch (IOException e) {System.out.println("截屏图片写入内存流中出现异常");e.printStackTrace();}return byout.toByteArray();}}
第二就是控制端的事件回放
package com.wfg.server;import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.ObjectInputStream;public class EventReadThread extends Thread{private ObjectInputStream objins;public EventReadThread(ObjectInputStream objins) {this.objins = objins;}@Overridepublic void run() {while(true){try {Object eventobj = objins.readObject();InputEvent e = (InputEvent) eventobj;actionEvent(e);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}//回放事件的方法private void actionEvent(InputEvent e){Robot robot =null;try {robot = new Robot();} catch (AWTException e1) {e1.printStackTrace();}//是什么具体事件if(e instanceof KeyEvent){KeyEvent ke=(KeyEvent) e;if(e.getID()==KeyEvent.KEY_PRESSED){robot.keyPress(ke.getKeyCode());}if(e.getID()==KeyEvent.KEY_RELEASED){robot.keyRelease(ke.getKeyCode());}}if(e instanceof MouseEvent){MouseEvent me = (MouseEvent)e;int type = me.getID();if(type==MouseEvent.MOUSE_PRESSED){ //按下robot.mousePress(getMouseClick(me.getButton()));}if(type==MouseEvent.MOUSE_RELEASED){ //放开robot.mouseRelease(getMouseClick(me.getButton()));}if(type==MouseEvent.MOUSE_MOVED) { //移动robot.mouseMove(me.getX(), me.getY());}if(type==MouseEvent.MOUSE_DRAGGED) { //拖动robot.mouseMove(me.getX(), me.getY());}if(type==MouseEvent.MOUSE_WHEEL) { //滑轮滚动robot.mouseWheel(getMouseClick(me.getButton()));}}}//根据发送事的Mouse事件对象,转变为通用的Mouse按键代码private int getMouseClick(int button){if(button==MouseEvent.BUTTON1){return InputEvent.BUTTON1_MASK;} if(button==MouseEvent.BUTTON2){return InputEvent.BUTTON2_MASK;} if(button==MouseEvent.BUTTON3){return InputEvent.BUTTON3_MASK;}return -1;}
}
控制端完成的事情就是把事件发送到被控制端:
package com.wfg.client;import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollBar;import com.wfg.imag.MyJframe;public class Cntroller extends Thread{private ObjectOutputStream ous;private DataInputStream ins;private void showui(){MyJframe jf = new MyJframe("dddd",ous);addListener(jf); //添加监听jf.addPropertyChangeListener(new PropertyChangeListener() {@Overridepublic void propertyChange(PropertyChangeEvent arg0) {System.out.println(arg0.getNewValue());}});}//2.连结服务器private void conn2Server(String ip,int port)throws Exception{Socket sc=new Socket(ip,port);//得到输入流,读取图片数据ins=new DataInputStream(sc.getInputStream());//得到输出流,发送事件对象ous=new ObjectOutputStream(sc.getOutputStream());//处理这两个流 }@Overridepublic void run() {try{//读取图片数据while(true){int len=ins.readInt();//图片长度byte[] data=new byte[len];ins.readFully(data);//将读到的数据生成为一个图标对象ImageIcon ic=new ImageIcon(data);//放到界面上.加到标签上MyJframe.setImgLabel( ic,2);}}catch(Exception ef){System.out.println("获取数据流出现异常");ef.printStackTrace();}}private void addListener(MyJframe jf ){jf.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {sentEvent(e);}@Overridepublic void mousePressed(MouseEvent e) {sentEvent(e);}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseClicked(MouseEvent e) {}});//鼠标移动事件jf.addMouseMotionListener(new MouseMotionListener() {@Overridepublic void mouseMoved(MouseEvent arg0) {sentEvent(arg0);}@Overridepublic void mouseDragged(MouseEvent arg0) {sentEvent(arg0);}});//鼠标滑轮滑动事件jf.addMouseWheelListener(new MouseWheelListener() {@Overridepublic void mouseWheelMoved(MouseWheelEvent arg0) {sentEvent(arg0);}});//键盘事件jf.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent arg0) {sentEvent(arg0);}@Overridepublic void keyReleased(KeyEvent arg0) {sentEvent(arg0);}@Overridepublic void keyPressed(KeyEvent arg0) {sentEvent(arg0);}});}private void sentEvent(InputEvent e){try {ous.writeObject(e);} catch (IOException e1) {System.out.println("发送事件对象出现异常");e1.printStackTrace();}}public static void main(String[] args) {try {Cntroller cn = new Cntroller();cn.showui();cn.conn2Server("localhost", 9090);cn.start();} catch (Exception e) {e.printStackTrace();}}
}
java实现远程控制应用相关推荐
- java实现远程控制
java实现远程控制 今天我第一次用markdow写博客,虽然感觉有点别扭,但是好歹也要尝试一下新的事物. 今天我做java的远程操纵程序,类似QQ的远程控制. 但是只是做了鼠标和键盘的,而且因为是一 ...
- java远控_利用Java实现远程控制
利用 Java 实现远程控制 摘 要: 介绍了远程控制地原理 , 详细地叙述了利用 Java 实现远程控制软件地程序设计方法和要点 , 并给出了要点地具体实现方法 . 关键词: 远程控制: Java ...
- java远控_基于java的远程控制 示例源码
[实例简介]基于java的远程控制软件 [实例截图] 远程连接客户端如下: 服务端如下: [核心代码] package tcpudp; import java.awt.BorderLayout; im ...
- JAVA实现远程控制(JAVA in RemoteControl)
远程控制(RemoteControl) 远程控制的基本原理 事件回放原理 捕获桌面原理 远程控制(RemoteControl)的核心技术 1 .Socket编程 2.控制端事件的封装 3.画面的传输 ...
- 字节跳动面试真题:java实现远程控制
正文 MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方 ...
- Java 远程控制全实现:高效解决远程控制场景,附代码示例
JAVA实现远程控制(JAVA in RemoteControl)可以通过Java Remote Method Invocation(Java RMI)或Java Socket编程实现. 1. Jav ...
- 祝贺 Java 走过创新的 25 年
从最初面向消费类电子产品领域而设计,到在企业级应用程序.游戏开发.电子政务,乃至无人驾驶.线上支付.太空探索等场景中游刃有余,可以说,Java 凭借其抽象.封装.继承.多态的特性,在整个互联网迭代的进 ...
- 使用Java制作一个简易的远控终端
使用Java制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端 ...
- 基于java智能家居,基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿...
基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿 PINGDINGSHAN UNIVERSITY毕业论文 (设计 )题 目:基于 JAVA 的智能家居控制系 统的设计(信息控制端的设 ...
- java创意生日快乐_Java,25岁生日快乐!
原标题:Java,25岁生日快乐! 25年前, 我们无论如何也无法想象, 世界距离我们, 只有几次点击的距离. 而在今天, 这种便捷的生活方式 比以往任何时候都更重要. 这背后离不开Java, 以及无 ...
最新文章
- 风雨飘摇中的HP会分拆Arcsight业务吗?
- 怎样用c语言写超市管理程序,C语言超市收银管理系统实现程序.doc
- 豆瓣评分9.4!这一部纪录片,探秘中国的未至之境!
- Unity3D性能优化之Draw Call Batching
- 详述 Discord Desktop app RCE 挖洞经过,最后得$5000 + $300 (含 PoC 视频)
- bzoj4009: [HNOI2015]接水果
- C# XML加载屏蔽注释 忽略注释的加载
- 转:This Android SDK requires Andr...ate ADT to the latest
- svg格式的中国地图轮廓图
- unity导入导出excel的功能
- 【PS CS6】替换证件照背景色
- ①变量、常量、数据类型解释 ②标识符命原则 ③sizeof使用原则 ④float型科学计数法 ⑤字符转换到ASCII表 ⑥\t 的使用意义【黑马程序员视频】
- Springboot毕设项目电子银行业务办理系统38kny(java+VUE+Mybatis+Maven+Mysql)
- ChucK学习笔记(一)——下载与安装
- Pandas统计分析基础(2):Pandas之数据的读写(读取csv和excel文件)
- am335x linux 的uboot工作流程.doc,am335x uboot2016.05 (MLO u-boot.img)执行流程(转)
- 日志收集之--将Kafka数据导入elasticsearch
- 猿创征文 | 专做药品生产研发的程序员
- Android Studio Buid缓慢问题
- 小米手机显示服务器已满,小米云空间不足怎么办 小米云服务空间已满官方解决方案...
热门文章
- 高效制作期刊论文三线表格教程
- android ios9 rom,安卓党也能用上IOS9了 奇兔刷机首发24款机型仿IOS9 ROM
- leetcode幂集
- 【分享】“金蝶云星辰“ 在集简云平台集成应用的常见问题与解决方案
- 手工杀毒辅助软件(PC Hunter) V1.51 免费绿色版
- 什么是空号检测api接口?哪些行业会用到?
- 节约里程法java代码,智慧职教: 在配送路线优化的节约里程法中有几个基本的假设前提条件,他们是()。...
- MySQL—内连接和外连接区别
- ThinkPHP商城分类无限分类遍历数据
- 【方太】顺利通过CMMI3认证