java实现电脑远程控制完整源代码(转)
Java JDK1.4 的Robot对象,该对象可以完成屏幕图像截取操作,控制鼠标,键盘,如此便可以轻而易举地实现远程服务器的控制。本文向大家介绍如何用Java Robot对象实现远程服务器的控制,并给出了相应的Java源代码。
实现原理:
(1)被控端通过Robot截取桌面图像通过socket通信传给主控端。
(2)主控端显示被控端桌面,并且把基于被控端图像上的键盘,鼠标事件通过socket通信传给被控端。
(3)被控端响应主控端的鼠标键盘事件。
实现详解:
(一)主控端和被控端通过UDP进行指令交互
/*-主控端向被控端发送指令-*/
String command = ...; //指令
InetAddress inet = ...; //被控端地址
int port = ...; //端口
byte sp[] = command.getBytes();
DatagramPacket packet = new DatagramPacket(sp,sp.length(),inet,port);
DatagramSocket sd = new DatagramSocket();
sd.send(packet);
/*-被控端接收指令-*/
DatagramSocket stockUDP = ...;
DatagramPacket packet = ...;
stockUDP.receive(packet);
String message=new String(packet.getData(),0,packet.getLength()); //得到指令
本程序中用到的指令
public static final String Command_Connection = "connection" ; //建立连接
public static final String Command_Disconnection = "disconnection";//断开连接
public static final String Command_Screen = "screen"; //显示被控端屏幕
public static final String Command_Control="control"; //建立控制套接
(二)被控端向主控端传递图像
/*-被控端获取屏幕图像-*/
Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());//全屏区域
Robot robot=new Robot();
BufferedImage image = robot.createScreenCapture(rect);
/*-开启图像传送线程-*/
Socket socket = ...;
OutputStream out = socket.getOutputStream();
BufferedImage image ;
JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(out);
......
public void run(){
while(true){
image = ...; //获取屏幕图像
encoder.encode(image); //发送图像给主控端
Thread.sleep(Environment.IMAGE_GETTIME); //图像采集时间间隔
}
}
/*-主控端图像接收线程-*/
JPEGImageDecoder de = JPEGCodec.createJPEGDecoder(socket.getInputStream());
BufferedImage image = null ;
......
public void run(){
while(true){
image = de.decodeAsBufferedImage();
if (image != null) {
/*显示图像*/
}
}
}
(三)图像显示,鼠标,键盘监听
/*-图像显示-*/
public class ControlledScreenPanel extends JPanel implements MouseMotionListener,
MouseListener,MouseWheelListener ,KeyListener{
private BufferedImage image ;
public void setBufferedImage(BufferedImage bi) { //更新图像
image = bi;
Dimension d = new Dimension(image .getWidth(this),image .getHeight(this));
setPreferredSize(d);
revalidate();
repaint();
}
public void paintComponent(Graphics g) { //绘制图像
super.paintComponent(g);
Dimension d = getSize();
g.setColor(getBackground());
g.fillRect(0, 0, d.width, d.height);
if (image != null) {
g.drawImage(image , 0, 0, this);
}
}
}
/*-鼠标,键盘监听-*/
private MainControlSocket control ; //发送鼠标,键盘事件到被控端
public void mouseDragged(MouseEvent e) {
control.sendControlledAction(e);
}
public void mouseMoved(MouseEvent e) {
control.sendControlledAction(e);
}
//--------------------------------------------------------------------------
public void mouseClicked(MouseEvent e) {
requestFocus();//单击获得焦点
}
public void mousePressed(MouseEvent e) { //鼠标按下
control.sendControlledAction(e);
}
public void mouseReleased(MouseEvent e) { //鼠标释放
control.sendControlledAction(e);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
//--------------------------------------------------------------------------
public void mouseWheelMoved (MouseWheelEvent e){ //滑轮滚动
control.sendControlledAction(e);
}
//--------------------------------------------------------------------------
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) { //键盘按下
control.sendControlledAction(e);
}
public void keyReleased(KeyEvent e) { //键盘释放
control.sendControlledAction(e);
}
/*-发送鼠标,键盘事件到被控端-*/
class MainControlSocket {
private Socket socket = null;
private ObjectOutputStream out = null; //事件对象发送封装
......
public void sendControlledAction(InputEvent event) {
try {
out.writeObject(event);
}
catch (IOException e) {
e.printStackTrace();
}
}
......
}
(三)被控端接收,响应键盘鼠标事件
private Socket socket = ...;
private ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
private Robot action = new Robot();
public void run(){
......
while(true){
Object obj = in.readObject(); //获得鼠标键盘事件
if (obj != null) {
handleEvent( (InputEvent) obj); //处理鼠标键盘事件
}
}
......
}
private void handleEvent(InputEvent event){
MouseEvent mevent = null ; //鼠标事件
MouseWheelEvent mwevent = null ;//鼠标滚动事件
KeyEvent kevent = null ; //键盘事件
int mousebuttonmask = -100; //鼠标按键
switch (event.getID()){
case MouseEvent.MOUSE_MOVED : //鼠标移动
mevent = ( MouseEvent )event ;
action.mouseMove( mevent.getX() , mevent.getY() );
break ;
case MouseEvent.MOUSE_PRESSED : //鼠标键按下
mevent = ( MouseEvent ) event;
action.mouseMove( mevent.getX() , mevent.getY() );
mousebuttonmask = getMouseClick( mevent.getButton() );
if(mousebuttonmask != -100)
action.mousePress(mousebuttonmask);
break;
case MouseEvent.MOUSE_RELEASED : //鼠标键松开
mevent = ( MouseEvent ) event;
action.mouseMove( mevent.getX() , mevent.getY() );
mousebuttonmask = getMouseClick( mevent.getButton() );//取得鼠标按键
if(mousebuttonmask != -100)
action.mouseRelease( mousebuttonmask );
break ;
case MouseEvent.MOUSE_WHEEL : //鼠标滚动
mwevent = ( MouseWheelEvent ) event ;
action.mouseWheel(mwevent.getWheelRotation());
break ;
case MouseEvent.MOUSE_DRAGGED : //鼠标拖拽
mevent = ( MouseEvent ) event ;
action.mouseMove( mevent.getX(), mevent.getY() );
break ;
case KeyEvent.KEY_PRESSED : //按键
kevent = ( KeyEvent ) event;
action.keyPress( kevent.getKeyCode() );
break ;
case KeyEvent.KEY_RELEASED : //松键
kevent= ( KeyEvent ) event ;
action.keyRelease( kevent.getKeyCode() );
break ;
default: break ;
}
}
private int getMouseClick(int button) { //取得鼠标按键
if (button == MouseEvent.BUTTON1) //左键 ,中间键为BUTTON2
return InputEvent.BUTTON1_MASK;
if (button == MouseEvent.BUTTON3) //右键
return InputEvent.BUTTON3_MASK;
return -100;
}
......
}
http://blog.csdn.net/songylwq/article/details/7715157
java实现电脑远程控制完整源代码(转)的更多相关文章
- GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction 升讯威微信营销系统开发实践系列升讯威微信营销系统开发实践:(1)功能设计与架构设 ...
- java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多
java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 也仿照着 netty处理了NIO的空轮询BUG 本项目并不复杂 代码不多 ...
- Java 网络爬虫获取网页源代码原理及实现
Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...
- Unity3D手游-横版ACT游戏完整源代码下载
说明: 这不是武林.这不是江湖,没有道不完的恩怨,没有斩不断的情仇,更没有理不清的烦恼,这是剑的世界,一代剑魁闯入未知世界,将会为这个世界展开什么样的蓝图.让你来创造它的未来,剑魁道天下,一剑斗烛龙! ...
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- cocos2d-x《农场模拟经营养成》游戏完整源代码
cocos2d-x农场模拟经营养成游戏完整源代码,cocos2d-x引擎开发,使用JSON交互,支持IOS与 Android,解压后1016MB. 非常强大的游戏源代码 完整游戏源代码 ...
- Java学习路线(完整详细版)
Java学习路线(完整详细版) https://jingyan.baidu.com/article/c1a3101e110864de656deb83.html
- Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...
- Java工程师 基础+实战 完整路线图(详解版)
Java工程师 基础+实战 完整路线图(详解版) Java 基础 Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装.继承.多态.此外还有泛型.反射 ...
随机推荐
- tree(简单并差集)
tree Accepts: 156 Submissions: 807 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- Boost源代码学习---shared_ptr.hpp
最近观看Boost库源代码.Boost功能强大的库,但它的许多源代码,十一细读太费时间,毕竟,还有其他东西要学.所以我决定脱脂感兴趣的章节,他们的设计思路和难以理解的地方记录. shared_ptr是 ...
- JavaWeb解释一下什么是 servlet?
Servlet是一种独立于平台和协议的服务端的java技术,可以生成动态WEB页面与传统的CGI(计算机图形接口)和其他类似的CGI技术相比.Servlet具有更好的可移植性.更强大的功能,更少的投资 ...
- hadoop配置及无法移动文件到hdfs故障解析
首先博主用的64位ubuntu,hadoop官方只提供32位版本,这样的话启动本地库无法兼容,需要自己编译为64位版本,或下载别人编译好的64位版本. 下载好需要在etc/hadoop目录下改动以下几 ...
- chrome dev tools
chrome dev tools介绍一下Chrome dev tools 的基本使用和一些意想不到的小技巧.\\Chrome Developer Tools 是Chrome内嵌的一系列编辑和调试的工具 ...
- NHibernate composite-id联合主键配置
NHibernate的联合主键配置比较复杂,初次配置可能需要花些时间,但只要我们理解了,掌握一定的步骤还是很容易的. 1.设计数据结构 Users:用户表 名称 Users 说明 用户表 序号 字段名 ...
- 2014第35周三jquery最近用到的内容总结
1.文档加载后执行: $(document).ready(function(){//onload();}); 或$(function(){//onload();}) 2. 选择器使用: $(" ...
- HDU 3415 Max Sum of Max-K-sub-sequence
题目大意:找长度不超过k的最大字段和. 题解:单调队列维护之前k的最小值,思想是对于每一个入队的新元素,如果队尾元素比其大则一直删减,然后插入新元素,对于队首的元素若与当前枚举两相差超过k则直接删去. ...
- iostream.h 和stdio.h区别
stdio.h是C的标准I/O库,是以函数的方式向buffer写入或读取字符.输入输出是这样的printf(...);,scanf(...); iostream是C++的标准I/O库,引入了输入/输出 ...
- < high performance web sites > 阅读小记
high performance web sites 1,减少HTTP请求数 (1)图片加载使用image maps 或者 CSS Sprite (2)使用非http协议,如(ftp:, file: ...