运行环境: vs2013算法
框架: .net4.5服务器
上一次实验已经完成了判题核心的封装,接下来就是经过服务器后台调用判题系统对客户端传来的数据进行判断网络
根据前面的一些测试咱们创建新的解决方案来实现完整的判题系统多线程
首先第一步咱们先肯定客户端和服务器的交互流程并发
客户端的数据有三个:源代码,输入,输出框架
这时候到底怎么传到服务器的,有两个方法,一个是一次性传输,一个是分三次传输函数
一次性传输的话就要面临怎么切割这三种数据,必须定义一个分割符,并且数据也要面临转义的问题,到了服务器也须要进行解译,这样会消耗必定的资源高并发
但到底这三个数据是否是必定要一次性传输呢?其实并不用,由于这三个数据做用于不一样阶段而且能够单独分割开来,因此分三次传输实际上是能够的,而且每一个阶段均可以根据回传来判断判题的状态,出现错误是能够减小后面两次的传输,节省必定的宽带与内存测试
server cilent优化
send:源代码
read:源代码
compile:源代码
send:编译结果
read:编译状况
若是成功
send:输入
read:输入
run:输入
send:运行状况
read:运行状况
若是程序成功运行结束未超时
send:输出
read:输出
比较输出
send:结果
read:结果
close close
作好流程设计后开始编码程序
因为把输入输出分离,因此类库接口须要改变适配,类库改变的成本较低,因此不采用改变调用
分割实现
第一步服务器读取源代码
编译,根据返回值来发送结果
若是编译经过就继续向客户端读取测试输入
考虑到部分程序不须要输入因此接收到\r\n则看成无输入
因此不容许程序只那\r\n来做为测试输入,事实上也没什么意义这样的输入
虽然能够再增长一次交互来肯定程序是否提供无输入测试,但这里并无作这个操做
若是能拿到结果不超时,则向客户端读取结果进行匹配
下面创建一个测试用的客户端项目
客户端三次大循环往服务器发送消息
运行服务器,监听8080端口
而后打开客户端进行链接
而后打开客户端进行链接
设置了30秒的超时
过了30秒客户端无发送数据的话,会主动关闭链接
再次启动新的客户端测试
语法错误的测试,会返回客户端1,表明false
没有语法错误编译经过的则返回0
测试第一部分经过则测试第二部分,输入部分,源程序应该输入两个数字空格,输出两个数字的和,但测试中我只输入一个数字,5秒后程序还没结束则返回false,服务器端能够看出缘由是超时
启动失败比较慢测试出来,还有一种多是正常非正常退出
虽然输入是正确的,可是程序退出值不为0,看成错误处理,返回false
最后测试正确输出获得结果
虽然输入正确也能获得结果了,可是不匹配,则返回false
测试1+3=4能够经过,最后返回true,证实编译经过且结果正确
到此为止就完成了服务器程序的大部分功能了,并且异常机制与超时机制也能够保证服务器的运行
而后为了保证服务器的并发编译稳定性,测试程序将改为自动多线程并发执行判断结果是否经过
为了能遍历并发各类各样的状况,我把三个步骤的正确与错误作法写出用来作组合处理
第一步,错误是少一个;分号
第二步提供一下错误的输入
第三部提供错误的结果
check返回值,读取服务器的返回,0为true,1为false,每进行一步操做都要check一次看是否能匹配那次操做的返回值,不对应则为一次bug
线程函数已三个数字启动,作成字符串的形式
000表明三步为true
111表明第一步错误
011表明第二步错误
001表明第三步错误
启动线程遍历四种状况,每10次启动线程读取一次bug次数
并发间隔是500ms
启动线程遍历四种状况,每10次启动线程读取一次bug次数
并发间隔是500ms
放置启动700次线程,理论上大部分线程都完成操做,没有发现任何的bug
后来将并发速度提高到100ms
程序运行很是快,cpu占用也到了80%左右
短期运行下是没有任何的错误,服务器和客户端都没有崩溃
在进行上千次运算后
任务管理器中并无发现游离的进程
在测试路径下发现大量的编译程序
该测试证实,服务器系统是稳健的,高并发的,而且能提供准确返回值的系统
固然此次测试是在可靠的传输环境下实现的,而在不可靠环境下或者网络环境较差的状况下,服务器只能依赖于自身的超时检测,在30秒内客户端无消息则关闭链接
在完善服务器的状况下,咱们继续实现客户端的GUI化
GUI部分简单复用一下原来第一个实验的代码,但须要增长输入输出框
简单修改一下
里面一下控件有必要的写上变量名
所幸的是textbox控件自带换行的功能,这个能够省去相似控制台的添加换行符的复杂问题,只须要将原来的控制台的程序代码复制一下,须要的数据改为从gui获取
点击ui上面的判题按钮会触发judge函数
完成后咱们测试一下运行的效果
打开程序
若是在没有源代码和输出的内容条件下,判题是不容许的
无输入的判题(任意输入)
服务器关闭的状况下
会显示服务器链接错误
源代码少一个分号,显示编译错误
不进行正确输入,服务器会显示超时处理,客户端会显示错误的输入
输入正确则判断结果,结果不正确则输出错误的结果
结果正确,天然进入接受状态
对此已经完成客户端的基本功能,固然再错误的输入或者在算法复杂度较高的运算中,服务器未可以作出及时的相应,这时候就要作线程处理能够避免程序在等待过程当中表现的卡死现象,暂时不去实现这是优化性的功能,到此整个实验已经进行完毕
经过最后一个综合实验,整合每一个实验的内容,完善服务器功能与客户端的使用,在实验过程当中,对于服务器的稳健性等作了更深层的探索,而客户端部分还有一些线程级别的优化并无进行,有待实现,从开始的设计到各个部分的调整,也体会到知识综合应用的重要性,在这一次实验中并无过多新知识的掌握,更重要的是接口与测试部分的实现