宿舍系统

发布时间 2023-06-21 00:06:09作者: 晚点喝雪碧

海南经贸职业技术学院

 

课程设计报告

( 2022--2023年度第2学期)

 

 

课程名称:     Java企业级应用开发

课程设计题目:基于Java SE架构的学生管理系统

院    系:      乌拉尔学院 

班    级:      计算机软件技术班 

学    号:       2141210118    

学生姓名: 郑奋(组长)、何邦通、何青奋

 

 

成    绩:                        

          

日期:2023年 6月


摘要

随着网络技术的发展,远程监控越来越多地应用在各种场合。虽然现在有很多远程监控软件,但是使用Java开发的远程监控系统并不多。基于Java的远程监控系统软件突破了空间的限制,使用者不用亲临,在自己的电脑面前就能轻松的实现对被监控端机器的监控。系统采用Java网络编程和Java图形编程实现了PC机的之间的远程监控;利用远程监控的技术,应时下流行的安卓移动终端的需要,以JAVA语言跨平台的技术便捷性,结合安卓系统开发技术,将监控功能移植到移动终端设备,实现了移动终端对PC机的远程监控,并且未来可向远程操控智能家居等设备发展。

本文介绍了远程监控的原理,论述了利用Java实现远程监控软件的程序设计方法和要点,并给出了各个要点的具体实现方法。实现远程控制系统的关键,在于建立服务端与客户端之间的数据通道,该通道可以通过基于Java的Socket来实现。利用Socket编程机制,不仅能用于客户机/服务器(Client/Server)的分布式计算模式,而且也能用于浏览器/服务器(Browser/Server)模式中的浏览器客户程序与服务器之间的通信。

屏幕图像的获取以及显示是该系统的又一核心,在本系统中,采用了图像压缩技术与解压缩技术减少了图像的数据量,并借助Java的数据流技术进一步减轻了图像传输过程中的压力,使得图像可以快速、准确地传输到客户端并显示,从而较好地实现了远程控制系统中的实时效果,为后续控制奠定了基础。

鼠标与键盘控制在远程监控系统中具有举足轻重的地位,用户操作远程服务器,主要是通过鼠标和键盘两大交互设备,在既成图像上进行操作,同时获取操作指令及相关信息并发送到服务器端;服务器端接收指令进行处理,并依据处理指令,借助Java类Robot来在服务器端执行,从而达到控制远程服务器的效果。在本系统中,客户端通过分别对负责显示图像的画布以及程序窗口添加鼠标和键盘对应事件来获取指令信息,数据流负责指令信息的传输和接收、读取,Robot类的对象负责对指令信息的执行,从而完成了远程控制系统的最终实现。

本系统从系统需求分析、概要设计、详细设计到具体的编码实现和后期的代码优化、功能测试都严格遵循了软件工程的思想。

 

关键词:远程监控;Java Robot;屏幕截取;Java Socket;多线程;


目录

第1章 绪论.......................................................................................................... 4

1.1 项目背景与需求..................................................................................... 4

1.2 目的和意义............................................................................................. 4

1.3 国内外发展现状..................................................................................... 4

1.4 主要内容................................................................................................. 4

第2章 系统相关的知识及技术选型介绍.......................................................... 5

2.1 Spring框架简介...................................................................................... 5

2.2 Spring Boot框架概述............................................................................. 6

2.3 持久层框架概述..................................................................................... 6

2.4 RESTful概述.......................................................................................... 6

第3章 系统技术架构和可行性分析.................................................................. 7

3.1系统架构.................................................................................................. 7

3.2 系统功能架构......................................................................................... 7

3.3 系统用例图和设计要求......................................................................... 7

3.4 系统开发环境......................................................................................... 7

第4章 系统的分析和设计.................................................................................. 8

4.1 概要设计................................................................................................. 8

4.1.1 系统功能结构.............................................................................. 8

4.1.2 系统业务流程图.......................................................................... 8

4.1.3 数据库模型分析(ER图)及设计........................................... 8

4.2 详细设计................................................................................................. 8

4.2.1 详细设计说明.............................................................................. 8

4.2.2模块(X)详细设计.................................................................... 8

4.2.3模块(Y)详细设计.................................................................... 8

第5章 系统实现.................................................................................................. 9

5.1 基于框架分层实现................................................................................. 9

5.1.1 表现层.......................................................................................... 9

5.1.2 业务逻辑层.................................................................................. 9

5.1.3 持久层.......................................................................................... 9

5.2 系统主要模块的功能实现..................................................................... 9

5.2.1 登录模块展示.............................................................................. 9

5.2.2 XX管理模块展示........................................................................ 9

5.2.3 异常管理模块展示...................................................................... 9

第6章 总结与展望............................................................................................ 10

鸣谢...................................................................................................................... 11

 

不要删除行尾的分节符,此行不会被打印


 

 

 

 

 

千万不要删除行尾的分节符,此行不会被打印。在目录上点右键“更新域”,然后“更新整个目录”。打印前,不要忘记把上面“Abstract”这一行后加一空行


第1章 绪论

1.1  项目背景与需求

随着Web 2.0时代的到来,人类的社会活动越来越智能化。远程监控可以帮助人们更加方便的操控智能设备。电脑中的远程监控技术,始于DOS时代,只不过由于当时的技术上没有什么的大的变化,网络不发达,市场没有更高的要求,所以远程监控技术没有引起更多人的注意。但是随着网络的高度发展,电脑的管理及技术支持的需要,远程监控技术越来越引起人们的关注。

今天,网络技术的不断发展为远程监控技术创造了良好的条件。许多企业正在把远程监控能力作为有效的技术支持工具。很多网络管理员都才用这类软件对局域网进行管理。随着时代的进步,越来越多的学校配备了电脑设备,此类软件也非常适合学校的局域网电脑管理。同时远程监控软件在计算机远程教学和培训中也发挥了很大作用。

伴随着IT产业的不断发展,移动终端设备越来越普及,并逐渐融入人们的日常生活中,个人计算机、平板电脑和智能手机便是其中不可分割的重要组成部分。日新月异的信息化高端科技极大地影响和改变了人们的生活方式。同时近年来标志着智能化时代来临的物联网的兴起, 使得如何能够随时随地方便地掌握已连接上互联网的设备的运行状态,如何能更加方便的监控和操纵自己的智能设备已成为了人们新的需求。

在人们的需求及这样的大背景下,我们的作品应运而生。

 

1.2 目的和意义

1.提供远程技术支持

我们知道,通常企业内部或者IT公司的客户技术支持部门都有技术支持业务,其任务是通过电话解答疑难而难题,努力减少支持人员到现场或者让用户把设备送到技术支持中心进行维护。这种技术支持方式尽管被普遍采用,但是效率不高并且大大增加了技术支持的成本。

通常,技术支持必须依赖技术人员与用户之间的口头交流来进行,这种交流既耗时间又容易出错。许多商业用户对计算机知之甚少,然后遇到问题时,他们必须向技术人员提供故障情况及相关操作。比如向无法看到计算机屏幕的技术人员描述问题的症状;按照技术人员的指示精确的描述按技术人员的提示精确的描述屏幕上的内容;在尝试解决问题时,技术人员可能指导用户执行一系列复杂的过程,而这些过程对用户来说或许完全不熟悉;如果用户不能正确的按要求操作,反而使问题恶化;有些修改,如修改Windows 注册表,不能或不该由最终用户进行,但若是维护人员图省事,口头指挥用户操作,很可能产生严重的后果。以上这些情形费时又费事,工作效率很低。此外,如果通过电话不能解决问题,那么在技术人员亲自到用户现场解决问题之前,计算机将一直不能使用。远程监控软件能使技术人员直接操作远程计算机,就像操作本地计算机一样,无需用户介入,技术人员就能得到该机器的问题的第一手材料,从而加快了问题的解决。实际上,使用远程控制工具的技术人员能够做到解答疑难问题,安装和配置软件,把软件修补程序下载到用户计算机上,配置应用程序和系统软件设置并可通过实际操作培训用户。

2. 为远程教学的快速发展助力

