怎么建立公司网站平台,怎么做企业官方网站,那个网站做教学视频,怎么做同城商务网站1 在线考试系统 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 软件的需求分析 在线考试系统的主要功能分析如下#xff1a; #xff08; 1 #xff09;学员系统 #xff08;1.1#xff09;用户模块…1 在线考试系统 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 软件的需求分析 在线考试系统的主要功能分析如下 1 学员系统 1.1用户模块登录、修改密码、退出 1.2考试模块开始考试、查询成绩、导出成绩选 2 管理员系统 1.3学员管理模块增加学员、删除学员、修改学员、查找学员 1.4考题管理模块增加考题、删除考题、修改考题、查找考题、导入考题选 1.3 软件的概要设计 在线考试系统采用 C(Client 客户端 )/S(Server 服务器 ) 架构进行设计具体如下 1客户端 (Client) - 主要用于提供字符界面供用户选择并将处理结果显示出来。 2服务器 (Server) - 主要用于针对字符界面的选择实现真正业务功能的处理。 3数据库 (Database) - 主要用于进行数据的存取。 分析 因为我们刚提到客户端的主要作用实际上就是提供一个界面让用户选择。那用户根据这个界面呢进行选择而真正的这个选择之后的业务处理实际上是不还得交给服务器来实现真正的功能处理 这有点像我们现实中的什么呢ATM机。就是我们取钱的时候可能是通过ATM机来取款。但是我们的这个账户信息我们的个人账户信息是在ATM机里面存着吗当然不是对不对 那ATM机坏了岂不是我们的账说不清了吗那在哪儿啊哎这个我们的这个账户信息实际上实际上是不是都在后台的服务器 1.4 软件的详细设计 1客户端和服务器之间采用基于 tcp 协议的编程模型进行通信。 2客户端的对象输出流连接服务器的对象输入流。 3服务器的对象输出流连接客户端的对象输入流。 4客户端采用消息的类型作为具体业务的代表伴随着账户信息等一并发送给服务器。 5当客户端发来的消息类型为 managerCheck 时则表示要实现管理员账户信息的校验功 能。 6当客户端发来的消息类型为 userCheck 时则表示要实现学员账户信息的校验功能。 7服务器采用消息的类型作为是否校验成功的标志发送给客户端。 8当客户端收到的消息类型为 success 时则表示账户信息正确。 9当客户端收到的消息类型为 fail 时则表示账户信息错误。 1.5 软件的编码流程 1 管理员登录功能 1编写基于 tcp 协议的服务器端也就是初始化服务器 2编写基于 tcp 协议的客户端来连接服务器 3编写客户端的字符界面并提示客户进行业务的选择 4将客户的选择和输入的相关信息通过对象输出流发送给服务器 5服务器通过对象输入流接收客户端发来的消息并进行功能处理将处理结果发送给客户端 6客户端通过对象输入流接收服务器的处理结果并给出提示 2 学员管理系统的功能 1当项目启动时将文件中的所有学员账户信息全部读取出来放到一个 List 集合中。 2客户端输入要增加学员的用户名和密码信息通过对象输出流发送给服务器。 3服务器接收客户端发来的消息判断集合中是否存在该学员账户信息并实现具体添加功能。 (4)服务器将增加学员功能的处理结果发送给客户端客户端给出对应的提示。 (5)当项目退出时将集合中的所有学员账户信息整体写入到文件中 服务器的初始化和关闭以及测试 客户端的初始化和关闭以及测试 客户端主界面的绘制和测试 break只是用来跳出switch嘛循环是不是结束不了那我要想真正的退出是不是应该把这个方法都结束了所以我用return可以结束这个方法 客户端扫描器工具类的封装 我们的客户端主界面其实已经绘制完了。但是这里面呢遗留了一个小小的问题什么问题就是我们扫描器创建完了但是没有关闭。对不对那有的小伙伴呢在想说那简单呀那就在这个switch的后面儿关了呗。那不行 我循环过来是不是还要用。有的说那放在循环的外面关呗那也不行因为return会直接把方法结束了。对不对而且我们这个扫描器啊不仅仅在当前主界面的绘制中要用到我们到了学员登录跟管理员儿登录的时候是不是也都得需要入这个用户名密码。那意味着我们的这个scanner是不都得用那既然这个scanner呢在我们客户端好多的地方呃都要用那这个时候我们如果说在每个地方都去new都去关闭。是不是那就太啰嗦了 又会出现代码的什么冗余那问大家怎么办呢这个时候其实我们是不是就可以把scanner提炼出来打包成一个工具类然后让所有的地方是不是都拿着这个工具类去用就可以了。 但这样写还是有问题的或者说不太完美为啥呢因为你如果这样写的话这个扫描器实际上是不是相当于是作为这个类的成员变量啊那要想访问这个扫描器我是不是又得new这个类对象那反而复杂了嘛所以这个时候应该加一个static关键字之后意味着隶属于类层级我们要再访问的时候是不是类名点访问就可以了。对不对但是因为我们学了封装之后啊就得private。啊private就得封装。封装的话意味着在类外是不是就不能直接使用了那怎么办提供公有的get方法呗。public static然后叫scanner然后get哎scanner。 可以吗好然后呢紧接着一段大括号里面returns c呗这不就行了吗对不对哎这儿写错了啊不是system叫scanner。对不对好了然后这儿写一下注释。叫编程实现扫描器或者说叫这样叫自定义成员方法方法。实现扫描器的返回或者说获取。可以吧 那这里面的return是不是返回的就是扫描器啊当然除了它之外我们说扫描器还得需要怎么办关闭叫自定义成员方法实现扫描器的关闭。 客户端将管理员相关信息发送出去 我们在这里面再封装一个方法进行调用。 有同学为啥报错了呀当然报错了因为这个方法我们并没有写嘛我只是在这是不是调用啊那怎么办根据错误提示是不是创建一个这样的方法就行了好 然后一点你看这不就创建完了吗而且默认的这个方法是不是私有私有的意思就是说这个方法只能在本类中使用不能在类外中使用而且这个方法确实是在我本类中的方法中调用所以我用private是没问题。 当客户端发来的消息类型为 managerCheck 时则表示要实现管理员账户信息的校验功 能。 当客户端发来的消息类型为userCheck 时则表示要实现学员账户信息的校验功能。 因为上面两句话需要创建User类和 UserMessage类 另外问一下大家user这个类需不需要进行客户端就是user类型的对象要不要在客户端跟服务器之间传输啊要。那传输而且用对象流传输那意味着我们是不是就得需要实现一个接口java.io.Serializable。然后实现series里边接口之后是不是还得需要指定一个版本号。 这样一来我们的账号密码有了之后接下来我们说是不是加上消息类型一起打包成一个user message类型对象。 而对象输出流在我们的哪个类中collect in it close里面而且还是私有的外面能直接用吗不能用为了让外面能用是不还得提供get方法所以out insert这里面选择生成get方法给谁啊给这两个输出输出流提供get方法是不是就可以了。 但要调这个get方法是不是又得拿着这个类的对象引用点儿是不是才能调。怎么办合成复用原则。那有了这个cic之后那现在我们是不是就可以拿到这个输出流。 就是我原来在collect view这个类中没有写构造方法的时候所以我用无参的方式new对象没问题但是现在我在这里面实际上是不是写了构造之后编译器就不再提供了而且是有参构造参数要的是collect in it close类型引用。所以这边new对象的时候是不是就得传参数穿一个cic就行了。 服务器接收客户端发来的消息并打印 那接下来我们是不是该实现服务器啊使用对象数流接收客户端发来的这个对象相关的信息呀。在我们服务器端啊啊server的上面儿你有一个新的类你这个类的名字叫什么呢客户端不是叫clientview吗那我们服务器这边呢我们就叫server view。 这里面简单写一下注释叫编程实现服务器的主功能当然它没有主界面嘛所以我们就叫主功能吧。好然后呢在这里面呢我们写一下方法叫自定义成员方法方法 然后实现客户端发来消息的接收并处理。 然后接下来写一下这个方法吧那方法名儿我们就叫serverReceive然后紧接着那这边儿的话呢要想接收就得用对象输入流而对象输入流是不是在server init close这里面对不对好那在server int close这里面的话而且这里面是不是还是私有的 要想用还得公有的get方法。提供了get方法之后紧接着切回来这边是不还得使用合成复用原则。 当然默认生成的是不是object呀但其实那边发的是不是应该是一个user message类型的对不对那我就用user message去接这是它真实的数据类型那这块儿报错是因为有异常抛一下。然后呢这儿还报错是因为我们是不是要做一个类型转换呀因为这里面默认返回的是object我现在用user message接嘛。对不对好了那么接完之后呢你看这样一来我们这边儿的这个接收就完事儿。 服务器校验后发送给客户端 客户端接收结果并打印