投票协议之构建和解析协议消息来源:华岳刷票一个简单的例子,对在实现别人定义的协议时可能用到的技术进行了介绍。这个例子程序是一个简单的"投票"协议,。这里,一个客户端向服务器发送了一个请求消息,消息中包含了一个候选人ID,范围是0至1000。VoteReques:投票请求,Candidate:候选人,VoteCount:选票总数程序支持两种请求。一种是查询(inquiry),即向服务器询问给定候选人当前获得的投票总数。服务器发回一个响应消息,包含了原来的候选人ID和该候选人当前(查询请求收到时)获得的选票总数。另一种是投票(voting)请求,即向指定候选人投一票。服务器对这种请求也发回响应消息,包含了候选人ID和其获得的选票数(包括了刚投的一票)。在实现一个协议时,定义一个专门的类来存放消息中所包含的信息是大有裨益的。该类提供了操作消息中的字段的方法--同时用来维护不同字段之间的不变量。在我们的例子中,客户端和服务器端发送的消息都非常简单,它们唯一的区别是服务器端发送的消息包含了选票总数和一个表示响应消息(不是请求消息)的标志。因此,我们可以用一个类来表示客户端和服务器端的两种消息。:布尔值isInquiry,其值为true时表示该消息是查询请求(为false时表示该消息是投票信息);布尔值isResponse,指示该消息是响应(由服务器发送)还是请求;整型变量candidateID指示了候选人的ID;长整型变量voteCount指示出所查询的候选人获得的总选票数。这个类还维护了以下字段间的不变量:candidateID的范围是0到1000。voteCount在响应消息中只能是一个非零值(isResponse为true)。voteCount不能为负数。{1privatebooleanisInquiry;//trueifinquiry;falseifvote2privatebooleanisResponse;//trueifresponsefromserver3privateintcandidateID;//in[0,1000]4privatelongvoteCount;//nonzeroonlyinresponse56publicstaticfinalintMAX_CANDIDATE_ID=1000;78publicVoteMsg(booleanisResponse,booleanisInquiry,intcandidateID,longvoteCount)9throwsIllegalArgumentException{10//checkinvariants11if(voteCount!=0&&!isResponse){12thrownewIllegalArgumentException("Requestvotecountmustbezero");13}14if(candidateID<0||candidateID>MAX_CANDIDATE_ID){15thrownewIllegalArgumentException("BadCandidateID:"+candidateID);16}17if(voteCount<0){18thrownewIll
投票协议之构建和解析协议消息 来自淘豆网m.daumloan.com转载请标明出处.