近年来,远程教学迅速发展,但目前以电视传播信息的方式进行远程教学则占多数。虽然有通过Internet传播教学信息的,但也仅限于浏览网页,通过发邮件和留言的方式向老师提问,通过论坛的方式进行讨论,从而学习知识。这些技术和方法的采用,大大地加强了远程教学的“真实”性,然而,现场教学的实时性并没有在远程教学中得到体现。在远程教学中需要大量使用计算机远程教学管理软件,通过这种软件,师生可进行实时的通信,交流信息,对话和传递文件。因此,远程监控软件在远程教学中是大有作为的。

3. 服务于企业内部管理

随着社会的发展,企业规模越来越大,大家都在同一个办公室的时代早就一去不复返了。员工不在一栋办公楼内,不在同一个城市,甚至不在一个国家里办公,这样的企业越来越多,他们所面临的问题就是如何在不同的地方共享共同的资源。特别是IT企业,企业管理人员知道他的员工在干什么,是否外泄了公司内部的程序源代码,这一直都是IT公司管理的一大难题。随着人们观念的更新,现在,很多企业开始使用监控系统,用摄像的方式来监控员工的行为。但是,这种监控系统对员工的敲键,发送邮件等细小的行为依然无能为力。远程监控软件却能轻松地管理这些细节问题,因此,远程监控软件在企业的内部管理上将发挥很大的作用。

随着社会、科技、经济的不断发展,远程监控技术的应用范围也在

不断拓展。小到个人的使用,大到整个行业的应用。

4. 推进远程监控移动化发展

随着信息化时代的到来,人们对于电子、电器等产品的依赖不再仅仅是它们可以便捷我们的生活,而对其智能化的要求也越来越高,远程控制也由原来的PC2PC控制向智能设备控制及智能设备操作等方面发展。想象一下,如果在烈日炎炎的下班途中,我们能够通过在手机等移动终端上轻轻一点,家中的空调便可以提前开启,让我们一进家门便能拥有凉爽的环境,这将是多么美好的一件事。虽然将人们的这种宿求完美实现并推广至千家万户还需要很长的时间,但足以看出人们对于移动终端的远程监控与操纵功能的需求,这也将是未来远程监控的重要发展方向。PC2PC的远程控制必然会随着技术的发展达到顶峰,如果不向移动终端扩展,其发展将会达到一个难以逾越的瓶颈,我们的作品在实现PC2PC远程监控的基础上,增加了移动终端对PC的控制,实现了跨平台的远程监控,对于远程控制便捷化、移动化的发展起到了推动作用。

 

1.3 国内外发展现状

Java作为一门历史悠久且极其重要的编程语言,在全球的应用开发领域占有重要的地位。在我二十年的开发经验中,我看到了Java语言的起起落落,以及它在国内外的发展变化。

在国外,Java已经成为了大型企业的首选开发语言,尤其是在金融、保险和零售等领域,由于这些领域需要处理大量的数据和复杂的业务流程,Java的稳定性和高效性为其赢得了口碑。此外,Java也是许多著名的开源项目如Apache Hadoop,Spring Framework,Elasticsearch等的开发语言,这进一步推动了Java语言的发展和普及。

 

在国内,Java的发展也非常迅速。随着中国经济的快速发展和数字化转型,Java被广泛应用于各种行业,如电商、支付、云计算等。许多中国的大型互联网公司,如阿里巴巴,腾讯,华为等,都在大规模使用Java进行开发。特别是阿里巴巴,他们不仅使用Java开发了众多的业务系统,还贡献了许多优秀的开源项目,如Dubbo,RocketMQ等,对Java在国内的推广做出了巨大贡献。

同时,Java语言本身也在不断的发展和进步。近几年,Java已经进行了多次重大更新,比如模块化的Java 9,支持函数式编程的Java 8,这些更新都大大提升了Java的功能性和灵活性。目前,Java 17作为一个长期支持版本(LTS)已经发布,它包含了许多新的特性和优化,我相信这将进一步推动Java的发展。

总的来说,无论在国内还是国外,Java都是一门非常重要的编程语言,它在各个领域都有广泛的应用。随着技术的不断发展和创新,Java仍然有很大的发展空间和潜力。

 

1.4 主要内容

在远程控制软件中,对于服务器和客户机进行的数据通信所使用的主要技术就是网络编程技术。

在 Java 中有两个最为基本的网络 TCP 套接字控件,一个是服务器端的,另一个是客户端的。将 ServerSocket 类设计成在等待客户建立连接之前不做任何事的“监听器”,而 Socket 类则为建立连向服务器套接字以及启动协议交换而设计。

1. ServerSocket 类

当用户需要建立一个网络服务器时,需要使用 ServerSocket 类来创建套接字。例如:

ServerSocket serversocket=new ServerSocket(2525);

创建套接字后,通过下面的语句通知程序无限期地等待,直到有客户连接到这个端口:

Socket incoming=serversocket.accept( )。

一旦某个用户通过在网上放松一个正确的请求连接到这个端口,将返回一个 Socket 对象,表示刚建立的连接。可以用这个 ServerSocket对象得到这个套接字的一个输入流读取器(reader)和一个输入流写入器。

总的来说,对于服务器,将不停地执行如下循环:

● 通过输入数据流得到来自客户的命令;

● 以某种方式取回这个信息;

● 通过输出数据流给客户发送信息。

2.Socket 类

Socket 对象的创建只是隐式地建立了客户和服务器的连接,没有显示地说明建立连接细节的方法或构造函数。

通过以上的简单介绍,可以理解如何使用ServerSocket 和 Socket 来建立一个服务器和客户程序。

 

 

第2章 系统技术选型介绍

 

2.1 Spring框架简介

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

Spring框架由七个定义明确的模块组成(图1.1)。

 

图2.1  Spring框架

 

 

2.2 Spring Boot框架概述

 

 

2.3 持久层框架概述

 

  

2.4 RESTful概述

 

第3章 系统技术架构和可行性分析

 

3.1系统架构

 

 

 

(图+说明)

 

 

3.2 系统功能架构

 

 

(图+说明)

 

 

 

3.3 系统用例图和设计要求

 

3.4 系统开发环境

硬件环境:

CPU: Itel Core2 Duo CPU T8100 @2.10GHz

内存: 2G

硬盘: 500GB

软件环境:

操作系统: Windows 7旗舰版

应用软件: MyEclipse 9.0 +JDK 1.6.0_13

 

第4章 系统的分析和设计

 

4.1 概要设计

4.1.1 系统功能结构

 TCP 面向连接

我们要实现的系统所使用的Socket套接字是基于TCP/IP的API。所以系统必须选择面向连接的通信方式。面向连接的网络通信首先在客户机和服务器之间定义一套通信协议,并创建 Socket 类,利用这个类来建立一条可靠的链接。然后,客户机/服务器再在这条链接上可靠地传输数据。从而,保证了客户端和服务端的连接所要求的可靠性、安全性。而 UDP 非面向连接的协议,各个数据相互独立,这种协议并不能保证数据包是否到达、到达时间、到达顺序。所以我们选择面向连接的TCP 协议,而不是无连接的 UDP 协议。

另外,UDP 协议的数据包最大长度是 64KB,屏幕图像的数据量要超过 64KB,所以我们选择 TCP 协议进行屏幕图像数据传输。

C/S模式

C/S(Client/Server,客户机/服务器)模式又称C/S结构,是20世纪80年代末逐步成长起来的一种模式,是软件系统体系结构的一种。客户向服务器主动发动服务请求,服务器做出响应,这就是C/S模式相互作用的基本过程。

C/S模式每次通信过程都有客户进程主动发起,而且是随机的,服务器进程先进入等待状态,随时准备对客户的请求做出及时的响应,因此客户和服务器,一个主动请求,一个被动响应,一个启动通    信,一个等待通信。

 

图4-1 C/S模式体系结构

 

4.1.2 系统业务流程图

体系结构设计

