Java 实现一个远程控制客户端思路附源码

寰讯天翔创始人兼 CTO,曾任华为高级工程师,中软国际技术咨询顾问,知名大学特聘高级讲师。15 年软件开发及教学经验。曾参与华为 Nastar 系统平台的设计与研发,教育厅资源平台研发,Android 游戏《突突兔》,《岛屿守卫者》等游戏作者。

文章正文

本案例使用 Java 实现了远程控制其他电脑的关机,重启,注销,控制鼠标失效,远程打开计算器,打开浏览器及指定网站的功能。

内容大纲

  1. 什么是远程控制?
  2. 实现远程控制的思路?
  3. 什么是 UDP 和 TCP ?
  4. 发送消息工具类封装。
  5. 接收消息工具类封装。
  6. 客户端 ( 遥控端 ) 界面的代码实现。
  7. 服务端 (受控端 ) 的代码实现。

原理和概念

什么是远程控制?

远程控制技术,就是使用一台电脑来控制另外一台网络互连的电脑的技术。详细来说,就是主控电脑发送指令给受控电脑,然后受控电脑根据指令执行相应的操作。其实这个也是木马病毒实现的原理,当然,这种技术更多被使用于多媒体教学,远程设备检测,远程协助,军事领域等等。

而本文主要通过简单远程控制的实现,让大家理解远程控制的原理及网络通信的应用。并明白远程控制技术并不神秘,实现起来如此简单!

实现远程控制的思路是什么?

先来看下面图示:

无标题

远程控制的实现,需要在遥控端运行能够发送消息的程序。同时受控端需要运行能够接受消息的程序,用来接受程序。换句话说,遥控端要想控制其他电脑,首先需要能知道对方的 IP 和端口,并向对方的 IP 和端口发送消息。而另一方 ( 受控端 ) 则也需要提前安装并运行我们的程序,来接收发送过来的消息。并根据消息的不同,来执行不同的命令!

具体实现和分工如图:

远程控制

上图展示了遥控端和受控端各自的任务和作用:

遥控端主要就是发送消息,当然,为了使用方便,我们需要做一个遥控的操作界面客户端,这里我们使用 Java Swing 技术来实现。

受控端主要是接收消息,并且根据接收的消息再去执行相应的本地命令。作为接收方只需要执行命令,所以就不需要界面了。就像地下党潜入对方队伍中,不需要表明自己的身份,只需要秘密接收中央的指令并执行相应的任务就可以了。

什么是UDP 和 TCP ?

上面我们反复提到了消息的发送和接收,也就是网络通信。所以要实现上面的功能,首先也解决和实现网络通信问题。网络通信中,我们常见的有两种通信方式,也称为网络协议就是 TCP ( Transmission Control Protocol ) 和 UDP ( User Datagram Protocol ) 协议属于传输层协议。我们先来了解下两者的特点和区别。

TCP 是面向连接、端到端和可靠的。通俗讲,这种方式的通信,需要先建立连接线路 (虚拟) 后,才能发送数据。正因此,它是可靠的。就像电话一样,通话前需要先拨通电话,然后才能说话。听不清可以让对方再说一遍。适合于可靠性要求比较高,大数据量传输等情况。

UDP 是面向非连接的,不可靠的。就如同 QQ 留言一样,发送消息时,对方不需要在线。所以你也不知道对方是否接收到了消息,何时收到消息。即使数据丢失,彼此也是不知道的。但是就是因为不需要建立连接,省去很多麻烦的操作,所以它有便捷,效率高的特点。

根据以上的特点,我们的发送指令并要求可靠性多高,数据量也不高,所以我们本案例中选择 UDP 的通信方式。

案例代码实现

通信工具的封装

为了发送消息的方便,我们首先来封装发送消息的工具类和接收消息的工具类。

发送消息工具类 UDPClient.java:

package com.remote.util;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPClient {
    private static DatagramSocket socket;
    static {
        try {
            socket = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
  /**
   * 参数分别为:发送消息,对方的IP,端口号
  */
    public static void sendMsg(String msg,String host,int port) {
        if(msg==null || msg.length()==0) {
            return ;
        }
        byte[] buf = msg.getBytes();
        try {
            DatagramPacket packet = 
              new DatagramPacket(buf, buf.length,InetAddress.getByName(host),port);
            socket.send(packet);
        } catch (Exception e) {
        }
    }
    //重载一个默认方法
    public static void sendMsg(String msg,String host) {
        //默认发送8888约定端口
        sendMsg(msg, host,8888);
    }
}

接收消息工具类:UDPServer.java

package com.remote.util;

import java.io.IOException;
import java.net.DatagramPacket;
i
                        
作者正在撰写中...
隐藏内容 支付可见
内容互动
写评论
加载更多
评论文章
¥9.88 购买
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容