• 575.50 KB
  • 2022-04-22 11:36:29 发布

计算机远程控制软件的设计与开发毕业论文.doc

  • 53页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'xx学院本科生毕业论文计算机远程控制软件的设计与开发ComputerRemote?ControlSoftwareDesignandDevelopment院系计算机科学与工程学院专业计算机科学与技术学生班级xx级xx班姓名xx学号xx指导教师单位计算机科学与工程学院指导教师姓名xxx指导教师职称讲师 计算机远程控制软件的设计与开发计算机科学与技术2009级00班xxx指导教师xxx摘要随着网络技术的飞速发展,远程控制协助软件越来越受到人们的重视。计算机远程控制技术是计算机系统管理人员在异地通过计算机网络连接目标计算机,由本地计算机对远程计算机进行管理和维护的行为。基于JAVA与Socket编程技术结合的C/S远程监控系统软件突破了空间的限制,使用者不用亲自到目标地点,直接通过网络就能实现对被控机器的监控,并且有着友好的操作界面。本系统采用Java网络编程和Java图形编程实现。本系统在开发过程中,将计算机网络技术与远程控制理论基础相结合。本远程控制软件包括远程资源管理器、远程监控、远程CMD控制台三大模块,实现了对被控机磁盘文件的上传、下载、删除,实现对鼠标、键盘的模拟以及屏幕截取,实现了远程执行DOS命令,实现了远程关机。本系统从设计最初到具体实现、优化、测试都严格遵循软件工程的思想。关键词:Java;Socket;C/S;远程控制;屏幕截取;DOS命令。 ComputerRemoteControlSoftwareDesignandDevelopmentComputerScienceandTechnologyxxx-xxxxxxSupervisorxxxAbstractWiththerapiddevelopmentofnetworktechnology,theremotecontroltoassistsoftwarebymoreandmorepeople"sattention.Computerremotecontroltechnologyisacomputersystemmanagementpersonnelindifferentthroughthecomputernetworkconnectiontargetcomputer,thelocalcomputertotheremotecomputermanagementandmaintenanceofbehavior.BasedonJAVAandSocketprogrammingtechnologyincombinationwithC/Sremotemonitoringsystemsoftwarebrokethroughthelimitationofspace,usersneednotpersonallytothetargetlocation,directlythroughthenetworkcanachieveforthecontrolledmachinemonitoring,andhaveafriendlyoperationinterface.ThissystemusesJavanetworkprogrammingandJavagraphicalprogrammingrealization.Thissysteminthedevelopmentprocess,thecomputernetworktechnologyandremotecontroltheoryfoundationcombined.Theremotecontrolsoftwareincludingremoteresourcemanager,remotemonitoring,remoteCMDconsolethreemodules,realizetheaccusedofmachinediskfileupload,download,delete,realizethesimulationofthemouse,keyboardandscreencapture,realizedtheremoteimplementDOScommand,realizedtheremoteshutdown.Thissystemfromdesigntoimplementationfirst,optimizationandtestingarestrictlyfollowtheconceptofsoftwareengineering.Keywords:Java;Socket;C/S;Remotecontrol;Screencapture;DOScommand. 目录1引言111.1远程控制软件的研究现状和前景221.2课题研究的目的和意义321.3课题研究的主要内容332系统分析332.1系统功能分析332.2系统软件模型432.3系统的开发平台442.3.1Eclipse介绍442.3.2Java语言443主要技术支持553.1Socket553.2Socket分类773.3基本套接字函数调用883.3.1创建套接字993.3.2建立套接字连接993.3.3数据传输993.3.4关闭套接字11113.4C/S结构特点及发展11113.5TCP/IP体系结构12123.5.1网络层12123.5.2互联层12123.5.3传输层13133.5.4应用层 13133.6多线程13133.7Java远程控制的基本原理14144C/S模式远程控制系统的设计实现1616 4.1主要实现功能16164.2Client(监控端)设计16164.2.1文件操作client.files17174.2.2远程控制台client.cmd21214.2.3远程监控client.view23234.2.4关机26254.2.5退出26264.2.6帮助26264.3Server(被控端)设计27264.3.1文件操作(server.files)27274.3.2CMD控制台(server.cmd)32324.3.3远程监控实现(server.view)33334.4软件测试与分析33334.4.1软件测试的重要性33334.4.2测试实例的研究与选择34344.4.3测试环境与测试条件35354.4.4系统部分模块测试情况35355总结与展望3636致谢3736参考文献3837 xxx学院本科生毕业论文(设计)1引言现如今,随着网络的快速发展,越来越多的企业都建立了自己的内部网络。面对众多的部门联网计算机,对于人数相对偏少的网络管理员来说,如果每台计算机都需要亲临维护既浪费时间,工作效率也极低,因此他们希望对整个网络上的计算机能实现远程控制操作;也希望能实现远程传输文件操作;同时还能查看实时的计算机运行状态和进行一些相关操作;希望能够传输文件;希望能够防止病毒的蔓延、非法程序的拷贝、杜绝某些用户的越权或非法操作等。因此,对于一个网络管理员来说,一个合适的远程协控制软件是至关重要的。我们熟知的远程控制技术,最早始于DOS时代,当时并没有现在的条件与技术,而且也网络不发达,市场没有更高的要求,所以远程控制技术没有引起许多人的注意。但如今,随着网络的飞速发展,随着人们对电脑的管理及技术支持的需要的不断提高,远程操作及控制技术越来越引起人们的关注。远程控制一般支持下以下网络类型:LAN、WAN、拨号方式、互联网方式。除此之外,实现远程控制的方式还有通过串口、并口、红外端口等通信方式。对于传统的远程控制软件,一般使用NETBEUI、NETBIOS、IPX/SPX、TCP/IP等协议来实现远程控制。随着网络技术的发展,越来越多的远程控制软件提供通过C/S模式以Java语言来开远程控制软件。对于现如今流行的远程控制软件,一般分两个部分:客户端Client,和服务器端Server。实用方法是,先将客户端安装到主控计算机上,将服务端程序安装在被控制电脑上,然后在主控端电脑上执行Client端程序,并且向被控端电脑中的Server端程序发出信号,建立基于TCP协议的远程服务连接,然后通过这个远程服务,使用各种远程控制功能发送远程控制命令,Server端响应接收到的命令并执行相应的操作,我们称这种远程控制方式为基于远程服务连接的远程控制。通过远程控制软件,我们可以进行很多方面的远程控制,包括截取目标电脑屏幕图像、窗口以及进程目录;记录并提取远端键盘事件;可以打开、关闭目标电脑的任意目录并实现资源共享;管理远端电脑的文件和文件夹;关闭或者重新启动远端电脑中的操作系统等。47 xxx学院本科生毕业论文(设计)上面主要表述的一般是一对一的基于远程服务的远程控制实现原理,其实,如今最实用的远程控制软件最理想的模式应该是一对多,即一台控制机可以控制多台电脑。这对于如今的意义就好像一个大型的企业,如果控制端能够直接控制全部电脑,即显示全部电脑目录,再进行一些列的操作,如远程桌面协助,远程资源管理器,都将带来极大的方便。一般的远程控制程序的优点在于,方便技术人员进行远程维护或协助,技术人员再也不用亲临到实地操作,只需通过互联网,就可以方便的进行诸如应用程序的上传,部署,或是对远程故障机的协助操作等等,极大的节省了人力物力,大大的提高了工作效率。当然,凡是有利必有弊,随着互联网的普及,远程控制技术也是如今黑客恶意攻击的主要手段,诸如一些木马控制程序等,不仅侵犯了他人的隐私,也严重的违反了国家法律。但是远程控制技术对于人类日常生活也是很重要的,如何利用好这门技术造福人类,这也是我研究这门课题的意义。本软件就是基于此而设计开发的,能实现以下的基本的远程功能:(1)查看被控制端的文件目录清单,即远程资源管理器;(2)拷贝被控制端的文件到控制端,同时也能上传文件到被控端,或删除被控端文件;(3)强迫被控制端重新启动或关机;(4)直接执行任何可执行命令,打开应用程序;(5)控制被控制端的屏幕,在本地直接操作被控制端计算机;而且做了一些必要的安全性考虑。1.1远程控制软件的研究现状和前景在飞速发展的今天,包括涵盖远程办公、远程教育、远程维护、远程协助以及企业管理等都属于远程控制涉及的应用领域。随着应用领域的越来越广泛,使用的价值也不断提高,市场需求也越来越明显。目前比较出名的远程控制软件例如PeerYou,VCN,Oray等都具有高效的信息交互和传输能力,以及实现跨平台的高效远程控制。C/S模式远程控制软件充分利用网络资源,以普通PC机为控制设备,通过面向对象以及模块化的程序设计,有着低成本、高实用性、可靠性和可扩展性的优点。综合以上原因,我决定通过一定的理论知识与实践来尝试学习此类知识,并且使用Java编程语言结合C/S模式实现一款远程控制软件。47 xxx学院本科生毕业论文(设计)1.2课题研究的目的和意义通过学习远程控制软件的相关技术知识来更深刻的理解TCP/IP协议以及Socket编程原理;通过实现代码的编写来达到对Java语言编程能力的锻炼以及增加对程序代码优化的经验。1.3课题研究的主要内容基于Windows的远程控制软件开发毕业设计的主要任务是要求做出从系统角度出发的基于C/S开发模式与远程控制技术的实用软件。使用Socket网络编程技术及Java程序开发语言。实现基本的远程控制要求,界面简洁友好。采用面向对象开发技术,严格遵循软件工程设计思想。要求:(1)基于C/S模式架构;(2)实现截屏、执行远程CMD命令,远程关机等功能;(3)软件安全、稳定、可靠;(4)至少能在两台计算机之间进行控制演示;(5)界面简洁友好。2系统分析2.1系统功能分析本远程控制软件由Server(服务器)和Client(客户端)两部分组成,并且需要使用者在服务端与客户端同时运行相应程序来实现,具体步奏如下:第一步,服务器端运行相应程序,使服务器端口处于监听状态,这里本远程控制软件使用了三个端口(30018,30011,30012);启动服务器后,被控端计算机则处于等待连接状态。第二步,运行客户端程序,输入被控端IP,服务端准备响应,然后程序自动连接到指定IP的远程计算机。到目前为止,整个连接步奏则完成,这个程序之间已经建立了基于TCP协议的远程服务连接,进入使用界面后便可进行相应操作。47 xxx学院本科生毕业论文(设计)2.2系统软件模型本系统采用C/S程序开发模式设计,由Server端(服务端)与Client端(客户端)两部分组成,下面是结构图:图2.1程序结构图Fig.2.1Thechartofprogramstructure对客户端的设计,一直遵循面向对象的设计思想,坚持界面友好,易操作;对于服务端的设计则偏于简洁实用,启动后显示界面位于屏幕的右下角,只进行操作的反馈,详尽的设计过程将在接下来介绍。2.3系统的开发平台2.3.1Eclipse介绍本软件实用的主要开发工具之一Eclipse是一个开放源代码的、基于Java的可扩展开发平台。它本身就是使用Java语言开发的,其本身就包含了括Java开发工具(JavaDevelopmentKit,JDK),使用Eclipse进行Java程序开发不仅方便管理,而且也能大大提高开发效率。2.3.2Java语言早期的Java是使用在家用电器等小型系统的编程语言,被称为Oak。用来解决家用电器的控制和通讯问题,如电视机、电话、闹钟、烤面包机等。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak将要失败的时候,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是现在广为流传使用的Java诞生了。47 xxx学院本科生毕业论文(设计)  Java编程语言的风格非常接近C、C++。Java是一个完全面向对象的程序设计语言,它继承了C++语言面向对象技术的同时舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operatoroverloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在JavaSE1.5版本中,Java又引入了泛型编程(GenericProgramming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。  Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的执行速度有了大幅提升。  与传统程序不同,Sun公司在推出Java之际就将其作为一种开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。  Sun公司对Java编程语言的解释是:Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。  Java平台是基于Java语言的平台。这样的平台目前非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。3主要技术支持C/S是当今比较流行与具有发展潜力的技术之一。使用C/S模式设计的客户、服务器应用系统具有系统结构优化、资源利用率高、整体运算速度快的优点,因而得到了广泛的应用。Socket网络编程技术也是当今主要的进程之间的通信方式,它利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。基于C/S模式于Socket网络编程技术,本远程控制程序才能得以实现。3.1Socket47 xxx学院本科生毕业论文(设计)20世纪80年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大学Berkeley分校提供资金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中,研究人员为TCP/IP网络通信开发了一个应用程序接口(API)。这个API就称为Socket接口。今天,Socket接口是TCP/IP网络最通用的API,也是在Internet上进行应用开发最为通用的API。事实上,Socket(套接字)就是在计算机之间提供了一个通信端口。通过这个端口,一台计算机可以与任何具备套接字的网间计算机进行通信。一个Socke只通信的一端,在这一端上可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程,Socket存在于整个通信域中,与对应的并且在相同域的Socket进行数据交换,即通信。应用程序在网络上传输,接收的信息都通过这个套接口来实现。在应用开发种就像使用文件句柄一样,可以对Socket句柄进行读写操作。开始使用套接字编程之前,首先必须了解什么是网间进程通讯,什么是服务方式,以及C/S软件开发模式。进程间通信的最初概念来源于单机系统。由于每个进程都在自己的地址区域范围内运行,为了保证进程间能相互通信而又不干涉他们自己的工作,操作系统被要求提供相应的设施,如UNIXBSD中的管道(Pipe)、命名管道(NamedPipe)和软中断信号(Signal)、UNIXSystemV的消息(Message)、共享存储区(SharedMemory)和信号量(Semaphore)等,但都仅限于用在本机进程之间的通信。网间域中的计算机要通信必须解决不同计算机中进程相互通讯的问题。为此,首先要解决的是网间进程标识问题,同一计算机上,不同进程可以用进程号(ProcessID)作为唯一标识,但到了网络环境下,不同的计算机中很可能存在拥有相同进程号的进程,比如A计算机存在进程号为101,B计算机也很可能存在进程号名为101的进程。其次,用于网络通讯的协议众多,不同的协议也有自己独有的辨识方式,因此,要实现网间域内计算机通讯还要解决众多协议识别的问题。在网络的分层模型中,各层严格遵循着单向依赖,各层之间分工明确,但又相互协作,他们之间的协作主要体现在各相邻层边缘的应用上。“服务”是描述相邻层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务的提供者,上层是请求服务的用户。服务的表现形式是原语(Primitive),如系统调用或库函数等。系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。在国际标准化组织(ISO)的术语中,网络层及其以下各层又称为通信子网,只是实现了点对点之间的通信,没有程序或进程的概念。而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制、流量控制、数据排序(报文排序)及连接管理等问题。为此提供不同的服务方式:面向连接(虚电路)的服务或无连接的服务。47 xxx学院本科生毕业论文(设计)面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立、连接、数据传输及终止连接的过程。在数据传输过程中,各数据分组不携带目的地址,而使用连接号(ConnectID)。本质上,连接是一个通信管道,收发数据顺序一直,内容相同。其中TCP协议就提供面向连接的可靠通信协议。无连接的服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。提供无连接的数据报服务的常用协议是UDP协议。在TCP/IP网络应用中,两个进程之间的相互通信主要基于C/S模式(Client/Server)。即客户端向服务端发出请求,服务端接收待来自客户端的请求好,调用相应的服务。C/S模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器式的TCP/IP。3.2Socket分类TCP/IP的Socket提供下列三种类型套接字。(1)原始套接字该接口允许对较低层协议,如IP,ICMP的直接访问。它通常用于检验新的协议实现或访问现有服务配置中的新设备(2)TCP流式套接字如果我们需要一个可靠的连接,用来使数据按顺序、无错的发送到目标端,就需要流式套接字。流式套接字提供一种可靠的面向连接地传输方法。数据无重复、无差错,并且按发送端发出数据的顺序进行接收。不管对单个的数据报或者是一整个数据包,流式套接字都提供一种协议的历史传输——TCP。除此之外,在数据进行传输时,如果一端的连接断开,则另一端的应用程序会接到通知。流式套接字内设流量控制,避免数据流超限;数据被看成字节流,无长度限制。(3)UDP数据报套接字数据报套接字是提供一种非连接、不可靠的通信方式。在这里的“不可靠”47 xxx学院本科生毕业论文(设计)是指发送的数据不能得到保障,也不保障数据按原来发出时的顺序到达目标端。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且顺序混乱。事实上,一份数据可能不止一次被发送。对于基于Java的Socket网络编程的TCP/IP实现,数据报套接字使用用户数据报协议(UDP)。虽然在通常情况下,在同一台计算机上的两个进程或在轻负载的局域网所连接的两台计算机的进程之间进行通信时,可能不会出现数据包丢失或没按照顺序到达及又重复发送的情况,但在编写实用UDP协议进行进程间通信的程序是,应考虑到这些情况,并且能做出应对措施。当然,如果为非常复杂的网络(如Internet)编写通信应用程序,就应该考虑到数据报套接字的不可靠性。如果应用程序不能很好的处理这些问题,很可能导致程序崩溃。尽管如此,数据报套接字在发送数据包或者记录形数据时仍然有用。另外,数据报套接字还提供向多个目的地发送广播数据包的能力。3.3基本套接字函数调用大多数的数据报套接字应用程序都使用一个规定的事件序列来完成客户应用程序与服务器之间的通信,如下图所示:图3.1信息交互Fig.3.1Informationinteraction首先服务端与客户端都要创建一个Socket(套接字),然后服务端ServerSocket绑定端口和IP,这样客户端就能使用同一端口表示服务器套接字,然后服务器与客户端建立通信,即Sendto()和Recvfrom()信息交互。下面步奏介绍了套接字使用的步奏。47 xxx学院本科生毕业论文(设计)3.3.1创建套接字Java对Socket操作进行了很好的封装,即java.net.ServerSocket类,此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于请求执行某些操作,然后可能向请求者返回结果。在这里我们使用到的构造方法为ServerSocket(intport);该构造方法创建以本机IP为IP地址,以port为端口的套接字,参数port-端口号;或者为0,表示使用任何空闲端口。3.3.2建立套接字连接等待连接我们使用了java.net.ServerSocket类的accept()方法,该方法侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。一旦接受到请求,则创建新的套接字与之连接交互信息。3.3.3数据传输有了套接字连接后,我们就可以进行任意的数据传输了。在自定义了Sendto()与Recvfrom()方法后则可进行任意数据传输。Java对传输流进行了很好的封装,这里我们主要用到java.io以及javax.imageio里面的流操作类:(1)javax.imageio.ImageIO类该类包含一些用来查找ImageReader和ImageWriter以及执行简单编码和解码的静态便捷方法。主要用于远程图像的传输。read(URLinput)方法:返回一个BufferedImage,作为使用ImageReader(它是从当前已注册ImageReader中自动选择的)解码所提供URL的结果。InputStream是从URL中获得的,它被封装在ImageInputStream中。write(RenderedImageim,StringformatName,ImageOutputStreamoutput)方法:使用支持给定格式的任意ImageWriter将一个图像写入ImageOutputStream。从当前流指针开始将图像写入ImageOutputStream,并覆盖该点之后的现有流数据(如果有)。此方法在写入操作完成后不会关闭提供的ImageOutputStream;一个严谨的程序,应该在实用完后对流进行关闭,减轻系统负担。(2)java.io.InputStream类47 xxx学院本科生毕业论文(设计)read()方法:从输入流中读取数据的下一个字节。返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。(3)java.io.OutputStream类write(intb)方法:将一个integer(数组长度)写入此流。(4)java.io.File类主要用于文件或目录的操作。File(Stringpathname)方法:通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。如果给定字符串是空字符串,那么结果是空抽象路径名。delete()方法:删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。exists()方法:测试此抽象路径名表示的文件或目录是否存在。isDirectory()方法:测试此抽象路径名表示的文件是否是一个目录。isFile()方法:测试此抽象路径名表示的文件是否是一个标准文件。list()方法:返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。mkdirs()方法:创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。listRoots()方法:列出可用的文件系统根。(5)java.lang.Runtime类exec(Stringcommand)方法:在单独的进程中执行指定的字符串命令。参数command:一条指定的系统命令。(6)java.awt.Robot类使用该类提供的一系列方法可以模拟鼠标、键盘操作事件以及屏幕截图,达到远程监控的目的。createScreenCapture(RectanglescreenRect)方法:创建包含从屏幕中读取的像素的图像。该图像不包括鼠标光标。mouseMove(intx,inty)方法:将鼠标指针移动到给定屏幕坐标。mouseWheel(intwheelAmt)方法:在配有滚轮的鼠标上旋转滚轮。keyPress(intkeycode)方法:按下给定的键。应该使用keyRelease方法释放该键。keyRelease(intkeycode)方法:释放给定的键。47 xxx学院本科生毕业论文(设计)mousePress(intbuttons)方法:按下一个或多个鼠标按钮。应该使用mouseRelease方法释放鼠标按钮。mouseRelease(intbuttons)方法:释放一个或多个鼠标按钮。以上为数据交互使用到的Java类,Java很好的封装了这些操作,使得程序的设计简单又结构性强,更好的体现了Java的面向对象特性。3.3.4关闭套接字在数据交互完成后,都要改关闭不在使用的Socket,本远程控制软件使用了close()方法关闭此套接字。所有当前阻塞于此套接字上的I/O操作中的线程都将抛出SocketException。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。关闭此套接字也将会关闭该套接字的InputStream和OutputStream。如果此套接字有一个与之关联的通道,则关闭该通道。3.4C/S结构特点及发展 C/S又称Client/Server或客户/服务器模式。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;但两种应用都有着自己的优势,怎么使用取舍取决于对业务的需求。传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高,效率低。但是Java的平台无关性可以很好的解决这个问题,实用Java开发的应用程序,不管在什么样的操作系统中都能得到很好的支持。用C/S模式设计本系统的优势在于:(1)47 xxx学院本科生毕业论文(设计)应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和服务器程序。二者可分别称为客户端与服务端。运行服务端的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应服务器,可称为客户电脑,当需要对远程控制端进行操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。(2)服务端对于业务逻辑进行和很好的封装。对于客户端传来的请求,服务端进行很好的处理,这里我们把处理响应的业务逻辑都封装在服务端里,使得客户端显得非常“瘦小”,是软件实用更加灵活。除此之外,C/S模式设计的软件能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。3.5TCP/IP体系结构TCP/IP这个协议遵守一个四层的模型概念:应用层、传输层、网络互联层和网络层 3.5.1网络层TCP/IP模型的基层是网络接口层。负责数据帧的发送和接收,帧是独立的网络信息传输单元。网络接口层将帧放在网上,或从网上把帧取下来。 实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层—网络互连层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。 3.5.2互联层网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。   网络互连层定义了分组格式和协议,即IP协议(InternetProtocol)。   网络互连层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,网络互连层还需要完成拥塞控制的功能。 互联协议将数据包封装成internet数据报,并运行必要的路由算法。 这里有四个互联协议: (1)网际协议IP:负责在主机和网络之间寻址和路由数据包。 47 xxx学院本科生毕业论文(设计)(2)地址解析协议ARP:获得同一物理网络中的硬件主机地址。 (3)网际控制消息协议ICMP:发送消息,并报告有关数据包的传送错误。 (4)互联组管理协议IGMP:被IP主机拿来向本地多路广播路由器报告主机组成员。 3.5.3传输层传输协议在计算机之间提供通信会话。传输协议的选择根据数据传输方式而定。 两个传输协议: (1)传输控制协议TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。 (2)用户数据报协议UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输小量数据,可靠性则由应用层来负责。 3.5.4应用层 TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。    应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(FileTransferProtocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(HyperTextTransferProtocol,HTTP),也有基于UDP协议的。 3.6多线程在一个应用程序中,一些独立运行的程序片断被称作“线程”(Thread),利用它编程的概念就叫作“多线程技术”。多线程技术一个常见的例子就是用户界面。利用线程当用户按下按钮后,方法与主界面流程可以一起往下执行,而不是等待方法执行后才继续往下。在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够同步的处理工作,即工作能同时进行,而不是等待一个方法执行完后再接着执行主进程。对于不同的需求,可以通过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”47 xxx学院本科生毕业论文(设计),主进程的暂停是通过硬件级的中断来实现的。尽管这个方法很有用,但这样的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。  最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器来处理,真正进入“并行运算”状态。从程序设计语言的角度看,多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。如果仅局限于如上的操作,那多线程就太简单了。其实不然,实用多线程必须解决一个重要的问题:资源共享。如果有多个线程同时运行,而且它们都需要使用到这个资源,就会遇到资源共享的问题。例如两个进程不能同时调用同一台打印机打印,必须等一个进程结束运行后另一个进程在进行调用。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源,这就是所谓的进程同步问题。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。使用多线程的好处:(1)使用线程可以把占据长时间的程序中的任务放到后台去处理,用户界面可以更加吸引人,比如,我在单击了远程控制后,任然能进行资源管理器操作,而不是等远程操作结束后才能进行资源管理器操作。(2)程序的运行速度可能加快。因为是“同步执行”的,不需要等待,所以可以加快程序的运行速度。(3)在一些需要阻塞等待操作的程序中,线程是很实用的,如数据传输,等待连接,等待输入等,并不一定要上述方法都执行,主进程才能继续执行,这样带来的方便是非常大的。3.7Java远程控制的基本原理(1)Socket、ServerSocketSocket47 xxx学院本科生毕业论文(设计)位于java.net.包中,这是一个对于网络通信来说及其重要的类,无论是那种语言,都会有Socket网络编程的应用方法,存在的差异也仅仅是在表示和组织上有所不同,Socket中文称它为套接字,JavaAPI中可以查看相应的介绍,主要由ServerSocket和Socket之间建立连接。一个ServerSocket构造一对通信套接字方法如下:  ServerSocketsr=newServerSocket(port);  Socketsc=newSocket("ip",port);其中ServerSocket的accpet()方法十分重要,当一个服务套接字建立之后它会一直阻塞等待一个套接字的请求,直到建立连接。部分计算机网络的书籍对套接字有这样的定义为端口+IP地址;一个套接字是由一个由一个IP地址和一个端口组成的,在网络通信中的底层实现也的确如此,要建立进程之间的通信就必须使用一个未被占用的端口进行等待连接,在连接端口之后才能在该端口上通信,以实现进程间的通信。(2)InputStream、OutputStream 当一个套接字连接成功后就可以获得基于这个套接字的输入、输出流,一切数据的发送和接受都离不开输出、输入流,我们可以通过流封装的方法选择你要输入或者输出的数据类型,通过转换流可以把输入、输出流转换到我们需要的数据传输类型。(3)认识RPCRPC是英文远程方法调用的缩写,见名知意,就是在本地计算机上调用远程计算机上的方法或者过程。既然我们已经能通过Socket进行网间进程通讯,进行数据传输,那么,往更深一层去想,如果是传输命令让计算机做出响应呢?因此,实现这一假设的过程,即为远程控制软件设计的基础思想。在这里Java提供了一个非常好的命令响应的封装类——RunTime类,该类提供方法执行诸如CMD控制命令。   Runtimeec=Runtime.getRuntime();  ec.exec("命令");Exec()方法就可以放入你想要运行的命令这样你就可以在机器上运行你的指令了。那么到目前为止,一个基于Java语言开发的远程控制程序的雏形就展现在我们面前了,试想,如果我们能远程调用CMD命令已经相当于无所不能了。以上就是一个简易的Java远程控制的实现,当然本系统的设计要比此步奏复杂许多,但是基本原理相同。47 xxx学院本科生毕业论文(设计)4C/S模式远程控制系统的设计实现4.1主要实现功能(1)查看被控制端的文件目录清单;(2)下载、上传、删除文件;(3)强迫被控制端重新启动或关机;(4)直接执行任何可执行命令,打开应用程序;(5)控制被控制端的屏幕,在本地直接操作被控制端计算机;4.2Client(监控端)设计Client的界面设计使用的是Java提供的GUI,具体界面如下图图4.1客户端Fig.4.1Client47 xxx学院本科生毕业论文(设计)主要包括登录、远程资源管理器、远程控制监视、远程控制台、远程关机、退出以及帮助。主要用于发送相应命令以及处理相应返回信息,具体流程如下图所示:图4.2客户端流程Fig.4.2Theclientprocesses4.2.1文件操作client.files文件操作包含客户端的上传文件(SendFile)、下载文件(DownFile),文件一般操作(FileControl)以及初始化被控端磁盘(getIniDrivers)。(1)初始化被控端磁盘(getIniDrivers)作为资源管理器第一个步骤,首先要初始化磁盘,既获得被控端磁盘驱动情况,具体体现在操作界面右侧的磁盘目录树上,主要实现方法为程序启动之初,接受由Server端发来的磁盘信息,然后解析为磁盘字符数组,再体现到操作界面上。该类主要在初始化的时候调用。47 xxx学院本科生毕业论文(设计)主要用到publicString[]getDrivers()方法,该方法接收来自服务器的数据,并转换为字符串数组。然后初始化磁盘数到显示界面,代码如下:for(inti=0;i=3){files[i][0]=temp[0];files[i][1]=temp[1];files[i][2]=temp[2];}else{Stringt=m.info.getText();m.info.setText(t+"n文件信息:port("+port+")文件读出失败!");}}returnfiles;47 xxx学院本科生毕业论文(设计)}}该部分代码完成的功能是获取字符串,并根据分好分割成字符数组,每一个字符数组单元再更具逗号再分成二维字符串数组,最后返回这个二维字符数组files,由前台显示出目录。publicbooleandeleteFile(Stringopera)方法根据地址删除服务端相应文件,部分代码如下:OutputStreamos;os=socket.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF(opera);dos.flush();完成功能为将调用该方法的传入的地址参数发送到服务端,服务端完成删除并反馈publicbooleanupFile(Stringopera,Stringupload)方法为上传方法,参数Opera为上传目录地址,upload为客户端上传文件地址,部分代码如下:try{if(opera==null||opera==""){socket.close();returnfalse;}OutputStreamos;os=socket.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF(opera);dos.flush();}catch(IOExceptione1){e1.printStackTrace();}newSendFile(socket,upload,this.m).start();其中最为重要的是最后一行newSendFile(socket,upload,47 xxx学院本科生毕业论文(设计)this.m).start(),启用了一个新的线程进行传输。publicbooleandownFile(Stringopera,Stringdownload)方法为下载服务端文件,其中参数opera为下载文件地址,download为保存到本机地址,部分代码如下:try{if(opera==null||opera==""){socket.close();returnfalse;}OutputStreamos;os=socket.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF(opera);dos.flush();}catch(IOExceptione1){e1.printStackTrace();}newDownFile(socket,download,this.m).start();最后一行newDownFile(socket,download,this.m).start();启用了一个新的线程下载文件。4.2.2远程控制台client.cmd主要包括2部分:产生一个新的CMD控制台窗口,包括命令行输入,帮助,命令行显示,单击和回车时间监听;发送命令到服务器,接受服务器返回的处理结果,并显示在窗口中。47 xxx学院本科生毕业论文(设计)(1)窗体:图4.4CMD操作Fig.4.4CMDoperation(2)命令的发送与接收命令的发送方法为publicbooleancmdOpera(Stringopera),该方法实现了命令的传入,即参数opera,命令的发送与返回值接收处理并反馈到前台。部分代码如下:OutputStreamos;os=socket.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF("cmd;"+opera);dos.flush();该部分为命令的发送,返回结果的接收为:47 xxx学院本科生毕业论文(设计)InputStreamis=socket.getInputStream();DataInputStreamdis=newDataInputStream(is);Stringinfo="";info=dis.readUTF();is.close();socket.close();if(info!=null&&info!=""){str.append("n<--返回信息-->n"+info);this.info.setText(str.toString());returntrue;}接收到的结果直接显示在嵌套TextArea控件上,方法为this.info.setText(str.toString());4.2.3远程监控client.view用于远程监控的主要操作,包括远程图像接收(RecivImg)、发送事件信息(SendOperate)以及主要显示窗体(CWindow)(1)图像接收通过接收服务端发来的经过压缩的流,并解压为图像流,最终显示到窗体中。为了传输更为稳定,我们采用了压缩流,这里体现在客户端的为解压。部分代码为:socket=newSocket(rec.getIp(),this.port);DataInputStreamdis=newDataInputStream(socket.getInputStream());ZipInputStreamzis=newZipInputStream(dis);Imageimage=null;try{zis.getNextEntry();//读取下一个ZIP文件条目并将流定位到该条目数据的开始处image=ImageIO.read(zis);//把ZIP流转换为图片ImageIconimg=newImageIcon(image);47 xxx学院本科生毕业论文(设计)if(img!=null){rec.jlabel.setIcon(newImageIcon(image));rec.scroll.setViewportView(rec.jlabel);rec.validate();}}catch(IOExceptionioe){System.out.print("1");}用到的是Java提供的Zip流进行压缩,显示用到的是JLable控件,即把接收到的图片设置为JLable的背景,实现方法为rec.jlabel.setIcon(newImageIcon(image));最重要的是图像传输用到的是ImageIO流。为了使图像连贯,我们设置接收图片的间隔为50毫秒,具体方法为rec.jlabel.setIcon(newImageIcon(image))。(2)发送事件信息主要是封装了信息发送的方法,具体事件在窗体单击等事件发生时候才进行非法调用。部分代码如下:Socketsocket=newSocket(this.ip,this.port);OutputStreamos=socket.getOutputStream();os.write((this.operateStr).getBytes());os.flush();socket.close();(3)窗体布局很简洁,只有一个JLable作为图像显示背景,原理为不断用接收来的新图像信息替换JLable原有的背景,达到动态视频监视的效果。主要实现的事件有鼠标下压、鼠标释放、鼠标拖拽、鼠标移动、键盘下压、键盘抬起等事件。当事件触发的时候边通过发送消息类的方法传递到远程被控端,由被控端方法响应操作达到远程控制的目的。鼠标下压事件监听代码:publicvoidmousePressed(MouseEvente){super.mousePressed(e);intx=(int)e.getX()+(int)CWindow.this.scroll.getHorizontalScrollBar().getValue();47 xxx学院本科生毕业论文(设计)inty=(int)e.getY()+(int)CWindow.this.scroll.getVerticalScrollBar().getValue();StringoperateStr="mousePressed,"+x+","+y+","+e.getModifiers();SendOperatesender=newSendOperate(CWindow.this.ip,(operateStr));newThread(sender).start();}主要发送的信息为operateStr,包含操作类型(mousePressed),鼠标坐标x,y,最后启用新的线程传输。鼠标释放方法与下压事件类似,不同的是传输字符串为操作类型(mouseReleased),鼠标坐标x,y;对于鼠标的操作还有mouseDragged(拖拽),mouseMoved(移动)。键盘监听事件:publicvoidkeyPressed(KeyEvente){super.keyPressed(e);StringoperateStr="keyPress,"+e.getKeyCode();SendOperatesender=newSendOperate(CWindow.this.ip,(operateStr));newThread(sender).start();}publicvoidkeyReleased(KeyEvente){super.keyReleased(e);StringoperateStr="keyReleas,"+e.getKeyCode();SendOperatesender=newSendOperate(CWindow.this.ip,(operateStr));newThread(sender).start();}实现键盘单击事件监听,传输的字符串为操作类型(keyReleas、keyPress),加键值,发送到服务端后由服务端解析处理。47 xxx学院本科生毕业论文(设计)4.2.4关机通过消息发送出ShutDown命令,由被控端CMD命令响应,并做出关机。部分代码如下:if(JOptionPane.showConfirmDialog(null,"您确定要关闭远程控制端计算机?","提醒",JOptionPane.YES_NO_OPTION)==0){si.sendOpera("cmd;Shutdown/s");}主要通过CMD命令ShutDown实现关机,传输操作的方法为sendOpera("cmd;Shutdown-s");4.2.5退出返回登录界面或关闭程序。部分代码为:if(JOptionPane.showConfirmDialog(null,"是否返回登录","提醒",JOptionPane.YES_NO_OPTION)==0){si.sendOpera("ini");Main.this.dispose();System.out.println("窗体关闭");System.gc();newLogin();}else{Main.this.dispose();System.out.println("窗体关闭");System.gc();}4.2.6帮助(1)CMD帮助列出常用的CMD命令。47 xxx学院本科生毕业论文(设计)(2)一般帮助列出软件相关信息。4.3Server(被控端)设计被控端程序是远程控制软件的主体。远程控制软件的具体业务逻辑都是在被控制端实现的,主控端只负责传送要执行的命令和显示返回的结果。而几乎所有的操作控制都时在被控端本地实现的。具体设计思想如下图:图4.5被控端流程Fig.4.5Serverprocesses4.3.1文件操作(server.files)(1)Dofile.java47 xxx学院本科生毕业论文(设计)文件操作基础类,包括deletefile(Stringdelpath,StringBuffersb):删除文件或文件夹;readfile(Stringfilepath):读取文件或文件目录;只需要被控端接收到文件或文件目录地址,调用方法即可。部分代码如下:if(!file.isDirectory()){file.delete();msg.append(temp.toString()+""+delpath+",删除成功!,");}elseif(file.isDirectory()){String[]filelist=file.list();msg.append(","+temp.toString()+"开始删除!,"+temp.toString()+delpath+",");temp.append("[scWhiteSpase]");for(inti=0;i