该远程监控系统由控制端与受控端两个部分组成。控制端要完成端口设置、屏幕接收解压和显示、鼠标命令的获取和发送、键盘命令的获取和发送、远程任务管理器、远程命令、发送警告信息、文件操作等工作;服务器端要完成控制端的命令解析、屏幕的获取压缩和发送、鼠标命令的接收和执行、键盘命令的接收和执行、远程任务管理器接收执行、远程命令接收执行、警告信息接收执行、文件操作接受执行等工作。

 

图4-2 整体设计示意图

 

4.1.3 数据库模型分析(ER图)及设计

服务器端

服务器端的基本操作过程主要包括以下几个步骤:

1、创建密码验证 ServerSocket 对象实体,在指定端口监听;

2、接收到请求后,验证密码,正确则继续,否则反复验证;

3、创建远程控制 ServerSocket 对象实体,在指定的端口监听客户端请求;

4、调用 ServerSocket 类的 accept()方法接受来自客户端的请求;

5、解析客户端传送的命令、响应完成相应的操作;

6、客户端和服务器工作结束时,关闭输入输出流,关闭 Socket 对象以及 ServerSocket 对象。

服务器端工作流程图如下:

 

图4-3 服务器端工作流程图

服务器端软件的实现过程是当客户端要和服务器建立连接时,如果合法则允许建立连接,如果不合法则拒绝建立连接。建立连接后服务器启动服务,监听客户端发送过来的控制信息,然后和客户端协作完成相应的任务。

 客户端

客户端应用程序主要包括以下几个基本步骤:

1.初始化,等待远程受控端程序运行,建立连接;

2.建立与服务器的连接后,通Socket 对象ccsocket的 getInputStream()方法得到一个输入流,从输入流可以得到远程计算机发到本地客户端的数据,同样 ccsocket 的 getOutputStream()方法可以得到一个输出流,本地的数据利用输出流就可以发送到服务器端;

3.用户在客户端进行操作,将事件命令传送到服务端。服务端命令解析,响应操作。

4. 客户端和服务器工作结束时,关闭输入输出流,关闭 Socket 对象。

客户端包括系统的主界面,下图为主界面主要功能模块图:

 

图4-4 客户端主界面主要功能模块图

 

 

4.2 详细设计

 

4.2.1 详细设计说明

控制端的主窗口设计与实现

控制端的主窗口,提供菜单和工具栏,如图4.1所示。

 

 

 

 

 

图4-1 控制端主界面

图4.1中各功能图标作用简介:

(1)       工具下设主动连接选项。

(2)       皮肤可以设置软件的皮肤。

(3)       关于显示关于本软件信息。

(4)     工具栏PC图标用于配置受控端。

(5)     工具栏第二项根据配置的"本机端口",打开获关闭本机的服务端,主要用来接收被控端上线时发来的消息 如被控的的IP,所开端口号,可用磁盘信息。

(6)     工具栏第三个图标,关闭远程服务,让指定的远程主机下线。

(7)     第四个图标,用于控制端给受控端发送警告信息。

(8)     第五个图标,远程任务管理器。可以看到远程主机正在执行的任务。

(9)     第六个图标,远程命令,可以把你在本机面板上输入的命令传送到远程主机上执行,并返回执行后的结果

(10)  第七个图标,远程屏幕监视,通过该功能监视远程主机的屏幕,远程主机的屏幕信息将会在控制端实时显示出来。不能控制。

(11)  第八个图标,远程监控,通过该功能直接操控远程主机的电脑就像操作自己的电脑一样,我们可以用自己的鼠标控制对方的电脑,同时也可以通过键盘控制对方的电脑。

 

4.2.2模块(网络通信)详细设计

网络通信的实现

我们采用 TCP/IP 协议实现网络通信,但 TCP/IP 协议不是一种应用程序,他不体制直接的用户服务,是通过中间件 Socket来实现的。通过从Socket读数据和向Socket写数据方便地实现对网络资源的使用。

根据传输数据的格式不同,Java提供了流式Socket和数据报式Socket,二者比较如下表:

表4.1 流式Socket与数据报Socket比较

类型

流式Socket

数据包式Socket

支持的传输协议

TCP

UDP

通信服务类型

双向的数据流通信服务

双向的数据包通信服务

通信服务特点

面向连接、有序无差错、无重复、可靠性高、可移植性好

非连接、不保证有序、无差错无重复、可靠性差、可移植性差

可见,流式Socket提供面向连接的可靠通信服务,支持TCP协议,可实现不同类型计算机系统之间的相互通信,编程效率高,因此我们采用流式Socket(以下简称Socket)。要通过互联网进行通信,至少需要一对Socket,其中一个运行于客户端,称之为ClientSocket;另一个运行于服务器端,称之为ServerSocket。根据连接启动的方式以及本地Socket要连接的目标,Socket之间的连接过程可以分为3个步骤:服务器监听、客户端请求、连接确认。

(1)服务器监听,服务器端Socket并不定位具体的客户端Socket,而是使用ServerSocket类来等待客户机的连接请求。服务器ServerSocket是专门建立Socket服务器的类,指定一个合适的端口号(>1025)为参数创建服务器对象:ServerSocket server=new ServerSocket(port);

(2)客户端请求,客户端首先建立一个Socket对象,用于和服务器的通信。由客户端的Socket提出连接请求,要连的目标是服务器端的Socket。为此,客户端的Socket必须首先描述它要连接的服务器的ServerSocket,指出服务器端的IP地址(或主机名)和监听端口号,然后向服务器端Socket提出连接请求。Socket ccsocket=new Socket(serverHost,serverPort);

(3)连接确认,当服务器端ServerSocket监听到或者接收到客户端Socket的连接请求时,ServerSocket将选择一个新的端口并绑定一个新的Socket与客户的Socket建立Socket对。Socket csocket=ssocket.accept();这个新Socket对象将连接到客户端的Socket端口,负责处理与之相对应客户端的通信。客户机的请求被接收,客户端的Socket便被成功创建了,Socket通信便可以开始了。

网络通信的示意图如下:

 

图4-2 网络通信示意图

 

4.2.3模块(屏幕监视的实现)详细设计

屏幕监视的实现

屏幕控制是远程控制系统的核心之一,也是该系统的难点之一。借助屏幕控制,可以让客户端用户实时监控服务器端计算机的运行状态。客户端以一定频率向服务器发送请求,服务器响应客户端请求将自己的屏幕拷贝下来,并将这些信息发送给客户端,客户端接收到这些信息之后以图形的形式显示出来,为鼠标和键盘控制提供图形化界面。

屏幕控制模块,主要涉及到屏幕图像的获取、压缩、传输以及解压缩。屏幕图像是利用Robot对象以位图格式获得的,直接传输会造成比较大的延时,为了提高远程控制系统的实时性,笔者对获取的屏幕图像数据进行了压缩,之后再传输。另外,使用文件形式进行图像传输也会在一定程度上增大控制延时。在这里,笔者实现了把屏幕图像以JPEG格式压缩成数据流,以流的形式传输,这样明显地减小了延迟;同时,在客户端将数据流以JPEG格式解压缩,进一步形成图像并显示给客户,保证实时的同时也确保了图像的清晰度。

另外,由于客户端屏幕图像的获取、压缩和传输以及客户端屏幕图像的接收、解压缩和显示,均需要不断地、频繁但有序地进行,所以,在实现过程中引入了多线程技术,服务器端屏幕图像的获取、压缩和传输以及控制端屏幕图像的接收、解压缩和显示应该分别用一个专门的线程来进行处理,同时借助线程的start、run、sleep、invoke等方法来实现彼此间的协调,从而避免了对CPU资源的竞争。

屏幕控制的实现流程如下图:

 

图4-3 屏幕监视模块流程图

我们可以通过该功能监视远程主机的屏幕,远程主机的屏幕信息将会在我们这边实时显示出来。该功能与屏幕监控的区别就是,该功能只能监视远程主机的屏幕,此时我们的鼠标可以在屏幕显示区域活动,并且鼠标键盘的操作也不会引起远程主机发生变化。

第5章 系统实现

5.1 基于框架的分层实现

 

5.1.1 表现层

 

 

5.1.2 业务逻辑层

 

 

 

