java实现远程控制

今天我第一次用markdow写博客,虽然感觉有点别扭,但是好歹也要尝试一下新的事物。
今天我做java的远程操纵程序,类似QQ的远程控制。
但是只是做了鼠标和键盘的,而且因为是一个人做,所以测试相当的不方便,程序运行后鼠标进入了无限的返回,到星期六再和队友测试一下。
还有就是想做屏幕同步功能,但是遇到了BufferedImage类没序列化的难题,本来是想创建一个新的MyBufferedImage类继承BufferedImage类然后再实现序列化接口Serializable,后来我发现我想得太简单了,继承BufferedImage类需要重写里面的方法。
再加上现在时间也比较晚了,所以就没有做下去,明天再解决问题吧。
下面是我的java远程控制实现(只有鼠标键盘控制,没有界面同步)代码:
客户端有两个类,一个是单例客户端的封装类,还有一个是界面类:
界面类:

package control;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.ObjectInputStream;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ControlClient extends JFrame{public JPanel jp;public static void main(String[] args) {ControlClient cc = new ControlClient();cc.remoteConnect();cc.initFrame();}public void initFrame(){setTitle("");Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();setSize(dim);setDefaultCloseOperation(3);setLocationRelativeTo(null);setVisible(true);
//      ClientRun(ClientSingle.getClientSingle().getObjectInputStream(),this);this.addMouseListener(ma);this.addKeyListener(ka);this.addMouseMotionListener(ma);this.addMouseWheelListener(ma);}MouseAdapter ma = new MouseAdapter(){public void mousePressed(MouseEvent e) {SendEvent(e);}public void mouseClicked(MouseEvent e) {SendEvent(e);}public void mouseReleased(MouseEvent e) {SendEvent(e);}public void mouseMoved(MouseEvent e) {SendEvent(e);}};KeyAdapter ka = new KeyAdapter(){public void keyPressed(KeyEvent e) {SendEvent(e);}public void keyReleased(KeyEvent e) {SendEvent(e);}};private void SendEvent(InputEvent e){try {ClientSingle.getClientSingle().getObjectOutputStream().writeObject(e);ClientSingle.getClientSingle().getObjectOutputStream().flush();} catch (Exception e1) {e1.printStackTrace();}}private void remoteConnect(){//获取连接ClientSingle.getClientSingle().getConnect();System.out.println("连接服务器成功......");}private void ClientRun(ObjectInputStream ois,JFrame jf){new Thread(){public void run() {while(true){try {Object obj = ois.readObject();BufferedImage screenshot = (BufferedImage) obj;Graphics g = jf.getGraphics();g.drawImage(screenshot, 0, 0, null);} catch (Exception e) {e.printStackTrace();}}};}.start();}
}

下面的是客户端对象的单例实现:

package control;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class ClientSingle {//客户端单例实现private ClientSingle(){//构造函数私有}private static ClientSingle cs ;//客户端对象私有public static synchronized ClientSingle getClientSingle(){if( cs == null ){cs = new ClientSingle();}return cs;}private Socket client;private ObjectOutputStream oos;private ObjectInputStream ois;public ObjectOutputStream getObjectOutputStream(){return oos;}public ObjectInputStream getObjectInputStream(){return ois;}public void getConnect(){if( client == null ){try {client = new Socket("localhost",9090);oos = new ObjectOutputStream(client.getOutputStream());ois = new ObjectInputStream(client.getInputStream());} catch (Exception e) {e.printStackTrace();} }}public void closeConnect(){try {ois.close();oos.close();client.close();client = null;} catch (Exception e) {e.printStackTrace();}}}

客户端类:

package control;
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import javax.imageio.ImageIO;
public class ByControlServer {private Robot robot;{try {robot = new Robot();} catch (AWTException e) {e.printStackTrace();}}public static void main(String[] args) {ByControlServer bcs = new ByControlServer();bcs.initServer();}public void initServer(){try {ServerSocket ss = new ServerSocket(9090);Socket socket = ss.accept();System.out.println("有客户端连接上服务器......");ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());while(true){Object obj = ois.readObject();if( obj instanceof MouseEvent ){MouseEvent me = (MouseEvent)obj;int id = me.getID();if( id == MouseEvent.MOUSE_PRESSED ){int ButtonNum = me.getButton();if( ButtonNum == MouseEvent.BUTTON1 ){robot.mousePress(InputEvent.BUTTON1_MASK);}else if( ButtonNum == MouseEvent.BUTTON2 ){robot.mousePress(InputEvent.BUTTON2_MASK);}else if( ButtonNum == MouseEvent.BUTTON3 ){robot.mousePress(InputEvent.BUTTON3_MASK);}}else if( id == MouseEvent.MOUSE_RELEASED || id == MouseEvent.MOUSE_CLICKED ){int buttonNum = me.getButton();if( buttonNum == MouseEvent.BUTTON1 ){robot.mouseRelease(InputEvent.BUTTON1_MASK);}else if( buttonNum == MouseEvent.BUTTON2 ){robot.mouseRelease(InputEvent.BUTTON2_MASK);}else if( buttonNum == MouseEvent.BUTTON3 ){robot.mouseRelease(InputEvent.BUTTON3_MASK);}}else if( id == MouseEvent.MOUSE_MOVED || id == MouseEvent.MOUSE_DRAGGED ){robot.mouseMove(me.getX(), me.getY());}}else if( obj instanceof KeyEvent ){KeyEvent ke = (KeyEvent) obj;int id = ke.getID();if( id == KeyEvent.KEY_PRESSED ){robot.keyPress(ke.getKeyCode());}else if( id == KeyEvent.KEY_RELEASED ){robot.keyRelease(ke.getKeyCode());}}
//              getImage(oos);}} catch (Exception e) {e.printStackTrace();}}public void getImage(ObjectOutputStream oos){try{Dimension d = Toolkit.getDefaultToolkit().getScreenSize();BufferedImage screenshot = (new Robot()).createScreenCapture(new Rectangle(0,0,(int)d.getWidth(),(int)d.getHeight()));String name = "C:\\Users\\asus\\Desktop\\jietu.png";File f = new File(name);ImageIO.write(screenshot, "png", f);oos.writeObject(screenshot);oos.flush();}catch(Exception e){}}
}

远程控制建立后,就进入鼠标的无限返回,按下alt键后出现序列化异常

客户端只能够看到一边的窗口

屏幕截图已经实现,但是在发送至客户端的时候出现序列化异常,BufferedImage没办法序列化
**

java实现远程控制相关推荐

  1. java远控_利用Java实现远程控制

    利用 Java 实现远程控制 摘 要: 介绍了远程控制地原理 , 详细地叙述了利用 Java 实现远程控制软件地程序设计方法和要点 , 并给出了要点地具体实现方法 . 关键词: 远程控制: Java ...

  2. java远控_基于java的远程控制 示例源码

    [实例简介]基于java的远程控制软件 [实例截图] 远程连接客户端如下: 服务端如下: [核心代码] package tcpudp; import java.awt.BorderLayout; im ...

  3. JAVA实现远程控制(JAVA in RemoteControl)

    远程控制(RemoteControl) 远程控制的基本原理 事件回放原理 捕获桌面原理 远程控制(RemoteControl)的核心技术 1 .Socket编程 2.控制端事件的封装 3.画面的传输 ...

  4. 字节跳动面试真题:java实现远程控制

    正文 MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方 ...

  5. Java 远程控制全实现:高效解决远程控制场景,附代码示例

    JAVA实现远程控制(JAVA in RemoteControl)可以通过Java Remote Method Invocation(Java RMI)或Java Socket编程实现. 1. Jav ...

  6. 祝贺 Java 走过创新的 25 年

    从最初面向消费类电子产品领域而设计,到在企业级应用程序.游戏开发.电子政务,乃至无人驾驶.线上支付.太空探索等场景中游刃有余,可以说,Java 凭借其抽象.封装.继承.多态的特性,在整个互联网迭代的进 ...

  7. 使用Java制作一个简易的远控终端

    使用Java制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端 ...

  8. 基于java智能家居,基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿...

    基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿 PINGDINGSHAN UNIVERSITY毕业论文 (设计 )题 目:基于 JAVA 的智能家居控制系 统的设计(信息控制端的设 ...

  9. java创意生日快乐_Java,25岁生日快乐!

    原标题:Java,25岁生日快乐! 25年前, 我们无论如何也无法想象, 世界距离我们, 只有几次点击的距离. 而在今天, 这种便捷的生活方式 比以往任何时候都更重要. 这背后离不开Java, 以及无 ...

最新文章

  1. Chrome浏览器偶尔提示错误net::ERR_EMPTY_RESPONSE的解决方法
  2. 20145234黄斐《java程序设计》第六周
  3. MapReduce_自学过程(一)
  4. 北大计算机学院 教授 湖南人,北大湘籍教授邹恒甫简历
  5. Kenai.com 将与 java.net 合并
  6. CentOS系统更换yum源(repomd.xml not found解决方案)
  7. python 发送邮件不显示附件_求助:写python脚本发 带有附件的邮件, 收到邮件后,发现附件直接显示在屏幕上了,而不是以附件形式...
  8. 实验吧-杂项-WTF?(python 01代码转图片)
  9. 迭代DOM集合的几种方法
  10. self = [super init]的解释
  11. Mybatis 有坑,千万别踩!
  12. 奢侈的休闲度假时光——带着小样儿去三亚(三)
  13. MySQL Data目录查找并迁移到data文件夹中
  14. Android开发教程1~3章笔记
  15. 【解决方案】ArcGIS License Manager启动失败
  16. Ubuntu服务器长时间运行爬虫程序
  17. 小米进军欧洲智能手机市场:一面是狂欢,一面是考验...
  18. 华师计算机学院在职研究生,2021年华南师范大学在职研究生招生简章
  19. java 拖拉机_Java——io流
  20. 2015年讲师评选正式开始,培训行业讲师年终总结啦!!

热门文章

  1. Windows cmd卸载程序
  2. 【20保研】热忱欢迎全国2020届优秀本科毕业生免试攻读重庆大学研究生
  3. Ajax响应前和完成事件 / beforeSend complete / 判断ajax是否执行完毕
  4. 威斯康星大学硕士计算机科学,2020年威斯康星大学密尔沃基分校排名TFE Times美国最佳计算机科学硕士专业排名第90...
  5. mysql 签到_签到功能,用mysql还是redis?
  6. python与redis数据库交互中zadd、zincrby的那些坑:(error) ERR value is not a valid float
  7. 2021CSDN粉丝年度严选文章TOP10榜单出炉~浅看超人气盘点
  8. Java 中文件之魔数
  9. 看甲骨文如何在云端一路高歌猛进!
  10. 阿里云助力中小企业建站 在线免费自助建站成新用户首选