Java JDK1.4 的Robot对象,该对象可以完成屏幕图像截取操作,控制鼠标,键盘,如此便可以轻而易举地实现远程服务器的控制。本文向大家介绍如何用Java Robot对象实现远程服务器的控制,并给出了相应的Java源代码。
实现原理:
(1)被控端通过Robot截取桌面图像通过socket通信传给主控端。
(2)主控端显示被控端桌面,并且把基于被控端图像上的键盘,鼠标事件通过socket通信传给被控端。
(3)被控端响应主控端的鼠标键盘事件。
实现详解:
(一)主控端和被控端通过UDP进行指令交互
/*-主控端向被控端发送指令-*/
String command = ...; //指令
InetAddress inet = ...; //被控端地址
int port = ...; //端口
byte sp[] = command.getBytes();
DatagramPacket packet = new DatagramPacket(sp,sp.length(),inet,port);
DatagramSocket sd = new DatagramSocket();
sd.send(packet);
/*-被控端接收指令-*/
DatagramSocket stockUDP = ...;
DatagramPacket packet = ...;
stockUDP.receive(packet);
String message=new String(packet.getData(),0,packet.getLength()); //得到指令
本程序中用到的指令
public static final String Command_Connection = "connection" ; //建立连接
public static final String Command_Disconnection = "disconnection";//断开连接
public static final String Command_Screen = "screen"; //显示被控端屏幕
public static final String Command_Control="control"; //建立控制套接
(二)被控端向主控端传递图像
/*-被控端获取屏幕图像-*/
Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());//全屏区域
Robot robot=new Robot();
BufferedImage image = robot.createScreenCapture(rect);
/*-开启图像传送线程-*/
Socket socket = ...;
OutputStream out = socket.getOutputStream();
BufferedImage image ;
JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(out);
......
public void run(){
while(true){
image = ...; //获取屏幕图像
encoder.encode(image); //发送图像给主控端
Thread.sleep(Environment.IMAGE_GETTIME); //图像采集时间间隔
}
}
/*-主控端图像接收线程-*/
JPEGImageDecoder de = JPEGCodec.createJPEGDecoder(socket.getInputStream());
BufferedImage image = null ;
......
public void run(){
while(true){
image = de.decodeAsBufferedImage();
if (image != null) {
/*显示图像*/
}
}
}
(三)图像显示,鼠标,键盘监听
/*-图像显示-*/
public class ControlledScreenPanel extends JPanel implements MouseMotionListener,
MouseListener,MouseWheelListener ,KeyListener{
private BufferedImage image ;
public void setBufferedImage(BufferedImage bi) { //更新图像
image = bi;
Dimension d = new Dimension(image .getWidth(this),image .getHeight(this));
setPreferredSize(d);
revalidate();
repaint();
}
public void paintComponent(Graphics g) { //绘制图像
super.paintComponent(g);
Dimension d = getSize();
g.setColor(getBackground());
g.fillRect(0, 0, d.width, d.height);
if (image != null) {
g.drawImage(image , 0, 0, this);
}
}
}
/*-鼠标,键盘监听-*/
private MainControlSocket control ; //发送鼠标,键盘事件到被控端
public void mouseDragged(MouseEvent e) {
control.sendControlledAction(e);
}
public void mouseMoved(MouseEvent e) {
control.sendControlledAction(e);
}
//--------------------------------------------------------------------------
public void mouseClicked(MouseEvent e) {
requestFocus();//单击获得焦点
}
public void mousePressed(MouseEvent e) { //鼠标按下
control.sendControlledAction(e);
}
public void mouseReleased(MouseEvent e) { //鼠标释放
control.sendControlledAction(e);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
//--------------------------------------------------------------------------
public void mouseWheelMoved (MouseWheelEvent e){ //滑轮滚动
control.sendControlledAction(e);
}
//--------------------------------------------------------------------------
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) { //键盘按下
control.sendControlledAction(e);
}
public void keyReleased(KeyEvent e) { //键盘释放
control.sendControlledAction(e);
}
/*-发送鼠标,键盘事件到被控端-*/
class MainControlSocket {
private Socket socket = null;
private ObjectOutputStream out = null; //事件对象发送封装
......
public void sendControlledAction(InputEvent event) {
try {
out.writeObject(event);
}
catch (IOException e) {
e.printStackTrace();
}
}
......
}
(三)被控端接收,响应键盘鼠标事件
private Socket socket = ...;
private ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
private Robot action = new Robot();
public void run(){
......
while(true){
Object obj = in.readObject(); //获得鼠标键盘事件
if (obj != null) {
handleEvent( (InputEvent) obj); //处理鼠标键盘事件
}
}
......
}
private void handleEvent(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 int getMouseClick(int button) { //取得鼠标按键
if (button == MouseEvent.BUTTON1) //左键 ,中间键为BUTTON2
return InputEvent.BUTTON1_MASK;
if (button == MouseEvent.BUTTON3) //右键
return InputEvent.BUTTON3_MASK;
return -100;
}
......
}
分享到:
相关推荐
在IT领域,远程控制是一种技术,允许用户通过网络对另一台计算机进行操作,...在压缩包中的"RemoteControl"文件可能包含了实现这些功能的相关源代码,深入研究这些代码可以帮助我们更好地理解Java远程控制的实现细节。
在这个特定的场景中,我们关注的是安卓远程控制源代码,这是一种允许用户通过电脑来控制安卓手机的技术。源代码是软件开发的基础,通过它可以理解程序的工作原理并对其进行修改或扩展。 安卓远程控制系统的实现通常...
本资源提供的是一个名为"RemoteAdmin"的远程控制程序源代码,这为我们深入理解远程控制的工作原理和实现方法提供了宝贵的学习材料。 1. **远程控制基础** 远程控制的基础是网络通信协议,如TCP/IP,通过这些协议,...
总结来说,这个“remotecontrol”项目是一个用Java实现的远程桌面控制解决方案,它利用了Java的多平台支持、强大的图形和网络编程能力,以及可能的第三方协议实现,来提供高效、安全的远程控制功能。对于学习者而言...
基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文) 基于JAVA C/S远程监控系统软件的实现 摘 要 近年来,网络技术的不断发展,为远程监控技术的发展创造了条件。远程监控系统软件越来越受到人们的重视,...
在本项目中,"springboot实现远程控制"是一个利用Spring Boot技术栈构建的后端服务,结合了Java的Robot类和WebSocket技术,旨在创建一个简单的远程控制应用。这个应用允许用户通过浏览器(B/S架构)进行远程操作,实现...
以上就是这个“安卓Android源码——Android应用源码之 实现远程控制PC源代码.zip”所涵盖的主要技术点,每一个点都是Android开发者需要掌握的基础知识,同时也是构建高效、稳定远程控制应用的关键。通过深入学习和...
在"java_remote"这个压缩包中,很可能包含了实现以上功能的Java源代码文件,如服务器端和客户端的主类、网络通信模块、图像处理模块等。通过阅读和分析这些代码,我们可以深入了解Java远程桌面控制系统的具体实现...
"远程控制的源码"是一个关于实现这类功能的程序代码集合,可能是用特定编程语言编写的,比如C++, Python, C# 或者Java等。 源码,即编程语言的原始代码,是程序员编写的未被编译或解释成机器语言的文本。理解并分析...
在提供的源代码中,应包含了以上所述的各个步骤的实现,包括设备发现、连接建立、数据传输等关键功能。通过分析和理解这些代码,开发者可以学习到如何在Java环境下与Android设备进行蓝牙通信。同时,为了确保安全性...
它的控制的过程是先在被监控端电脑上执行客户端程序,像一个普通的客户一样向主控端电脑中的服务器端程序发出信号,建立一个特殊的远程服务,然后通过这个远程服务,接收主控端发送过来的远程控制命令,并对命令进行...
在进行一台电脑对多台远端电脑进行控制时,我们发现,远程监控软件似乎更像一个局域网的网络管理员,而提供远程控制的远程终端服务就像极了办公室局域网的延伸。这种一对多的连接方式在节省了调制解调器的同时,还...
智能电表远程抄表缴费管理平台JAVA源码是一款基于JAVA技术构建的物联网应用,主要用于实现对各类主流品牌智能电表的远程数据采集和自动化管理。该平台具备高度的兼容性,能够支持正泰电表、人民电表、天正电表和许继...
总的来说,"编程实现手机远程控制电脑VC源代码"这个项目涵盖了网络编程、跨平台通信、UI设计和系统集成等多个方面,是学习和提高编程技能的良好实践。通过深入理解和实现这个项目,开发者可以增强自己在这些领域的...
在本项目中,我们探索了如何使用Android设备作为客户端,通过Qt应用程序作为服务器端,实现远程控制个人计算机(PC)的功能。这个系统允许用户通过他们的Android手机执行一系列在PC上的操作,增强了移动设备的实用性...
本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过...
【标题】"Android手机连接电脑手机端源代码"揭示了Android设备与个人计算机(PC)之间进行通信的技术细节。在Android开发中,这种连接通常用于调试、数据传输、设备控制或者进行性能分析。以下是该主题涉及的主要...
如果这是一个Java项目,那么这个文件可能包含了源代码、编译后的类文件、配置文件等。使用这些文件,开发者可以了解VNC客户端的实现细节,甚至可以进行二次开发,定制适合自己需求的远程桌面解决方案。 总的来说,...
通过分析和理解这个源代码,我们可以深入了解如何通过无线网络实现对硬件设备的远程操控。 首先,我们要明白WIFI小车的核心在于无线通信和车辆控制两部分。无线通信通常基于TCP/IP协议,通过WiFi模块将指令从控制器...