Java实现远程控制技术
java自带的java.net.和java.awt.robot.的混合可以用于实现通过网络对另一台计算机的远程控制,其中包括控制远程计算机鼠标的动作和键盘的输入,以及实时获得远程计算机屏幕的图像。本文将用简洁的语言和由浅入深的逻辑,教大家如何掌握这个技术。
首先先看一下效果图:
远程端计算机界面:
控制端计算机界面:
控制端输入:
远程端输入:
一下开始详细介绍远程控制的技术思路。
首先两台计算机通过java.net的Socket来进行连接。
一端先打开一个ServerSocket,然后另外一端用socket进行连接。
服务器端
应该设置一个ServerSocket,并且初始化需要用到的输入输出流:
publicstaticvoidOpenServer() throwsIOException, ClassNotFoundException{
System.out.println("ServerStart.....");
ServerSocket server = newServerSocket(7777);
socket = server.accept();
System.out.println("连接上...\n"+socket);
OIS = newObjectInputStream(socket.getInputStream())
OOS=newObjectOutputStream(socket.getOutputStream());
}
客户机端
应该用socket去连接服务器,并且初始化输入输出流:
publicstaticvoidStartConnection(String IP,intport) throwsUnknownHostException, IOException, AWTException{
socket = newSocket("192.168.0.106",7777);
if(socket.isConnected()){
System.out.println("socket connected..."+socket);
}
OOS = newObjectOutputStream(socket.getOutputStream());
OIS = newObjectInputStream(socket.getInputStream());
}
这样两台计算机就链接在一起并且可以通过流(InputStream和OutputStream)来交换数据了
接下来大家可以想一想,要实现远程控制的两台计算机需要交换什么信息呢?首先被控制端需要不断向控制端提供截取的屏幕图像(这个我们将会用java.awt.robot来实现),然后鼠标和键盘根据控制端传来的事件(inputEvent)来做出相同的操作(用robot来实现)。然后控制端当然首先要接收被控制端传来的图像并且反映到一个面板上(pane),然后监听本机上键盘鼠标的动作再传给被控制端的主机(我们通过在面板pane上设置一个监听器listener来实现)
这里遇到的一个问题就是用于传送的图片无论是用image还是用bufferedImage都是不可串行化的。所以不能用I/OStream进行传送,所以为了解决这个问题,我们需要把图像数据封装在一个类里面并implements Serializable接口
图像类如下:
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.Serializable;publicclassMessage implementsSerializable {
privatestaticfinallongserialVersionUID = 1L;
privateString fileName; // 文件名称
privatelongfileLength; // 文件长度
privatebyte[] fileContent; // 文件内容
publicMessage(){
}
publicMessage(String filePath) throwsIOException{
File file = newFile(filePath);
this.fileLength=file.length();
this.fileName=file.getName();
FileInputStream FIS = newFileInputStream(filePath);
byte[] bytes = newbyte[(int)fileLength];
FIS.read(bytes,0,(int)fileLength);
this.fileContent=bytes;
}
publicString getFileName()
{ returnfileName;}
publicvoidsetFileName(String fileName)
{ this.fileName = fileName;}
publiclonggetFileLength(
{ returnfileLength; }
publicvoidsetFileLength(longfileLength)
{this.fileLength = fileLength;}
publicbyte[] getFileContent(
{returnfileContent;}
publicvoidsetFileContent(byte[] fileContent)
{this.fileContent = fileContent;}}
这样就可以实现图像通过ObjectInputStream和ObjectOutputStream的串行化传播了
了解了以上基础之后首先我们要完成控制端的UI界面设置,图片接收,和键盘鼠标动作监听:
首先是设置接收图片:
这样接收了来自ObjectInputStream的Message类之后就可以把图片重新设置到面板pane的大小然后展示出来
下一步就是设置面板属性和监听器:
监听器:
以上就完成了控制端。
接下来我们将构建被控制端:
被控制端需要使用robot来截图并发送,而且需要写一个方法来对接收到的InputEvent进行反应
首先是截图和发送:
注意到这段代码中使用了D:\OUT\目录作为临时文件的存放地方,读者使用这个代码的时候需要自己设置临时文档的存放
然后实现robot对于接收到的InputEvent指令进行操作:
我做开发十多年的时间,如果大家对于学习java的学习方法,学习路线以及你不知道自己应该是自学还是培训的疑问,都可以随时来问我,大家可以加我的java交流学习qun:615741636。qun内有学习教程以及开发工具。