5.1.3 持久层

 

 

5.2 系统主要模块的功能实现

5.2.1 登录模块展示

 

<!DOCTYPE html>

<html>

<head>

  <title>登录界面</title>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- 引入 Bootstrap -->

  <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>

  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

  <!-- 引入 font-awesome -->

  <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

  <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

  <link rel="stylesheet" href="css/style.css">

</head>

<body>

<div class="container">

  <div class="form row" style="height: 300px;">

    <form class="form-horizontal col-md-offset-3" id="login_form" action="<%= request.getContextPath()%>/account?method=login" method="post">

      <h3 class="form-title">用户登录</h3>

      <div class="col-md-9">

        <div class="form-group">

          <i class="fa fa-user fa-lg"></i>

          <span style="color: red;font-size: 13px;margin-left: -17px;">用户名错误</span>

          <input class="form-control required" required placeholder="请输入用户名" type="text"name="username"/>

        </div>

        <div class="form-group">

          <i class="fa fa-lock fa-lg"></i>

          <span style="color: red;font-size: 13px;margin-left: -17px;">密码错误</span>

          <input class="form-control required" required placeholder="请输入密码" type="password" name="password"/>

        </div>

        <div class="form-group">

          <label class="radio-inline">

            <input type="radio" name="type" checked value="systemAdmin" class="radio-inline"> 系统管理员

          </label>

          <label class="radio-inline">

            <input type="radio" name="type" value="dormitoryAdmin" class="radio-inline" > 宿舍管理员

          </label>

        </div>

        <div class="form-group col-md-offset-9">

          <button type="submit" class="btn btn-success pull-left" name="submit">登录</button>

          <button type="reset" class="btn btn-success pull-right" name="submit">重置</button>

        </div>

      </div>

    </form>

  </div>

</div>

</body>

</html>

在控制端的界面实现了动画界面风格切换。

 

5.2.2 XX管理模块展示

 

 

<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8" />

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  <!-- 引入 Bootstrap -->

  <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>

  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

  <!-- 引入 font-awesome -->

  <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

  <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

  <script type="application/javascript">

    function change(url,index){

      $(".list-group-item").removeClass("active");

      $(".list-group-item").eq(index).addClass("active");

      $("iframe").attr("src",url);

    }

  </script>

</head>

<body>

<nav class="navbar navbar-inverse" role="navigation">

  <div class="container-fluid">

    <ul class="nav navbar-nav navbar-left">

      <li>

        <a style="font-size: 26px;">脊梁宿舍管理系统-系统管理员</a>

      </li>

    </ul>

    <span style="color: #CCCCCC;font-size: 26px;position: relative;top: 5px;"></span>

    <ul class="nav navbar-nav navbar-right">

      <li>

        <a>欢迎您,郑奋</a>

      </li>

      <li>

        <a href="/account?method=logout">安全退出</a>

      </li>

    </ul>

  </div>

</nav>

<div class="container-fluid">

  <div class="row">

    <div class="col-sm-2">

 

      <a href="javascript:void(0)" class="list-group-item active" onclick="change('/dormitoryAdmin?method=list',0)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-user-circle-o fa-fw"></i>

                                          </span>宿管管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/student?method=list',1)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-user-circle fa-fw"></i>

                                          </span>学生管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/building?method=list',2)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-home fa-fw"></i>

                                          </span>楼宇管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/dormitory?method=list',3)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-bed fa-fw"></i>

                                          </span>宿舍管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/moveout?method=list',4)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-address-card-o fa-fw"></i>

                                          </span>学生迁出登记

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/moveout?method=record',5)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-bookmark fa-fw"></i>

                                          </span>学生迁出记录

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/absent?method=list',6)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-bookmark-o fa-fw"></i>

                                          </span>学生缺寝记录

      </a>

 

    </div>

    <!--右边内容-->

    <iframe style="width: 81%; height: 600px; border: 0px;" src="/dormitoryAdmin?method=list"></iframe>

  </div>

</div>

<div class="footer">

  <p class="text-center">

    2022 © DORMS

  </p>

</div>

</body>

</html>

 在系统界面实现宿舍管理系统一整套流程。

 

 

5.2.3 异常管理模块展示

 

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <!-- 引入 Bootstrap -->

    <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

    <!-- 引入 font-awesome -->

    <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

    <title>宿舍管理系统</title>

</head>

<body>

<div class="container-fluid">

    <div class="row">

        <div class="col-sm-10">

            <!-- 顶部搜索部分 -->

            <div class="panel panel-default">

                <div class="panel-heading">搜索</div>

                <div class="panel-body">

                    <form role="form" class="form-inline" action="/absent?method=search" method="post">

                        <div class="form-group">

                            <label for="name">字段:</label>

                            <select name="key" class="form-control">

                                <option value="buildingName">楼宇</option>

                                <option value="dormitoryName">宿舍</option>

                            </select>

                        </div>

                        <div class="form-group" style="margin-left: 20px">

                            <label for="value">值:</label>

                            <input type="text" class="form-control" name="value" placeholder="字段值" maxlength="12" style="width: 130px">

                        </div>

                        <div class="form-group " style="margin-left: 20px">

                            <button type="submit" class="btn btn-info ">

                                                                      <span style="margin-right: 5px"

                                              class="glyphicon glyphicon-search" aria-hidden="true">

                                                                      </span>开始搜索

                            </button>

                        </div>

                    </form>

                </div>

            </div>

            <!-- 列表展示-->

            <div class="table-responsive">

                <table class="table table-hover ">

                    <thead>

                    <tr>

                        <th>ID</th>

                        <th>楼宇</th>

                        <th>宿舍</th>

                        <th>姓名</th>

                        <th>原因</th>

                        <th>宿管</th>

                        <th>日期</th>

                    </tr>

                    </thead>

                    <tbody>

                    <c:forEach items="${list}" var="absent">

                        <tr>

                            <td>132414</td>

                            <td>九栋</td>

                            <td>9617</td>

                            <td>郑奋</td>

                            <td>桌子坏了</td>

                            <td>陈乙宣</td>

                            <td>2023年6月20号</td>

                        </tr>

                    </c:forEach>

                    </tbody>

                </table>

            </div>

        </div>

    </div>

</div>

 

</body>

 

</html>

第6章 总结与展望

经过几个星期的设计和编码,远程监控系统基本开发完毕。基本实现了预定完成的功能。本文阐述了远程监控的基础理论和实现过程。由于篇幅的原因,不可能把整个系统中的每一项技术,每一个细节具体地讲出来,因此,我们只是有选择地对系统中的一些内容进行了介绍。不足之处,还望各位指教。

通过TCP/IP协议,使用Java套接字技术,综合流、多线程等各种技巧,在网络中传输数据进而使得实时地监控远程计算机成为现实。结合Android系统开发技术,将远程监控技术向移动终端扩展,使得远程监控向移动化方向发展,极大的提高了便捷性。

在作品设计期间,学习了java 套接字编程,用到的包有java.lang, java.io, java.awt,java.awt.event,java.awt.image,javax.swing, java.net 和com.sun.image. codec.jpeg。重要的类有Robot(事件模拟类)、Toolkit(工具箱类)、JPEGCodec(jpeg 图象编码/解码类)、UIManager(界面管理类)、Socket(套接字类)、ServerSocket(服务器套接字类)和InetAddress(Internet 地址类),以及一系列的监听器(Android),并查看学习了许多资料。在系统的研发过程中,我们也遇到许多困难,因为以前没有项目经验,起步很难,不过通过各种知识的补充学习,并且查找各种资料,团队慢慢进入状态,并且从中找到很多乐趣。

本系统经过测试,效果良好,但是由于时间有限,技术上存在许多需要改进之处。在功能上还有许多待完善的地方,比如可以调用PC的摄像头、麦克风、和被控端聊天、将被控端连接到硬件如电灯实现智能家居控制,这些设想我们都在进一步的研究与实现。希望通过我们今后的不断努力,我们的作品可以应用于实际,真正服务于远程监控这个大的领域。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

海南经贸职业技术学院

 

课程设计报告

