- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
投票协议之构建和解析协议消息
投票协议之构建和解析协议消息
来源:华岳 HYPERLINK / 刷票 HYPERLINK
我们来看一个简单的例子,对在实现别人定义的协议时可能用到的技术进行了介绍。这个例子程序是一个简单的投票协议,如图3.2所示。这里,一个客户端向服务器发送了一个请求消息,消息中包含了一个候选人ID,范围是0至1000。
Vote Reques:投票请求, Candidate:候选人,Vote Count:选票总数
程序支持两种请求。一种是查询(inquiry),即向服务器询问给定候选人当前获得的投票总数。服务器发回一个响应消息,包含了原来的候选人ID和该候选人当前(查询请求收到时)获得的选票总数。另一种是投票(voting)请求,即向指定候选人投一票。服务器对这种请求也发回响应消息,包含了候选人ID和其获得的选票数(包括了刚投的一票)。
在实现一个协议时,定义一个专门的类来存放消息中所包含的信息是大有裨益的。该类提供了操作消息中的字段的方法--同时用来维护不同字段之间的不变量。在我们的例子中,客户端和服务器端发送的消息都非常简单,它们唯一的区别是服务器端发送的消息包含了选票总数和一个表示响应消息(不是请求消息)的标志。因此,我们可以用一个类来表示客户端和服务器端的两种消息。VoteMsg.java类展示了每条消息中的基本信息:
布尔值isInquiry,其值为true时表示该消息是查询请求(为false时表示该消息是投票信息);
布尔值isResponse,指示该消息是响应(由服务器发送)还是请求;
整型变量candidateID指示了候选人的ID;
长整型变量voteCount指示出所查询的候选人获得的总选票数。
这个类还维护了以下字段间的不变量:
candidateID的范围是0到1000。
voteCount在响应消息中只能是一个非零值(isResponse为true)。
voteCount不能为负数。
VoteMsg.java
0 public class VoteMsg {
1 private boolean isInquiry; // true if inquiry; false if
vote
2 private boolean isResponse;// true if response from
server
3 private int candidateID; // in [0,1000]
4 private long voteCount; // nonzero only in response
5
6 public static final int MAX_CANDIDATE_ID = 1000;
7
8 public VoteMsg(boolean isResponse, boolean isInquiry,
int candidateID, long voteCount)
9 throws IllegalArgumentException {
10 // check invariants
11 if (voteCount != 0 !isResponse) {
12 throw new IllegalArgumentException(Request vote count
must be zero);
13 }
14 if (candidateID 0 || candidateID MAX_CANDIDATE_ID)
{
15 throw new IllegalArgumentException(Bad Candidate ID:
+ candidateID);
16 }
17 if (voteCount 0) {
18 throw new IllegalArgumentException(Total must be =
zero);
19 }
20 this.candidateID = candidateID;
21 this.isResponse = isResponse;
22 this.isInquiry = isInquiry;
23 this.voteCount = voteCount;
24 }
25
26 public void setInquiry(boolean isInquiry) {
27 this.isInquiry = isInquiry;
28 }
29
30 public void setResponse(boolean isResponse) {
31 this.isResponse = isResponse;
32 }
33
34 public boolean isInquiry() {
35 return isInquiry;
36 }
37
38
文档评论(0)