热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要为大家详细介绍了Java实现远程控制技术完整源代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Java实现远程控制技术

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

 

控制端计算机界面:

 

控制端输入:

 

远程端输入:

一下开始详细介绍远程控制的技术思路。
首先两台计算机通过java.net的Socket来进行连接。

一端先打开一个ServerSocket,然后另外一端用socket进行连接。

服务器端

应该设置一个ServerSocket,并且初始化需要用到的输入输出流:

 public static void OpenServer() throws IOException, ClassNotFoundException{
 System.out.println("ServerStart.....");
 ServerSocket server = new ServerSocket(7777);
 socket = server.accept();
 System.out.println("连接上...\n"+socket);
 OIS = new ObjectInputStream(socket.getInputStream());
 OOS=new ObjectOutputStream(socket.getOutputStream());
 }

客户机端
应该用socket去连接服务器,并且初始化输入输出流:

public static void StartConnection(String IP,int port) throws UnknownHostException, IOException, AWTException{
 socket = new Socket("192.168.0.106",7777);
 if(socket.isConnected()){
  System.out.println("socket connected..."+socket);
 }
 OOS = new ObjectOutputStream(socket.getOutputStream());
 OIS = new ObjectInputStream(socket.getInputStream());


 }

这样两台计算机就链接在一起并且可以通过流(InputStream和OutputStream)来交换数据了

接下来大家可以想一想,要实现远程控制的两台计算机需要交换什么信息呢?首先被控制端需要不断向控制端提供截取的屏幕图像(这个我们将会用java.awt.robot来实现),然后鼠标和键盘根据控制端传来的事件(inputEvent)来做出相同的操作(用robot来实现)。然后控制端当然首先要接收被控制端传来的图像并且反映到一个面板上(pane),然后监听本机上键盘鼠标的动作再传给被控制端的主机(我们通过在面板pane上设置一个监听器listener来实现)

这里遇到的一个问题就是用于传送的图片无论是用image还是用bufferedImage都是不可串行化的。所以不能用I/OStream进行传送,所以为了解决这个问题,我们需要把图像数据封装在一个类里面并implements Serializable接口
图像类如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;

public class Message implements Serializable {
 private static final long serialVersiOnUID= 1L;
 private String fileName;  // 文件名称

 private long fileLength;  // 文件长度
 private byte[] fileContent;  // 文件内容

 public Message(){

 }
 public Message(String filePath) throws IOException{
  File file = new File(filePath);
  this.fileLength=file.length();
  this.fileName=file.getName();

  FileInputStream FIS = new FileInputStream(filePath);
  byte[] bytes = new byte[(int)fileLength];
  FIS.read(bytes,0,(int)fileLength);
  this.fileCOntent=bytes;

 }


 public String getFileName()
 { return fileName;}

 public void setFileName(String fileName)

 { this.fileName = fileName;}
 public long getFileLength()
 { return fileLength;
 }

 public void setFileLength(long fileLength)
 {this.fileLength = fileLength;}


 public byte[] getFileContent()
 {return fileContent;}
 public void setFileContent(byte[] fileContent)
 {this.fileCOntent= fileContent;}


}

这样就可以实现图像通过ObjectInputStream和ObjectOutputStream的串行化传播了

了解了以上基础之后首先我们要完成控制端的UI界面设置,图片接收,和键盘鼠标动作监听:

首先是设置接收图片:

public static void reveivePic() throws ClassNotFoundException, IOException{
 Message g = (Message)OIS.readObject();
 FileOutputStream FOS = new FileOutputStream("D:\\OUT\\"+g.getFileName());
 FOS.write(g.getFileContent(),0,(int)g.getFileLength());
 FOS.flush();

 FileInputStream FIS= new FileInputStream("D:\\OUT\\"+g.getFileName());
 BufferedImage BI = ImageIO.read(FIS);
 IIC=new ImageIcon(BI);

 Image img = IIC.getImage();
 Toolkit tk = Toolkit.getDefaultToolkit() ;
  Dimension d =tk.getScreenSize();

  int w = d.width;
  int h =d.height;
  BufferedImage bi = resize(img,800,600);


  imag_lab.setIcon(new ImageIcon(bi));
  imag_lab.repaint();//销掉以前画的背景
 }

 private static BufferedImage resize(Image img, int newW, int newH) {
  int w = img.getWidth(null);
  int h = img.getHeight(null);
  BufferedImage dimg = new BufferedImage(newW, newH,BufferedImage.TYPE_INT_BGR);
  Graphics2D g = dimg.createGraphics();
  g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
   RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);
  g.dispose();
  return dimg;
 }

