参考现有的远程控制软件,APP打开以后,首先会生成一个识别码和验证码,控制方通过这两个码进行远程控制。
设计思路:
Step1:APP启动,读取CPU或者硬盘序列号,作为本机识别码,发送请求至服务器。
Step2:服务器端接收到请求,获取识别码,去数据库查询这个识别码是否存在,如果存在,查找并返回数字识别码和验证码。如果不存在,按照3位随机+5位id的方式生成识别码和验证码,并返回。
Step3:用户点击刷新验证码,发送请求到服务器,服务器生成新的验证码并返回
Step4:考虑到客户端打开,可能长时间不会控制或者被控制,相当于长时间处于空闲状态,因此考虑使用每隔1秒活2秒向服务器发送心跳包的方式,来获取链接请求数据。
Step5:控制端输出被控端的识别码和验证码,点击控制,发送请求到服务器。
Step6:服务器接收到控制请求,使用识别码和验证码查询被控端信息,如果被控端在线(最后在线时间与当前时间间隔小于2秒),创建一个链接记录,记录控制端识别码,被控端识别码,控制开始时间等,并返回链接ip和端口信息,如果有多个socket端口,可以返回一个连接数最少的,这里目前只考虑一个socket端口一个ip。
其他情况返回被控端不在线,或者验证码不正确,直接返回错误信息。
Step7:控制器发起控制请求,返回数据,如果是成功,那么创建tcpclient,连接至接口返回的ip和端口号,等待被控端链接,发送本机识别码到服务器。
其他情况直接提示
Step8:发送心跳请求(step3),携带识别码,服务器接收到以后,更新最后在线时间,同时查询有没有链接请求,如果有链接记录,返回tcp链接的ip和端口信息,以及控制端识别码。
Step0:被控端在接到心跳返回数据,如果有链接请求,根据返回的信息,链接tcp服务器,首先发送本机识别码到服务器。同时开启线程,发送桌面截图数据,以及接收被控制数据。
Step10:服务器在接到链接请求后,首先读取tcpclient发送过来的识别码,以识别码作为key,存储到全局clientsMap里面。
Step11:当有clients发送数据,根据当前的识别码,查询链接记录,查询到以后,将数据转发到对方client。
Step12:当client断开与服务器的链接,将客户端从clients里面移除。
Step13:开启链接检查线程,每5秒执行一次,查询所有链接记录,如果控制端或者被控端没有在clientsMap里面,直接将这个链接记录删除,或者标记已经结束。