1 在线考试系统
因为我们刚提到客户端的主要作用,实际上就是提供一个界面,让用户选择。那用户根据这个界面呢进行选择,而真正的这个选择之后的业务处理实际上,是不还得交给服务器来实现真正的功能处理?
这有点像我们现实中的什么呢?ATM机。就是我们取钱的时候,可能是通过ATM机来取款。但是我们的这个账户信息,我们的个人账户信息是在ATM机里面存着吗?当然不是,对不对?
那ATM机坏了,岂不是我们的账说不清了吗?那在哪儿啊?哎,这个我们的这个账户信息实际上实际上是不是都在后台的服务器


我们的客户端主界面其实已经绘制完了。但是这里面呢,遗留了一个小小的问题,什么问题就是我们扫描器创建完了,但是没有关闭。对不对?那有的小伙伴呢?在想说那简单呀,那就在这个switch的后面儿关了呗。那不行,
我循环过来,是不是还要用。有的说那放在循环的外面关呗?那也不行,因为return会直接把方法结束了。对不对?而且我们这个扫描器啊,不仅仅在当前主界面的绘制中要用到,我们到了学员登录跟管理员儿登录的时候,是不是也都得需要入这个用户名密码。那意味着我们的这个scanner是不都得用?那既然这个scanner呢?在我们客户端好多的地方呃,都要用,那这个时候我们如果说在每个地方都去new都去关闭。是不是那就太啰嗦了,
又会出现代码的什么冗余,那问大家怎么办呢?这个时候其实我们是不是就可以把scanner提炼出来,打包成一个工具类,然后让所有的地方是不是都拿着这个工具类去用就可以了。
但这样写还是有问题的,或者说不太完美,为啥呢?因为你如果这样写的话,这个扫描器实际上是不是相当于是作为这个类的成员变量啊?那要想访问这个扫描器,我是不是又得new这个类对象,那反而复杂了嘛,所以这个时候应该加一个static关键字之后,意味着隶属于类层级,我们要再访问的时候是不是类名点访问就可以了。对不对?但是因为我们学了封装之后啊,就得private。啊private就得封装。封装的话,意味着在类外是不是就不能直接使用了?那怎么办?提供公有的get方法呗。public static,然后叫scanner,然后get哎scanner。
可以吗?好,然后呢?紧接着一段大括号里面returns c呗,这不就行了吗?对不对哎?这儿写错了啊,不是system叫scanner。对不对?好了,然后这儿写一下注释。叫编程实现扫描器,或者说叫这样叫自定义成员方法方法。实现扫描器的返回或者说获取。可以吧,
那这里面的return是不是返回的就是扫描器啊?当然,除了它之外,我们说扫描器还得需要怎么办?关闭叫自定义成员方法,实现扫描器的关闭。
客户端将管理员相关信息发送出去
我们在这里面再封装一个方法进行调用。
有同学为啥报错了呀?当然报错了,因为这个方法我们并没有写嘛,我只是在这是不是调用啊?那怎么办?根据错误提示,是不是创建一个这样的方法就行了?好,
然后一点,你看这不就创建完了吗?而且默认的这个方法是不是私有,私有的意思就是说这个方法只能在本类中使用,不能在类外中使用,而且这个方法确实是在我本类中的方法中调用,所以我用private是没问题。
另外问一下大家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接嘛。对不对?好了,那么接完之后呢?你看这样一来,我们这边儿的这个接收就完事儿。
服务器校验后发送给客户端
客户端接收结果并打印