java远控_Java实现远程控制技术完整源代码分享
Java实现远程控制技术
java⾃带的java.和bot. 的混合可以⽤于实现通过⽹络对另⼀台计算机的远程控制,其中包括控制远程计算机⿏标的动作和键盘的输⼊,以及实时获得远程计算机屏幕的图像。本⽂将⽤简洁的语⾔和由浅⼊深的逻辑,教⼤家如何掌握这个技术。
⾸先先看⼀下效果图:
远程端计算机界⾯:
控制端计算机界⾯:
控制端输⼊:
远程端输⼊:
⼀下开始详细介绍远程控制的技术思路。
mousemove是什么键
⾸先两台计算机通过java的Socket来进⾏连接。
⼀端先打开⼀个ServerSocket,然后另外⼀端⽤socket进⾏连接。
服务器端
应该设置⼀个ServerSocket,并且初始化需要⽤到的输⼊输出流:
public static void OpenServer() throws IOException, ClassNotFoundException{
System.out.println("");
ServerSocket server = new ServerSocket(7777);
socket = server.accept();
System.out.println("连接上...\n"+socket);
OIS = new InputStream());
OOS=new OutputStream());
}
客户机端
应该⽤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);
}
OOS = new OutputStream());
OIS = new InputStream());
}
这样两台计算机就链接在⼀起并且可以通过流(InputStream和OutputStream)来交换数据了
接下来⼤家可以想⼀想,要实现远程控制的两台计算机需要交换什么信息呢?⾸先被控制端需要不断向控制端提供截取的屏幕图像(这个我们将会⽤bot来实现),然后⿏标和键盘根据控制端传来的事件(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.Name();
FileInputStream FIS = new FileInputStream(filePath);
byte[] bytes = new byte[(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 = (adObject();
FileOutputStream FOS = new FileOutputStream("D:\\OUT\\"+g.getFileName()); FOS.FileContent(),0,(FileLength());
FOS.flush();
FileInputStream FIS= new FileInputStream("D:\\OUT\\"+g.getFileName()); BufferedImage BI = ad(FIS);
IIC=new ImageIcon(BI);
Image img = Image();
Toolkit tk = DefaultToolkit() ;
Dimension d =tk.getScreenSize();
int w = d.width;
int h =d.height;
BufferedImage bi = resize(img,800,600);
imag_lab.setIcon(new ImageIcon(bi));
paint();//销掉以前画的背景
}
private static BufferedImage resize(Image img, int newW, int newH) {
int w = Width(null);
int h = Height(null);
BufferedImage dimg = new BufferedImage(newW, newH,BufferedImage.TYPE_INT_BGR);
Graphics2D g = ateGraphics();
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论