java实现远程桌面

控制端将鼠标事件传递到服务端
服务端拿到鼠标事件之后传输到客户端
客户端拿到鼠标事件之后,通过robot类即可完成,并且截屏将图片发给服务器,服务器再发给控制端

被我简化之后得到


//先介绍一下robot类的简单使用
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;/*** 使用robot* @author 哑元**/
public class RobotTest {public static void main(String[] args) throws AWTException {Robot r = new Robot();r.mouseMove(300, 500);//鼠标移动r.mousePress(InputEvent.BUTTON1_MASK ); //鼠标按下r.mouseRelease(InputEvent.BUTTON1_MASK);//鼠标松开r.keyPress((int)'A');   //键盘按下  (int)'A'表示将A转换成键盘对应的keyr.keyRelease((int)'A'); //键盘松开}
}//屏幕抓取
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;/*** 抓取本地桌面图片* @author 哑元**/
public class ScreenTest {public static void main(String[] args) throws AWTException, InterruptedException {Robot robot = new Robot();  JFrame jframe = new JFrame();jframe.setSize(1200, 700);JLabel label = new JLabel();jframe.add(label);//四个参数x y width heightjframe.setVisible(true);jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE );//构建一个死循环动态截取while(true){BufferedImage image = robot.createScreenCapture(new Rectangle(0,0,1366,768));//截取屏幕label.setIcon(new ImageIcon(image));Thread.sleep(50);}   }}

//远程控制原理讲解
//分为server端和client端,
//原本server端只作为转发,作为演示,就不写转发
//也就是client端控制server端E
/**
* 这里我采用的是,在client端也就是操控端,接收到server端发送过来的screen之后,然后发送鼠标事件过去
* 然后再用robot处理
* 传输方式用socket+io即可处理
* 屏幕截取和图片压缩采用了robot的屏幕截取功能和jdk自带的图片编码器,将其转换成一个字节数组
* 发送给server端之后,robot通过io+socket可以直接拿到object对象,强制转换成InputEvent(keyEvent和MouseEvent都继承)之后
* 通过判断event类型,分别处理即可,这里在服务端需要用到两个线程,一个是屏幕截取和发送给客户端,一个是用来监听客户端
* 传递过来的事件
*/

//下面是具体实现代码


//server主程
import java.awt.AWTException;
import java.awt.Event;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 服务端* @author 哑元**/
public class Server {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(80);System.out.println("服务器已经正常启动");Socket socket = server.accept();//等待接收请求,阻塞方法System.out.println("有客户端连接");DataOutputStream dos = new DataOutputStream(socket.getOutputStream());//将客户端与服务器端链接的输出流交个ImageThread处理ImageThread imageThread = new ImageThread(dos);new Thread(imageThread).start();new Thread(new EventThread(new ObjectInputStream(socket.getInputStream()))).start();}
}
/*** 用来处理接收过来的鼠标事件或者键盘事件*/
class EventThread implements Runnable{private ObjectInputStream ois;private Robot robot;public EventThread(ObjectInputStream ois) {this.ois = ois;}@Overridepublic void run() {try {robot = new Robot();while(true){InputEvent event = (InputEvent)ois.readObject();//得知由客户端传递过来的是一个object对象actionEvent(event);//处理事件}} catch (AWTException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {ois.close();} catch (IOException e) {e.printStackTrace();}}}/*** 事件处理,用来判断事件类型,并用robot类执行* @param event*/public void actionEvent(InputEvent event){System.out.println(event);if(event instanceof KeyEvent){KeyEvent e = (KeyEvent)event;int type = e.getID();//拿到事件类型if(type==Event.KEY_PRESS){robot.keyPress(e.getKeyCode());}else if(type == Event.KEY_RELEASE){robot.keyRelease(e.getKeyCode());}}else if(event instanceof MouseEvent){MouseEvent e = (MouseEvent)event;int type = e.getID();if(type == Event.MOUSE_MOVE){robot.mouseMove(e.getX(),e.getY());}else if(type == Event.MOUSE_DOWN){robot.mousePress(getMouseKey(type));}else if(type == Event.MOUSE_UP){robot.mouseRelease(getMouseKey(type));}else if(type == Event.MOUSE_DRAG){robot.mouseMove(e.getX(), e.getY());//鼠标拖动}}}/*** 返回鼠标的真正事件,鼠标时间不能直接处理,需要进过转换* @return*/public int getMouseKey(int button){if(button == MouseEvent.BUTTON1){//鼠标左键return InputEvent.BUTTON1_MASK;}else if(button == MouseEvent.BUTTON2){//鼠标右键return InputEvent.BUTTON2_MASK;}else if(button == MouseEvent.BUTTON3){//滚轮return InputEvent.BUTTON3_MASK;}else{return 0;}}}//屏幕截取器和发送器,这里需要拿到socket的out流
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.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;import com.sun.image.codec.jpeg.*;
/*** 用来将图片数据发送* @author 哑元**/
public class ImageThread implements Runnable{DataOutputStream dos = null;    //数据输出流public ImageThread(DataOutputStream dos){this.dos = dos;}@Overridepublic void run() {try {Robot robot = new Robot();//截取整个屏幕Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();/*int width = (int)dimension.getWidth();int height = (int)dimension.getWidth();Rectangle rec = new Rectangle(0,0,width,height);*/Rectangle rec = new Rectangle(dimension);BufferedImage image;byte imageBytes[];while(true){image = robot.createScreenCapture(rec);imageBytes = getImageBytes(image);dos.writeInt(imageBytes.length);dos.write(imageBytes);dos.flush();Thread.sleep(50);   //线程睡眠}} catch (AWTException e) {e.printStackTrace();} catch (ImageFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}finally{try {if(dos!= null)  dos.close();} catch (IOException e) {e.printStackTrace();}}}/***  压缩图片* @param 需要压缩的图片* @return 压缩后的byte数组* @throws IOException * @throws ImageFormatException */public byte[] getImageBytes(BufferedImage image) throws ImageFormatException, IOException{ByteArrayOutputStream baos = new ByteArrayOutputStream();//压缩器压缩,先拿到存放到byte输出流中JPEGImageEncoder jpegd = JPEGCodec.createJPEGEncoder(baos);//将iamge压缩jpegd.encode(image);//转换成byte数组return baos.toByteArray();  }}--------------------------------------------------------------------------------------
//client端,用来接收creen图片和发送鼠标事件
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.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;/*** 客户端* @author 哑元**/
public class Client {public static void main(String args[]) throws UnknownHostException, IOException{Socket s = new Socket("127.0.0.1",80);DataInputStream dis = new DataInputStream(s.getInputStream());ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());ClientWindow cw = new ClientWindow(oos);byte[] imageBytes;while(true){imageBytes = new byte[dis.readInt()];   //先拿到传过来的数组长度dis.readFully(imageBytes);  //所有的数据存放到byte中cw.repainImage(imageBytes);}}
}/*** 客户端窗体* @author 哑元**/
class ClientWindow extends JFrame{private ObjectOutputStream oos;private JLabel label;//重写背景图片方法public void repainImage(byte [] imageBytes){label.setIcon(new ImageIcon(imageBytes));this.repaint();}public ClientWindow(ObjectOutputStream oos){this.oos = oos;this.setTitle("远程控制程序");label = new JLabel();JPanel p = new JPanel();p.add(label);JScrollPane scroll = new JScrollPane(p);//给p面板添加滚动条this.add(scroll);this.setSize(1024,768);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setVisible(true);this.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyReleased(KeyEvent e) {sendEvent(e);}@Overridepublic void keyPressed(KeyEvent e) {sendEvent(e);}});label.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {sendEvent(e);}@Overridepublic void mousePressed(MouseEvent e) {sendEvent(e);}@Overridepublic void mouseClicked(MouseEvent e) {sendEvent(e);}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}});}public void sendEvent(InputEvent event){try {oos.writeObject(event);} catch (IOException e) {e.printStackTrace();}}
}

java实现远程桌面相关推荐

