当前位置 主页 > 服务器问题 > Linux/apache问题 >
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;} }