C#-JudgeSystem判题系统-判题系统

运行环境: vs2013算法

框架: .net4.5服务器

上一次实验已经完成了判题核心的封装,接下来就是经过服务器后台调用判题系统对客户端传来的数据进行判断网络

根据前面的一些测试咱们创建新的解决方案来实现完整的判题系统多线程

首先第一步咱们先肯定客户端和服务器的交互流程并发

客户端的数据有三个:源代码,输入,输出框架

这时候到底怎么传到服务器的,有两个方法,一个是一次性传输,一个是分三次传输函数

一次性传输的话就要面临怎么切割这三种数据,必须定义一个分割符,并且数据也要面临转义的问题,到了服务器也须要进行解译,这样会消耗必定的资源高并发

但到底这三个数据是否是必定要一次性传输呢?其实并不用,由于这三个数据做用于不一样阶段而且能够单独分割开来,因此分三次传输实际上是能够的,而且每一个阶段均可以根据回传来判断判题的状态,出现错误是能够减小后面两次的传输,节省必定的宽带与内存测试

server              cilent优化

                        send:源代码

read:源代码

compile:源代码

send:编译结果

                        read:编译状况

                        若是成功

                        send:输入

read:输入

run:输入

send:运行状况

                         read:运行状况

                         若是程序成功运行结束未超时

                        send:输出

read:输出

比较输出

send:结果

                         read:结果

close                 close

作好流程设计后开始编码程序

因为把输入输出分离,因此类库接口须要改变适配,类库改变的成本较低,因此不采用改变调用

Unnamed QQ Screenshot20150804134628

分割实现

Unnamed QQ Screenshot20150804165614

第一步服务器读取源代码

编译,根据返回值来发送结果

Unnamed QQ Screenshot20150804165842

若是编译经过就继续向客户端读取测试输入

考虑到部分程序不须要输入因此接收到\r\n则看成无输入

因此不容许程序只那\r\n来做为测试输入,事实上也没什么意义这样的输入

虽然能够再增长一次交互来肯定程序是否提供无输入测试,但这里并无作这个操做

Unnamed QQ Screenshot20150804170611

若是能拿到结果不超时,则向客户端读取结果进行匹配

下面创建一个测试用的客户端项目

Unnamed QQ Screenshot20150804170807

客户端三次大循环往服务器发送消息

运行服务器,监听8080端口

Unnamed QQ Screenshot20150804171013

而后打开客户端进行链接

Unnamed QQ Screenshot20150804171106

而后打开客户端进行链接

Unnamed QQ Screenshot20150804171106

设置了30秒的超时

过了30秒客户端无发送数据的话,会主动关闭链接

Unnamed QQ Screenshot20150804171150

再次启动新的客户端测试

Unnamed QQ Screenshot20150804171503

语法错误的测试,会返回客户端1,表明false

Unnamed QQ Screenshot20150804171603

没有语法错误编译经过的则返回0

Unnamed QQ Screenshot20150804171916

测试第一部分经过则测试第二部分,输入部分,源程序应该输入两个数字空格,输出两个数字的和,但测试中我只输入一个数字,5秒后程序还没结束则返回false,服务器端能够看出缘由是超时

启动失败比较慢测试出来,还有一种多是正常非正常退出

Unnamed QQ Screenshot20150804172327

虽然输入是正确的,可是程序退出值不为0,看成错误处理,返回false

最后测试正确输出获得结果

Unnamed QQ Screenshot20150804172507

虽然输入正确也能获得结果了,可是不匹配,则返回false

Unnamed QQ Screenshot20150804172559

测试1+3=4能够经过,最后返回true,证实编译经过且结果正确

到此为止就完成了服务器程序的大部分功能了,并且异常机制与超时机制也能够保证服务器的运行

而后为了保证服务器的并发编译稳定性,测试程序将改为自动多线程并发执行判断结果是否经过