( 2022--2023年度第2学期)

 

 

课程名称:     Java企业级应用开发

课程设计题目:基于Java SE架构的学生管理系统

院    系:      乌拉尔学院 

班    级:      计算机软件技术班 

学    号:       2141210118    

学生姓名: 郑奋(组长)、何邦通、何青奋

 

 

成    绩:                        

          

日期:2023年 6月

 

摘要

随着网络技术的发展,远程监控越来越多地应用在各种场合。虽然现在有很多远程监控软件,但是使用Java开发的远程监控系统并不多。基于Java的远程监控系统软件突破了空间的限制,使用者不用亲临,在自己的电脑面前就能轻松的实现对被监控端机器的监控。系统采用Java网络编程和Java图形编程实现了PC机的之间的远程监控;利用远程监控的技术,应时下流行的安卓移动终端的需要,以JAVA语言跨平台的技术便捷性,结合安卓系统开发技术,将监控功能移植到移动终端设备,实现了移动终端对PC机的远程监控,并且未来可向远程操控智能家居等设备发展。

本文介绍了远程监控的原理,论述了利用Java实现远程监控软件的程序设计方法和要点,并给出了各个要点的具体实现方法。实现远程控制系统的关键,在于建立服务端与客户端之间的数据通道,该通道可以通过基于Java的Socket来实现。利用Socket编程机制,不仅能用于客户机/服务器(Client/Server)的分布式计算模式,而且也能用于浏览器/服务器(Browser/Server)模式中的浏览器客户程序与服务器之间的通信。

屏幕图像的获取以及显示是该系统的又一核心,在本系统中,采用了图像压缩技术与解压缩技术减少了图像的数据量,并借助Java的数据流技术进一步减轻了图像传输过程中的压力,使得图像可以快速、准确地传输到客户端并显示,从而较好地实现了远程控制系统中的实时效果,为后续控制奠定了基础。

鼠标与键盘控制在远程监控系统中具有举足轻重的地位,用户操作远程服务器,主要是通过鼠标和键盘两大交互设备,在既成图像上进行操作,同时获取操作指令及相关信息并发送到服务器端;服务器端接收指令进行处理,并依据处理指令,借助Java类Robot来在服务器端执行,从而达到控制远程服务器的效果。在本系统中,客户端通过分别对负责显示图像的画布以及程序窗口添加鼠标和键盘对应事件来获取指令信息,数据流负责指令信息的传输和接收、读取,Robot类的对象负责对指令信息的执行,从而完成了远程控制系统的最终实现。

本系统从系统需求分析、概要设计、详细设计到具体的编码实现和后期的代码优化、功能测试都严格遵循了软件工程的思想。

 

关键词:远程监控;Java Robot;屏幕截取;Java Socket;多线程;

 

目录

第1章 绪论.......................................................................................................... 4

1.1 项目背景与需求..................................................................................... 4

1.2 目的和意义............................................................................................. 4

1.3 国内外发展现状..................................................................................... 4

1.4 主要内容................................................................................................. 4

第2章 系统相关的知识及技术选型介绍.......................................................... 5

2.1 Spring框架简介...................................................................................... 5

2.2 Spring Boot框架概述............................................................................. 6

2.3 持久层框架概述..................................................................................... 6

2.4 RESTful概述.......................................................................................... 6

第3章 系统技术架构和可行性分析.................................................................. 7

3.1系统架构.................................................................................................. 7

3.2 系统功能架构......................................................................................... 7

3.3 系统用例图和设计要求......................................................................... 7

3.4 系统开发环境......................................................................................... 7

第4章 系统的分析和设计.................................................................................. 8

4.1 概要设计................................................................................................. 8

4.1.1 系统功能结构.............................................................................. 8

4.1.2 系统业务流程图.......................................................................... 8

4.1.3 数据库模型分析(ER图)及设计........................................... 8

4.2 详细设计................................................................................................. 8

4.2.1 详细设计说明.............................................................................. 8

4.2.2模块(X)详细设计.................................................................... 8

4.2.3模块(Y)详细设计.................................................................... 8

第5章 系统实现.................................................................................................. 9

5.1 基于框架分层实现................................................................................. 9

5.1.1 表现层.......................................................................................... 9

5.1.2 业务逻辑层.................................................................................. 9

5.1.3 持久层.......................................................................................... 9

5.2 系统主要模块的功能实现..................................................................... 9

5.2.1 登录模块展示.............................................................................. 9

5.2.2 XX管理模块展示........................................................................ 9

5.2.3 异常管理模块展示...................................................................... 9

第6章 总结与展望............................................................................................ 10

鸣谢...................................................................................................................... 11

 

不要删除行尾的分节符,此行不会被打印


 

 

 

 

 

千万不要删除行尾的分节符,此行不会被打印。在目录上点右键“更新域”,然后“更新整个目录”。打印前,不要忘记把上面“Abstract”这一行后加一空行


第1章 绪论

1.1  项目背景与需求

随着Web 2.0时代的到来,人类的社会活动越来越智能化。远程监控可以帮助人们更加方便的操控智能设备。电脑中的远程监控技术,始于DOS时代,只不过由于当时的技术上没有什么的大的变化,网络不发达,市场没有更高的要求,所以远程监控技术没有引起更多人的注意。但是随着网络的高度发展,电脑的管理及技术支持的需要,远程监控技术越来越引起人们的关注。

今天,网络技术的不断发展为远程监控技术创造了良好的条件。许多企业正在把远程监控能力作为有效的技术支持工具。很多网络管理员都才用这类软件对局域网进行管理。随着时代的进步,越来越多的学校配备了电脑设备,此类软件也非常适合学校的局域网电脑管理。同时远程监控软件在计算机远程教学和培训中也发挥了很大作用。

伴随着IT产业的不断发展,移动终端设备越来越普及,并逐渐融入人们的日常生活中,个人计算机、平板电脑和智能手机便是其中不可分割的重要组成部分。日新月异的信息化高端科技极大地影响和改变了人们的生活方式。同时近年来标志着智能化时代来临的物联网的兴起, 使得如何能够随时随地方便地掌握已连接上互联网的设备的运行状态,如何能更加方便的监控和操纵自己的智能设备已成为了人们新的需求。

在人们的需求及这样的大背景下,我们的作品应运而生。

 

1.2 目的和意义

1.提供远程技术支持

我们知道,通常企业内部或者IT公司的客户技术支持部门都有技术支持业务,其任务是通过电话解答疑难而难题,努力减少支持人员到现场或者让用户把设备送到技术支持中心进行维护。这种技术支持方式尽管被普遍采用,但是效率不高并且大大增加了技术支持的成本。

通常,技术支持必须依赖技术人员与用户之间的口头交流来进行,这种交流既耗时间又容易出错。许多商业用户对计算机知之甚少,然后遇到问题时,他们必须向技术人员提供故障情况及相关操作。比如向无法看到计算机屏幕的技术人员描述问题的症状;按照技术人员的指示精确的描述按技术人员的提示精确的描述屏幕上的内容;在尝试解决问题时,技术人员可能指导用户执行一系列复杂的过程,而这些过程对用户来说或许完全不熟悉;如果用户不能正确的按要求操作,反而使问题恶化;有些修改,如修改Windows 注册表,不能或不该由最终用户进行,但若是维护人员图省事,口头指挥用户操作,很可能产生严重的后果。以上这些情形费时又费事,工作效率很低。此外,如果通过电话不能解决问题,那么在技术人员亲自到用户现场解决问题之前,计算机将一直不能使用。远程监控软件能使技术人员直接操作远程计算机,就像操作本地计算机一样,无需用户介入,技术人员就能得到该机器的问题的第一手材料,从而加快了问题的解决。实际上,使用远程控制工具的技术人员能够做到解答疑难问题,安装和配置软件,把软件修补程序下载到用户计算机上,配置应用程序和系统软件设置并可通过实际操作培训用户。

2. 为远程教学的快速发展助力