  1. Java实现远程桌面连接

    最近因为项目的原因,需要在系统(基于Java语言的)中调用远程桌面连接登录到其它三方系统,于是需要采用Java实现远程桌面连接.Java嘛,开源代码很多,于是搜集资料,找到了一个不错的开源Java R ...

  2. 远程桌面监控系统java_基于Java的远程桌面监控源代码

    <基于Java的远程桌面监控源代码>由会员分享,可在线阅读,更多相关<基于Java的远程桌面监控源代码(43页珍藏版)>请在人人文库网上搜索. 1.基于Java的远程桌面监控源 ...

  3. java版远程桌面控制(简约版)

    这个版本是通过截取桌面图片来显示远程桌面,有一个很明显的问题就是图片大小,我尝试过一些方式,但是效果都不太好,所以准备放弃这种方式进行最终实现,具体说明下我使用了那些方式去缩小图片大小... 1. 直 ...

  4. java 连接远程桌面_Java实现远程桌面(参赛作品)

    [实例简介] 本人参赛作品,纯java实现多台电脑间的远程桌面连接. [实例截图] [核心代码] javaSE实现远程桌面 └── javaSE实现远程桌面 ├── 1.程序介绍 │   └── AI ...

  5. java wmi远程桌面服务器_WMI实现远程监控多台windows服务器