为了能遍历并发各类各样的状况,我把三个步骤的正确与错误作法写出用来作组合处理

Unnamed QQ Screenshot20150804181746

第一步,错误是少一个;分号

Unnamed QQ Screenshot20150804181752

第二步提供一下错误的输入

Unnamed QQ Screenshot20150804181758

第三部提供错误的结果

Unnamed QQ Screenshot20150804181804

check返回值,读取服务器的返回,0为true,1为false,每进行一步操做都要check一次看是否能匹配那次操做的返回值,不对应则为一次bug

线程函数已三个数字启动,作成字符串的形式

000表明三步为true

111表明第一步错误

011表明第二步错误

001表明第三步错误

Unnamed QQ Screenshot20150804182418

启动线程遍历四种状况,每10次启动线程读取一次bug次数

并发间隔是500ms

Unnamed QQ Screenshot20150804182418

启动线程遍历四种状况,每10次启动线程读取一次bug次数

并发间隔是500ms

Unnamed QQ Screenshot20150804181423 (1)

放置启动700次线程,理论上大部分线程都完成操做,没有发现任何的bug

后来将并发速度提高到100ms

程序运行很是快,cpu占用也到了80%左右

Unnamed QQ Screenshot20150804182714

短期运行下是没有任何的错误,服务器和客户端都没有崩溃

在进行上千次运算后

任务管理器中并无发现游离的进程

Unnamed QQ Screenshot20150804182926

在测试路径下发现大量的编译程序

该测试证实,服务器系统是稳健的,高并发的,而且能提供准确返回值的系统

固然此次测试是在可靠的传输环境下实现的,而在不可靠环境下或者网络环境较差的状况下,服务器只能依赖于自身的超时检测,在30秒内客户端无消息则关闭链接

在完善服务器的状况下,咱们继续实现客户端的GUI化

GUI部分简单复用一下原来第一个实验的代码,但须要增长输入输出框

简单修改一下

Unnamed QQ Screenshot20150804185802

里面一下控件有必要的写上变量名

Unnamed QQ Screenshot20150804185833

所幸的是textbox控件自带换行的功能,这个能够省去相似控制台的添加换行符的复杂问题,只须要将原来的控制台的程序代码复制一下,须要的数据改为从gui获取

Unnamed QQ Screenshot20150804190051

点击ui上面的判题按钮会触发judge函数

完成后咱们测试一下运行的效果

打开程序

Unnamed QQ Screenshot20150804190234

若是在没有源代码和输出的内容条件下,判题是不容许的

Unnamed QQ Screenshot20150804190629

无输入的判题(任意输入)

Unnamed QQ Screenshot20150804190809

服务器关闭的状况下

Unnamed QQ Screenshot20150804190913

会显示服务器链接错误

Unnamed QQ Screenshot20150804190957

源代码少一个分号,显示编译错误

Unnamed QQ Screenshot20150804191100

不进行正确输入,服务器会显示超时处理,客户端会显示错误的输入

Unnamed QQ Screenshot20150804191154

输入正确则判断结果,结果不正确则输出错误的结果

Unnamed QQ Screenshot20150804191232

结果正确,天然进入接受状态

对此已经完成客户端的基本功能,固然再错误的输入或者在算法复杂度较高的运算中,服务器未可以作出及时的相应,这时候就要作线程处理能够避免程序在等待过程当中表现的卡死现象,暂时不去实现这是优化性的功能,到此整个实验已经进行完毕

经过最后一个综合实验,整合每一个实验的内容,完善服务器功能与客户端的使用,在实验过程当中,对于服务器的稳健性等作了更深层的探索,而客户端部分还有一些线程级别的优化并无进行,有待实现,从开始的设计到各个部分的调整,也体会到知识综合应用的重要性,在这一次实验中并无过多新知识的掌握,更重要的是接口与测试部分的实现

相关文章
相关标签/搜索