近年来,远程教学迅速发展,但目前以电视传播信息的方式进行远程教学则占多数。虽然有通过Internet传播教学信息的,但也仅限于浏览网页,通过发邮件和留言的方式向老师提问,通过论坛的方式进行讨论,从而学习知识。这些技术和方法的采用,大大地加强了远程教学的“真实”性,然而,现场教学的实时性并没有在远程教学中得到体现。在远程教学中需要大量使用计算机远程教学管理软件,通过这种软件,师生可进行实时的通信,交流信息,对话和传递文件。因此,远程监控软件在远程教学中是大有作为的。

3. 服务于企业内部管理

随着社会的发展,企业规模越来越大,大家都在同一个办公室的时代早就一去不复返了。员工不在一栋办公楼内,不在同一个城市,甚至不在一个国家里办公,这样的企业越来越多,他们所面临的问题就是如何在不同的地方共享共同的资源。特别是IT企业,企业管理人员知道他的员工在干什么,是否外泄了公司内部的程序源代码,这一直都是IT公司管理的一大难题。随着人们观念的更新,现在,很多企业开始使用监控系统,用摄像的方式来监控员工的行为。但是,这种监控系统对员工的敲键,发送邮件等细小的行为依然无能为力。远程监控软件却能轻松地管理这些细节问题,因此,远程监控软件在企业的内部管理上将发挥很大的作用。

随着社会、科技、经济的不断发展,远程监控技术的应用范围也在

不断拓展。小到个人的使用,大到整个行业的应用。

4. 推进远程监控移动化发展

随着信息化时代的到来,人们对于电子、电器等产品的依赖不再仅仅是它们可以便捷我们的生活,而对其智能化的要求也越来越高,远程控制也由原来的PC2PC控制向智能设备控制及智能设备操作等方面发展。想象一下,如果在烈日炎炎的下班途中,我们能够通过在手机等移动终端上轻轻一点,家中的空调便可以提前开启,让我们一进家门便能拥有凉爽的环境,这将是多么美好的一件事。虽然将人们的这种宿求完美实现并推广至千家万户还需要很长的时间,但足以看出人们对于移动终端的远程监控与操纵功能的需求,这也将是未来远程监控的重要发展方向。PC2PC的远程控制必然会随着技术的发展达到顶峰,如果不向移动终端扩展,其发展将会达到一个难以逾越的瓶颈,我们的作品在实现PC2PC远程监控的基础上,增加了移动终端对PC的控制,实现了跨平台的远程监控,对于远程控制便捷化、移动化的发展起到了推动作用。

 

1.3 国内外发展现状

Java作为一门历史悠久且极其重要的编程语言,在全球的应用开发领域占有重要的地位。在我二十年的开发经验中,我看到了Java语言的起起落落,以及它在国内外的发展变化。

在国外,Java已经成为了大型企业的首选开发语言,尤其是在金融、保险和零售等领域,由于这些领域需要处理大量的数据和复杂的业务流程,Java的稳定性和高效性为其赢得了口碑。此外,Java也是许多著名的开源项目如Apache Hadoop,Spring Framework,Elasticsearch等的开发语言,这进一步推动了Java语言的发展和普及。

 

在国内,Java的发展也非常迅速。随着中国经济的快速发展和数字化转型,Java被广泛应用于各种行业,如电商、支付、云计算等。许多中国的大型互联网公司,如阿里巴巴,腾讯,华为等,都在大规模使用Java进行开发。特别是阿里巴巴,他们不仅使用Java开发了众多的业务系统,还贡献了许多优秀的开源项目,如Dubbo,RocketMQ等,对Java在国内的推广做出了巨大贡献。

同时,Java语言本身也在不断的发展和进步。近几年,Java已经进行了多次重大更新,比如模块化的Java 9,支持函数式编程的Java 8,这些更新都大大提升了Java的功能性和灵活性。目前,Java 17作为一个长期支持版本(LTS)已经发布,它包含了许多新的特性和优化,我相信这将进一步推动Java的发展。

总的来说,无论在国内还是国外,Java都是一门非常重要的编程语言,它在各个领域都有广泛的应用。随着技术的不断发展和创新,Java仍然有很大的发展空间和潜力。

 

1.4 主要内容

在远程控制软件中,对于服务器和客户机进行的数据通信所使用的主要技术就是网络编程技术。

在 Java 中有两个最为基本的网络 TCP 套接字控件,一个是服务器端的,另一个是客户端的。将 ServerSocket 类设计成在等待客户建立连接之前不做任何事的“监听器”,而 Socket 类则为建立连向服务器套接字以及启动协议交换而设计。

1. ServerSocket 类

当用户需要建立一个网络服务器时,需要使用 ServerSocket 类来创建套接字。例如:

ServerSocket serversocket=new ServerSocket(2525);

创建套接字后,通过下面的语句通知程序无限期地等待,直到有客户连接到这个端口:

Socket incoming=serversocket.accept( )。

一旦某个用户通过在网上放松一个正确的请求连接到这个端口,将返回一个 Socket 对象,表示刚建立的连接。可以用这个 ServerSocket对象得到这个套接字的一个输入流读取器(reader)和一个输入流写入器。

总的来说,对于服务器,将不停地执行如下循环:

● 通过输入数据流得到来自客户的命令;

● 以某种方式取回这个信息;

● 通过输出数据流给客户发送信息。

2.Socket 类

Socket 对象的创建只是隐式地建立了客户和服务器的连接,没有显示地说明建立连接细节的方法或构造函数。

通过以上的简单介绍,可以理解如何使用ServerSocket 和 Socket 来建立一个服务器和客户程序。

 

 

第2章 系统技术选型介绍

 

2.1 Spring框架简介

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

Spring框架由七个定义明确的模块组成(图1.1)。

 

图2.1  Spring框架

 

 

2.2 Spring Boot框架概述

 

 

2.3 持久层框架概述

 

  

2.4 RESTful概述

 

第3章 系统技术架构和可行性分析

 

3.1系统架构

 

 

 

(图+说明)

 

 

3.2 系统功能架构

 

 

(图+说明)

 

 

 

3.3 系统用例图和设计要求

 

3.4 系统开发环境

硬件环境:

CPU: Itel Core2 Duo CPU T8100 @2.10GHz

内存: 2G

硬盘: 500GB

软件环境:

操作系统: Windows 7旗舰版

应用软件: MyEclipse 9.0 +JDK 1.6.0_13

 

第4章 系统的分析和设计

 

4.1 概要设计

4.1.1 系统功能结构

 TCP 面向连接

我们要实现的系统所使用的Socket套接字是基于TCP/IP的API。所以系统必须选择面向连接的通信方式。面向连接的网络通信首先在客户机和服务器之间定义一套通信协议,并创建 Socket 类,利用这个类来建立一条可靠的链接。然后,客户机/服务器再在这条链接上可靠地传输数据。从而,保证了客户端和服务端的连接所要求的可靠性、安全性。而 UDP 非面向连接的协议,各个数据相互独立,这种协议并不能保证数据包是否到达、到达时间、到达顺序。所以我们选择面向连接的TCP 协议,而不是无连接的 UDP 协议。

另外,UDP 协议的数据包最大长度是 64KB,屏幕图像的数据量要超过 64KB,所以我们选择 TCP 协议进行屏幕图像数据传输。

C/S模式

C/S(Client/Server,客户机/服务器)模式又称C/S结构,是20世纪80年代末逐步成长起来的一种模式,是软件系统体系结构的一种。客户向服务器主动发动服务请求,服务器做出响应,这就是C/S模式相互作用的基本过程。

C/S模式每次通信过程都有客户进程主动发起,而且是随机的,服务器进程先进入等待状态,随时准备对客户的请求做出及时的响应,因此客户和服务器,一个主动请求,一个被动响应,一个启动通    信,一个等待通信。

 

图4-1 C/S模式体系结构

 

4.1.2 系统业务流程图

体系结构设计

该远程监控系统由控制端与受控端两个部分组成。控制端要完成端口设置、屏幕接收解压和显示、鼠标命令的获取和发送、键盘命令的获取和发送、远程任务管理器、远程命令、发送警告信息、文件操作等工作;服务器端要完成控制端的命令解析、屏幕的获取压缩和发送、鼠标命令的接收和执行、键盘命令的接收和执行、远程任务管理器接收执行、远程命令接收执行、警告信息接收执行、文件操作接受执行等工作。

 