    简介 WMI简介: WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远程 ...

  6. Windows server 2019 简体中文版简单设置远程桌面访问

    以前Windows server 系统都要再电脑-属性里面设置然后再防火墙位置设置,远程桌面才能访问.现在Windows server 2019 简化流程,只需要在设置-显示-远程桌面就可以设置了.不 ...

  7. java远程桌面图片压缩问题_java用Socket实现的远程桌面浏览 内存溢出问题

    用socket做长连接时,出现了内存溢出的错误.搞了4天的时间总算是搞定了. 现总结下: 1.socket一般分为短连接和长连接. 长连接是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不 ...

  8. java如何控制远程桌面_Java实现屏幕抓图,控制远程桌面

    主要使用的是java.util.Robot类来捕获屏幕,可以实现对屏幕一个矩形区域的捕获,通过这个类,我们也可以实现一个远程桌面控制的程序. package com.qiu.util; import ...

  9. java中的properJavaRDP实现远程桌面连接windows主机

    java开发中存在部分场景需要通过java进行远程连接windows主机. 1.下载源码: 官网地址:https://sourceforge.net/projects/properjavardp/fi ...

最新文章

  1. 如何在Linux下使用Gitblit工具创建Git仓库服务
  2. c++   string类
  3. python中的utils模块_使用Python的package机制如何简化utils包设计详解
  4. 微软caffe-SSD的训练和预测(windows cpu)
  5. python大鱼吃小鱼_python 游戏编程 大鱼吃小鱼
  6. P4231 三步必杀 二次差分
  7. 设计模式系列 - 原型模式
  8. Linux 主机信息 总览
  9. (找规律)Magic of David Copperfield
  10. 中台生态的形成:全面解读技术、研发、移动中台建设
  11. git、github、gitlab、gitee的区别
  12. 文本分类(一)封装分词器
  13. 6)Thymelead th:with 局部变量 与 属性优先级 和 Thymeleaf 注释
  14. 去除Word中的红色或则绿色波浪线
  15. 逍遥模拟器1 android,逍遥安卓模拟器5.1.1
  16. html+css鼠标悬停发光按钮![HTML鼠标悬停的代码]使用HTML + CSS实现鼠标悬停的一些奇幻效果!
  17. 晶联讯12864液晶+STM32+HAL库 IO模拟SPI成功实现显示。
  18. 对称加密和非对称加密!
  19. canvas scale()画布缩放的使用
  20. 现代信号处理——平稳随机信号

热门文章

  1. 贪心算法解决活动安排-Python实现(排序+贪心选择)
  2. Rust语法之if语句
  3. 物联网展-2019北京国际物联网展览会-北京物联网展-北京物联网大会
  4. Web前端开发常见面试题总结
  5. 自来水公司收费管理系统升级
  6. leancloud实现用户头像修改
  7. 施工企业物资管理软件
  8. 不小心敲了 rm -rf / 后反应是怎样的?
  9. iiis环境安装php多个版本
  10. 什么是脏读、幻读、不可重复读?要怎么处理?