这样接收了来自ObjectInputStream的Message类之后就可以把图片重新设置到面板pane的大小然后展示出来

下一步就是设置面板属性和监听器:

public static void showUI(){
 //控制台标题
  JFrame jf = new JFrame("控制台");setListener(jf);
  //控制台大小
  jf.setSize(500, 400);
  //imag_lab用于存放画面
  imag_lab = new JLabel();
  jf.add(imag_lab);
  //设置控制台可见
  jf.setVisible(true);
  //控制台置顶
  jf.setAlwaysOnTop(true);
  jf.setResizable(true);
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


 }

监听器:

 public static void setListener( JFrame frame){
  //panel设置监听器
  frame.addKeyListener(new KeyAdapter(){
   public void keyPressed(KeyEvent e) {
    sendEventObject(e);
   }

   @Override
   public void keyReleased(KeyEvent e) {
    sendEventObject(e);
   }

   @Override
   public void keyTyped(KeyEvent e) {

   }
 });
  frame.addMouseWheelListener(new MouseWheelListener(){
   public void mouseWheelMoved(MouseWheelEvent e) {
    sendEventObject(e); 
   }
  });
  frame.addMouseMotionListener(new MouseMotionListener(){

   public void mouseDragged(MouseEvent e) {

    sendEventObject(e);
   }

   public void mouseMoved(MouseEvent e) {


    sendEventObject(e);

   }
  });
  frame.addMouseListener(new MouseListener(){
  public void mouseClicked(MouseEvent e) {
    sendEventObject(e);

   }
  public void mouseEntered(MouseEvent e) {

    sendEventObject(e);
   }
  public void mouseExited(MouseEvent e) {

    sendEventObject(e);
   }
  public void mousePressed(MouseEvent e) {

    sendEventObject(e);
   }
 public void mouseReleased(MouseEvent e) {

    sendEventObject(e);
   }

  });
 }

 private static void sendEventObject(InputEvent event){
  try{ System.out.println("send");
  OOS.writeObject(event);
  OOS.flush();

  }catch(Exception ef){
   ef.printStackTrace();
  }

 以上就完成了控制端。

接下来我们将构建被控制端:
被控制端需要使用robot来截图并发送,而且需要写一个方法来对接收到的InputEvent进行反应
首先是截图和发送:

 public static void CapturePic() throws AWTException, IOException{
 robot= new Robot();
 Message msg = null;
 Toolkit tk = java.awt.Toolkit.getDefaultToolkit();
 java.awt.Dimension dm =tk.getScreenSize();
 java.awt.Robot robot = new java.awt.Robot();
  for (int i = 0; i <50; i++) {
  //截取指定大小的屏幕区域
  Rectangle rec = new Rectangle(0, 0, (int) dm.getWidth(), (int) dm
   .getHeight());
  BufferedImage bimage = robot.createScreenCapture(rec);
  //将图片保存到文件中
  String filePath = "D:\\OUT\\screenshot"+i+".jpeg";
  FileOutputStream fops =new FileOutputStream(filePath);
  javax.imageio.ImageIO.write(bimage, "jpeg", fops);
  fops.flush();
  fops.close();
  msg =new Message(filePath);

  System.out.println(msg.getFileName());
  System.out.println("send");
  OOS.writeObject(msg);
  OOS.flush();

  }
 }

注意到这段代码中使用了D:\OUT\目录作为临时文件的存放地方,读者使用这个代码的时候需要自己设置临时文档的存放

然后实现robot对于接收到的InputEvent指令进行操作:

 public void action() throws AWTException, ClassNotFoundException, IOException{
 Robot robot= new Robot();
 while(true){

 InputEvent e =(InputEvent)OIS.readObject();
  if(e!=null){
 handleEvents(robot,e);}
 }

 }

 public static void handleEvents(Robot action,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 static int getMouseClick(int button) { //取得鼠标按键
 if (button == MouseEvent.BUTTON1) //左键 ,中间键为BUTTON2
  return InputEvent.BUTTON1_MASK;
 if (button == MouseEvent.BUTTON3) //右键
  return InputEvent.BUTTON3_MASK;
 return -100;
 } 

 整个程序到这里就可以结束了。上面的程序并没有实现对机器人类线程的封装。完整可以用的代码可以在以下站内资源处下载我的资源:http://xiazai.jb51.net/201608/yuanma/Java-RomoteControl(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 仙贝旅行是日本最大的旅游服务平台之一,为广大用户提供优质的日本定制游服务。随着用户数量的增长,仙贝旅行决定与智齿科技合作,全面替换原有客服系统,打造全新的在线客服体系。该体系具备多渠道快速接入的能力,让仙贝旅行轻松与各个渠道的接入用户完成沟通。同时,机器人与人工协同发力,提升客户服务水平。 ... [详细]
  • 微软小娜企业版发布新版本,提供构建自定义技能的套件
    微软将向企业级市场发布微软小娜企业版的新版本,该版本提供了构建自定义技能的套件,使企业员工可以更方便地使用数字助理。目前该套件仍处于内测期间,只有部分企业可以获得,其他有兴趣的企业需要继续等待。新版本的套件可以帮助员工构建各种自定义技能,如检查休假余额、创建服务凭证等。微软通过让多个开发人员编辑和管理机器人通道注册配置来改善开发者的体验,团队可以自行访问和更改技能注册,满足企业实际需求。微软小娜企业版已经在各个行业得到采用,能够帮助员工专注于优先事项,将非优先处理的任务交给微软小娜处理。 ... [详细]
  • 硬科技投资时代,投资者们该如何抉择?
    随着越来越多符合国家战略、市场认可度高、突破关键核心技术的科技创新型企业挂牌上市,硬科技投资越来越热。华夏中证科创创业50ETF联接基金的开售为投资者提供了新的选择。硬科技的发展有助于突破“卡脖子”技术、实现进口替代,以及推动产业升级。在硬科技投资时代,投资者们应该如何抉择? ... [详细]
  • 在当前金融科技 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 在工作了一年多后,我对现在的工作感到厌倦,没有激情,于是决定转行做程序猿。我在学校开了一个某宝店,通过自己摸索和努力,每个月挣够了零花钱和伙食费。我决定往互联网方向靠,不喜欢面对面和人沟通,而虚拟世界中的开发工作让我感到兴奋。我开始学习Java,感到困惑和怀疑自己的智商,但一篇鸡汤文激发了我学习Python的兴趣,我感到智商找回来了。我相信没有梦想的人和咸鱼没有什么区别。 ... [详细]
  • 建站ABC智能电销机器人的功能特点及应用优势
    近年来,人工智能化运用越来越普及,各大科技公司为了能够引领市场抢占商机,开发出了多款产品,像建站ABC的电话机器人就是其中之一。电话机器人又名智能电销机器人,是当下各大企业常用的一种工具软件,他能高效率工作、低成本管理,是企业的AI智能外呼助手,功能强大且使用率高。建站ABC智能电销机器人拥有降低人工成本、提高工作效率、提升销售业绩等特点,无论大小型企业均可使用,并可以定制化服务,保障不同企业的不同需求。 ... [详细]
  • maya! board_3D角色模型很难做?Maya、Zbrush人头建模终极秘笈
    MAYA人头建模终极秘笈。教程可谓经典到掉渣。深入的从MAYA人头建模各个层面详尽的介绍了人头建模的方法和所有应当注意的细节。一、简介建立可信的人脸,是每一个三维艺术 ... [详细]
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • 电话营销机器人简单来说,帮你搭建一个后台,导入手机号之后,机器人自动拨打,自动与客户对话,自动筛选客户,主动推送到你的微信上,携带完整版录音,分段式录音,文字版记录等,后边后期销售 ... [详细]
author-avatar
手机用户2502900545
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有