图4-2 整体设计示意图

 

4.1.3 数据库模型分析(ER图)及设计

服务器端

服务器端的基本操作过程主要包括以下几个步骤:

1、创建密码验证 ServerSocket 对象实体,在指定端口监听;

2、接收到请求后,验证密码,正确则继续,否则反复验证;

3、创建远程控制 ServerSocket 对象实体,在指定的端口监听客户端请求;

4、调用 ServerSocket 类的 accept()方法接受来自客户端的请求;

5、解析客户端传送的命令、响应完成相应的操作;

6、客户端和服务器工作结束时,关闭输入输出流,关闭 Socket 对象以及 ServerSocket 对象。

服务器端工作流程图如下:

 

图4-3 服务器端工作流程图

服务器端软件的实现过程是当客户端要和服务器建立连接时,如果合法则允许建立连接,如果不合法则拒绝建立连接。建立连接后服务器启动服务,监听客户端发送过来的控制信息,然后和客户端协作完成相应的任务。

 客户端

客户端应用程序主要包括以下几个基本步骤:

1.初始化,等待远程受控端程序运行,建立连接;

2.建立与服务器的连接后,通Socket 对象ccsocket的 getInputStream()方法得到一个输入流,从输入流可以得到远程计算机发到本地客户端的数据,同样 ccsocket 的 getOutputStream()方法可以得到一个输出流,本地的数据利用输出流就可以发送到服务器端;

3.用户在客户端进行操作,将事件命令传送到服务端。服务端命令解析,响应操作。

4. 客户端和服务器工作结束时,关闭输入输出流,关闭 Socket 对象。

客户端包括系统的主界面,下图为主界面主要功能模块图:

 

图4-4 客户端主界面主要功能模块图

 

 

4.2 详细设计

 

4.2.1 详细设计说明

控制端的主窗口设计与实现

控制端的主窗口,提供菜单和工具栏,如图4.1所示。

 

 

 

 

 

图4-1 控制端主界面

图4.1中各功能图标作用简介:

(1)       工具下设主动连接选项。

(2)       皮肤可以设置软件的皮肤。

(3)       关于显示关于本软件信息。

(4)     工具栏PC图标用于配置受控端。

(5)     工具栏第二项根据配置的"本机端口",打开获关闭本机的服务端,主要用来接收被控端上线时发来的消息 如被控的的IP,所开端口号,可用磁盘信息。

(6)     工具栏第三个图标,关闭远程服务,让指定的远程主机下线。

(7)     第四个图标,用于控制端给受控端发送警告信息。

(8)     第五个图标,远程任务管理器。可以看到远程主机正在执行的任务。

(9)     第六个图标,远程命令,可以把你在本机面板上输入的命令传送到远程主机上执行,并返回执行后的结果

(10)  第七个图标,远程屏幕监视,通过该功能监视远程主机的屏幕,远程主机的屏幕信息将会在控制端实时显示出来。不能控制。

(11)  第八个图标,远程监控,通过该功能直接操控远程主机的电脑就像操作自己的电脑一样,我们可以用自己的鼠标控制对方的电脑,同时也可以通过键盘控制对方的电脑。

 

4.2.2模块(网络通信)详细设计

网络通信的实现

我们采用 TCP/IP 协议实现网络通信,但 TCP/IP 协议不是一种应用程序,他不体制直接的用户服务,是通过中间件 Socket来实现的。通过从Socket读数据和向Socket写数据方便地实现对网络资源的使用。

根据传输数据的格式不同,Java提供了流式Socket和数据报式Socket,二者比较如下表:

表4.1 流式Socket与数据报Socket比较

类型

流式Socket

数据包式Socket

支持的传输协议

TCP

UDP

通信服务类型

双向的数据流通信服务

双向的数据包通信服务

通信服务特点

面向连接、有序无差错、无重复、可靠性高、可移植性好

非连接、不保证有序、无差错无重复、可靠性差、可移植性差

可见,流式Socket提供面向连接的可靠通信服务,支持TCP协议,可实现不同类型计算机系统之间的相互通信,编程效率高,因此我们采用流式Socket(以下简称Socket)。要通过互联网进行通信,至少需要一对Socket,其中一个运行于客户端,称之为ClientSocket;另一个运行于服务器端,称之为ServerSocket。根据连接启动的方式以及本地Socket要连接的目标,Socket之间的连接过程可以分为3个步骤:服务器监听、客户端请求、连接确认。

(1)服务器监听,服务器端Socket并不定位具体的客户端Socket,而是使用ServerSocket类来等待客户机的连接请求。服务器ServerSocket是专门建立Socket服务器的类,指定一个合适的端口号(>1025)为参数创建服务器对象:ServerSocket server=new ServerSocket(port);

(2)客户端请求,客户端首先建立一个Socket对象,用于和服务器的通信。由客户端的Socket提出连接请求,要连的目标是服务器端的Socket。为此,客户端的Socket必须首先描述它要连接的服务器的ServerSocket,指出服务器端的IP地址(或主机名)和监听端口号,然后向服务器端Socket提出连接请求。Socket ccsocket=new Socket(serverHost,serverPort);

(3)连接确认,当服务器端ServerSocket监听到或者接收到客户端Socket的连接请求时,ServerSocket将选择一个新的端口并绑定一个新的Socket与客户的Socket建立Socket对。Socket csocket=ssocket.accept();这个新Socket对象将连接到客户端的Socket端口,负责处理与之相对应客户端的通信。客户机的请求被接收,客户端的Socket便被成功创建了,Socket通信便可以开始了。

网络通信的示意图如下:

 

图4-2 网络通信示意图

 

4.2.3模块(屏幕监视的实现)详细设计

屏幕监视的实现

屏幕控制是远程控制系统的核心之一,也是该系统的难点之一。借助屏幕控制,可以让客户端用户实时监控服务器端计算机的运行状态。客户端以一定频率向服务器发送请求,服务器响应客户端请求将自己的屏幕拷贝下来,并将这些信息发送给客户端,客户端接收到这些信息之后以图形的形式显示出来,为鼠标和键盘控制提供图形化界面。

屏幕控制模块,主要涉及到屏幕图像的获取、压缩、传输以及解压缩。屏幕图像是利用Robot对象以位图格式获得的,直接传输会造成比较大的延时,为了提高远程控制系统的实时性,笔者对获取的屏幕图像数据进行了压缩,之后再传输。另外,使用文件形式进行图像传输也会在一定程度上增大控制延时。在这里,笔者实现了把屏幕图像以JPEG格式压缩成数据流,以流的形式传输,这样明显地减小了延迟;同时,在客户端将数据流以JPEG格式解压缩,进一步形成图像并显示给客户,保证实时的同时也确保了图像的清晰度。

另外,由于客户端屏幕图像的获取、压缩和传输以及客户端屏幕图像的接收、解压缩和显示,均需要不断地、频繁但有序地进行,所以,在实现过程中引入了多线程技术,服务器端屏幕图像的获取、压缩和传输以及控制端屏幕图像的接收、解压缩和显示应该分别用一个专门的线程来进行处理,同时借助线程的start、run、sleep、invoke等方法来实现彼此间的协调,从而避免了对CPU资源的竞争。

屏幕控制的实现流程如下图:

 

图4-3 屏幕监视模块流程图

我们可以通过该功能监视远程主机的屏幕,远程主机的屏幕信息将会在我们这边实时显示出来。该功能与屏幕监控的区别就是,该功能只能监视远程主机的屏幕,此时我们的鼠标可以在屏幕显示区域活动,并且鼠标键盘的操作也不会引起远程主机发生变化。

第5章 系统实现

5.1 基于框架的分层实现

 

5.1.1 表现层

 

 

5.1.2 业务逻辑层

 

 

 

5.1.3 持久层

 

 

5.2 系统主要模块的功能实现

5.2.1 登录模块展示

 

<!DOCTYPE html>

