java实现远程桌面的实例代码

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转换成键盘对应的key
  r.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 height
  jframe.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;
 }
 @Override
 public 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;
 }
 @Override
 public 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() {
   @Override
   public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub
   }
   @Override
   public void keyReleased(KeyEvent e) {
    sendEvent(e);
   }
   @Override
   public void keyPressed(KeyEvent e) {
    sendEvent(e);
   }
  });
  label.addMouseListener(new MouseListener() {
   @Override
   public void mouseReleased(MouseEvent e) {
    sendEvent(e);
   }
   @Override
   public void mousePressed(MouseEvent e) {
    sendEvent(e);
   }
   @Override
   public void mouseClicked(MouseEvent e) {
    sendEvent(e);
   }
   @Override
   public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub
   }
   @Override
   public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
   }
  });
 }
 public void sendEvent(InputEvent event){
  try {
   oos.writeObject(event);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

以上这篇java实现远程桌面的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Java实现远程控制技术完整源代码分享
  • java远程连接调用Rabbitmq的实例代码
(0)

相关推荐

  • Java实现远程控制技术完整源代码分享

    Java实现远程控制技术 java自带的java.net.和java.awt.robot. 的混合可以用于实现通过网络对另一台计算机的远程控制,其中包括控制远程计算机鼠标的动作和键盘的输入,以及实时获得远程计算机屏幕的图像.本文将用简洁的语言和由浅入深的逻辑,教大家如何掌握这个技术. 首先先看一下效果图: 远程端计算机界面: 控制端计算机界面: 控制端输入: 远程端输入: 一下开始详细介绍远程控制的技术思路. 首先两台计算机通过java.net的Socket来进行连接. 一端先打开一个Serve

  • java远程连接调用Rabbitmq的实例代码

    本文介绍了java远程连接调用Rabbitmq,分享给大家,希望此文章对各位有所帮助. 打开IDEA创建一个maven工程(Java就可以了). pom.xml文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apac

  • java实现远程桌面的实例代码

    java实现远程桌面的实例代码 控制端将鼠标事件传递到服务端 服务端拿到鼠标事件之后传输到客户端 客户端拿到鼠标事件之后,通过robot类即可完成,并且截屏将图片发给服务器,服务器再发给控制端 被我简化之后得到 //先介绍一下robot类的简单使用 import java.awt.AWTException; import java.awt.Robot; import java.awt.event.InputEvent; /** * 使用robot * @author 哑元 * */ public

  • Java实现FTP服务器功能实例代码

    FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议.在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Download).FTP是实时联机服务,在使用它之前必须是具有该服务的一个用户(用户名和口令),工作时客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作,如改变当前工作目录.列文件目录.设置传输参数及传送文件等.使用FTP可以传送所有类型的文件,如文本文件.二进制可执

  • Java实现单链表翻转实例代码

    Java实现单链表反转,递归和非递归两种形式 /** * 反转单链表 */ /** * 定义链表 * * @author 16026 * */ class Node { int val; Node next; public Node(int val) { this.val = val; } } public class ReverseList { /** * 反转链表 * * @param head * @return */ public static Node reverseList(Node

  • Java执行hadoop的基本操作实例代码

    Java执行hadoop的基本操作实例代码 向HDFS上传本地文件 public static void uploadInputFile(String localFile) throws IOException{ Configuration conf = new Configuration(); String hdfsPath = "hdfs://localhost:9000/"; String hdfsInput = "hdfs://localhost:9000/user/

  • java List 排序之冒泡排序实例代码

    java List 排序之冒泡排序实例代码 List排序,这里介绍两种排序: 1.Collections.sort()排序: 假如List集合中放的是Menu对象. public class Menu{ private int id; private String name; private int seq;//自定义排序字段 //构造函数.getter.setter省略....... } List<Menu> menus=new ArrayList<Menu>(); menus.

  • java中的 toString()方法实例代码

    前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理. 处理要求把集合数据转换成字符串形式,格式为 :子集合1数据+"#"+子集合2数据+"#"+....+子集合n数据. 举例: 集合数据 :[[1,2,3],[2,3,5]]  要求转成为 "[1,2,3]#[2,3,5]"

  • Java构建树形菜单的实例代码(支持多级菜单)

    效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> children;

  • java 实现输出随机图片实例代码

    java  实现输出随机图片实例代码 输出随机图片(CAPTCHA图像):Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的测试) 相关主要类(JDK 查看API) BufferedImage:内存图像 Graphics:画笔 ImageIO:输出图像 放在html页面上<img src/> 注意:浏览器默认会缓存图片 public static int WIDTH =

  • JAVA用户自定义事件监听实例代码

    JAVA用户自定义事件监听实例代码 很多介绍用户自定义事件都没有例子,或是例子不全,下面写了一个完整的例子,并写入了注释以便参考,完整的实例源代码如下: package demo; import Java.util.EventObject; /** * Title: 事件处理类,继承了事件基类 * Description: * Copyright: Copyright (c) 2005 * Company: cuijiang * @author not attributable * @versi

  • java 基本算法之归并排序实例代码

    java 基本算法之归并排序实例代码 原理:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表, * 即把待排序序列分为若干个子序列,每个子序列是有序的.      * 然后再把有序子序列合并为整体有序序列. 实例代码: public class MergeSort { /** * * * * @param args */ public static void main(String[] args) { int a[] = { 49, 38, 65, 97, 76, 13,

随机推荐