<html>

<head>

  <title>登录界面</title>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- 引入 Bootstrap -->

  <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>

  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

  <!-- 引入 font-awesome -->

  <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

  <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

  <link rel="stylesheet" href="css/style.css">

</head>

<body>

<div class="container">

  <div class="form row" style="height: 300px;">

    <form class="form-horizontal col-md-offset-3" id="login_form" action="<%= request.getContextPath()%>/account?method=login" method="post">

      <h3 class="form-title">用户登录</h3>

      <div class="col-md-9">

        <div class="form-group">

          <i class="fa fa-user fa-lg"></i>

          <span style="color: red;font-size: 13px;margin-left: -17px;">用户名错误</span>

          <input class="form-control required" required placeholder="请输入用户名" type="text"name="username"/>

        </div>

        <div class="form-group">

          <i class="fa fa-lock fa-lg"></i>

          <span style="color: red;font-size: 13px;margin-left: -17px;">密码错误</span>

          <input class="form-control required" required placeholder="请输入密码" type="password" name="password"/>

        </div>

        <div class="form-group">

          <label class="radio-inline">

            <input type="radio" name="type" checked value="systemAdmin" class="radio-inline"> 系统管理员

          </label>

          <label class="radio-inline">

            <input type="radio" name="type" value="dormitoryAdmin" class="radio-inline" > 宿舍管理员

          </label>

        </div>

        <div class="form-group col-md-offset-9">

          <button type="submit" class="btn btn-success pull-left" name="submit">登录</button>

          <button type="reset" class="btn btn-success pull-right" name="submit">重置</button>

        </div>

      </div>

    </form>

  </div>

</div>

</body>

</html>

在控制端的界面实现了动画界面风格切换。

 

5.2.2 XX管理模块展示

 

 

<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8" />

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  <!-- 引入 Bootstrap -->

  <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>

  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

  <!-- 引入 font-awesome -->

  <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

  <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

  <script type="application/javascript">

    function change(url,index){

      $(".list-group-item").removeClass("active");

      $(".list-group-item").eq(index).addClass("active");

      $("iframe").attr("src",url);

    }

  </script>

</head>

<body>

<nav class="navbar navbar-inverse" role="navigation">

  <div class="container-fluid">

    <ul class="nav navbar-nav navbar-left">

      <li>

        <a style="font-size: 26px;">脊梁宿舍管理系统-系统管理员</a>

      </li>

    </ul>

    <span style="color: #CCCCCC;font-size: 26px;position: relative;top: 5px;"></span>

    <ul class="nav navbar-nav navbar-right">

      <li>

        <a>欢迎您,郑奋</a>

      </li>

      <li>

        <a href="/account?method=logout">安全退出</a>

      </li>

    </ul>

  </div>

</nav>

<div class="container-fluid">

  <div class="row">

    <div class="col-sm-2">

 

      <a href="javascript:void(0)" class="list-group-item active" onclick="change('/dormitoryAdmin?method=list',0)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-user-circle-o fa-fw"></i>

                                          </span>宿管管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/student?method=list',1)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-user-circle fa-fw"></i>

                                          </span>学生管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/building?method=list',2)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-home fa-fw"></i>

                                          </span>楼宇管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/dormitory?method=list',3)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-bed fa-fw"></i>

                                          </span>宿舍管理

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/moveout?method=list',4)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-address-card-o fa-fw"></i>

                                          </span>学生迁出登记

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/moveout?method=record',5)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-bookmark fa-fw"></i>

                                          </span>学生迁出记录

      </a>

      <a href="javascript:void(0)" class="list-group-item" onclick="change('/absent?method=list',6)">

                                          <span class="" aria-hidden="true">

                                                 <i class="fa fa-bookmark-o fa-fw"></i>

                                          </span>学生缺寝记录

      </a>

 

    </div>

    <!--右边内容-->

    <iframe style="width: 81%; height: 600px; border: 0px;" src="/dormitoryAdmin?method=list"></iframe>

  </div>

</div>

<div class="footer">

  <p class="text-center">

    2022 © DORMS

  </p>

</div>

</body>

</html>

 在系统界面实现宿舍管理系统一整套流程。

 

 

5.2.3 异常管理模块展示

 

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <!-- 引入 Bootstrap -->

    <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

    <!-- 引入 font-awesome -->

    <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

    <title>宿舍管理系统</title>

</head>

<body>

<div class="container-fluid">

    <div class="row">

        <div class="col-sm-10">

            <!-- 顶部搜索部分 -->

            <div class="panel panel-default">

                <div class="panel-heading">搜索</div>

                <div class="panel-body">

                    <form role="form" class="form-inline" action="/absent?method=search" method="post">

                        <div class="form-group">

                            <label for="name">字段:</label>

                            <select name="key" class="form-control">

                                <option value="buildingName">楼宇</option>

                                <option value="dormitoryName">宿舍</option>

                            </select>

                        </div>

                        <div class="form-group" style="margin-left: 20px">

                            <label for="value">值:</label>

                            <input type="text" class="form-control" name="value" placeholder="字段值" maxlength="12" style="width: 130px">

                        </div>

                        <div class="form-group " style="margin-left: 20px">

                            <button type="submit" class="btn btn-info ">

                                                                      <span style="margin-right: 5px"

                                              class="glyphicon glyphicon-search" aria-hidden="true">

                                                                      </span>开始搜索

                            </button>

                        </div>

                    </form>

                </div>

            </div>

            <!-- 列表展示-->

            <div class="table-responsive">

                <table class="table table-hover ">

                    <thead>

                    <tr>

                        <th>ID</th>

                        <th>楼宇</th>

                        <th>宿舍</th>

                        <th>姓名</th>

                        <th>原因</th>

                        <th>宿管</th>

                        <th>日期</th>

                    </tr>

                    </thead>

                    <tbody>

                    <c:forEach items="${list}" var="absent">

                        <tr>

                            <td>132414</td>

                            <td>九栋</td>

                            <td>9617</td>

                            <td>郑奋</td>

                            <td>桌子坏了</td>

                            <td>陈乙宣</td>

                            <td>2023年6月20号</td>

                        </tr>

                    </c:forEach>

                    </tbody>

                </table>

            </div>

        </div>

    </div>

</div>

 

</body>

 

</html>

第6章 总结与展望

经过几个星期的设计和编码,远程监控系统基本开发完毕。基本实现了预定完成的功能。本文阐述了远程监控的基础理论和实现过程。由于篇幅的原因,不可能把整个系统中的每一项技术,每一个细节具体地讲出来,因此,我们只是有选择地对系统中的一些内容进行了介绍。不足之处,还望各位指教。

通过TCP/IP协议,使用Java套接字技术,综合流、多线程等各种技巧,在网络中传输数据进而使得实时地监控远程计算机成为现实。结合Android系统开发技术,将远程监控技术向移动终端扩展,使得远程监控向移动化方向发展,极大的提高了便捷性。

在作品设计期间,学习了java 套接字编程,用到的包有java.lang, java.io, java.awt,java.awt.event,java.awt.image,javax.swing, java.net 和com.sun.image. codec.jpeg。重要的类有Robot(事件模拟类)、Toolkit(工具箱类)、JPEGCodec(jpeg 图象编码/解码类)、UIManager(界面管理类)、Socket(套接字类)、ServerSocket(服务器套接字类)和InetAddress(Internet 地址类),以及一系列的监听器(Android),并查看学习了许多资料。在系统的研发过程中,我们也遇到许多困难,因为以前没有项目经验,起步很难,不过通过各种知识的补充学习,并且查找各种资料,团队慢慢进入状态,并且从中找到很多乐趣。

本系统经过测试,效果良好,但是由于时间有限,技术上存在许多需要改进之处。在功能上还有许多待完善的地方,比如可以调用PC的摄像头、麦克风、和被控端聊天、将被控端连接到硬件如电灯实现智能家居控制,这些设想我们都在进一步的研究与实现。希望通过我们今后的不断努力,我们的作品可以应用于实际,真正服务于远程监控这个大的领域。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

鸣谢

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

鸣谢