Socket 构建和解析协议消息-- "投票"示例程序
来源:互联网 发布:matlab合并三个矩阵 编辑:程序博客网 时间:2024/06/05 19:55
介绍socket 的一个简单例子: "投票" 示例程序
网站代码: http://booksite.elsevier.com/9780123742551/?ISBN=9780123742551
这里用一个类来表示客户端和服务器端的两种消息. VoteMsg.java
package com.test;
public class VoteMsg {
private boolean isInquiry; // true 表示该消息是查询清,false 是投票请求
private boolean isResponse;// true 是响应,false 为请求
private int candidateID; // in [0,1000] 候选人的ID
private long voteCount; // 所查询的候选人获得的总选票数
public static final int MAX_CANDIDATE_ID = 1000;
public VoteMsg(boolean isResponse, boolean isInquiry, int candidateID, long voteCount)
throws IllegalArgumentException {
// check invariants
if (voteCount != 0 && !isResponse) {
throw new IllegalArgumentException("Request vote count must be zero");
}
if (candidateID < 0 || candidateID > MAX_CANDIDATE_ID) {
throw new IllegalArgumentException("Bad Candidate ID: " + candidateID);
}
if (voteCount < 0) {
throw new IllegalArgumentException("Total must be >= zero");
}
this.candidateID = candidateID;
this.isResponse = isResponse;
this.isInquiry = isInquiry;
this.voteCount = voteCount;
}
public void setInquiry(boolean isInquiry) {
this.isInquiry = isInquiry;
}
public void setResponse(boolean isResponse) {
this.isResponse = isResponse;
}
public boolean isInquiry() {
return isInquiry;
}
public boolean isResponse() {
return isResponse;
}
public void setCandidateID(int candidateID) throws IllegalArgumentException {
if (candidateID < 0 || candidateID > MAX_CANDIDATE_ID) {
throw new IllegalArgumentException("Bad Candidate ID: " + candidateID);
}
this.candidateID = candidateID;
}
public int getCandidateID() {
return candidateID;
}
public void setVoteCount(long count) {
if ((count != 0 && !isResponse) || count < 0) {
throw new IllegalArgumentException("Bad vote count");
}
voteCount = count;
}
public long getVoteCount() {
return voteCount;
}
public String toString() {
String res = (isInquiry ? "inquiry" : "vote") + " for candidate " + candidateID;
if (isResponse) {
res = "response to " + res + " who now has " + voteCount + " vote(s)";
}
return res;
}
}
还需要根据一定的协议来对其进行编码和解码。 VoteMsgCoder 接口提供了对投票消息进行序列化和反序列化的方法.
import java.io.IOException;
public interface VoteMsgCoder {
byte[] toWire(VoteMsg msg) throws IOException;
VoteMsg fromWire(byte[] input) throws IOException;
}
基于文本方式编码实现VoteMsgCoder接口 的类.
package com.test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class VoteMsgTextCoder implements VoteMsgCoder {
/*
* Wire Format "VOTEPROTO" <"v" | "i"> [<RESPFLAG>] <CANDIDATE> [<VOTECNT>]
* Charset is fixed by the wire format.
*/
// Manifest constants for encoding
public static final String MAGIC = "Voting";
public static final String VOTESTR = "v";
public static final String INQSTR = "i";
public static final String RESPONSESTR = "R";
public static final String CHARSETNAME = "US-ASCII";
public static final String DELIMSTR = " ";
public static final int MAX_WIRE_LENGTH = 2000;
public byte[] toWire(VoteMsg msg) throws IOException {
String msgString = MAGIC + DELIMSTR + (msg.isInquiry() ? INQSTR : VOTESTR)
+ DELIMSTR + (msg.isResponse() ? RESPONSESTR + DELIMSTR : "")
+ Integer.toString(msg.getCandidateID()) + DELIMSTR
+ Long.toString(msg.getVoteCount());
byte data[] = msgString.getBytes(CHARSETNAME);
return data;
}
public VoteMsg fromWire(byte[] message) throws IOException {
ByteArrayInputStream msgStream = new ByteArrayInputStream(message);
Scanner s = new Scanner(new InputStreamReader(msgStream, CHARSETNAME));
boolean isInquiry;
boolean isResponse;
int candidateID;
long voteCount;
String token;
try {
token = s.next();
if (!token.equals(MAGIC)) {
throw new IOException("Bad magic string: " + token);
}
token = s.next();
if (token.equals(VOTESTR)) {
isInquiry = false;
} else if (!token.equals(INQSTR)) {
throw new IOException("Bad vote/inq indicator: " + token);
} else {
isInquiry = true;
}
token = s.next();
if (token.equals(RESPONSESTR)) {
isResponse = true;
token = s.next();
} else {
isResponse = false;
}
// Current token is candidateID
// Note: isResponse now valid
candidateID = Integer.parseInt(token);
if (isResponse) {
token = s.next();
voteCount = Long.parseLong(token);
} else {
voteCount = 0;
}
} catch (IOException ioe) {
throw new IOException("Parse error...");
}
return new VoteMsg(isResponse, isInquiry, candidateID, voteCount);
}
}
- Socket 构建和解析协议消息-- "投票"示例程序
- 投票协议:构建和解析协议消息
- TCP/IP构建和解析协议消息
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- 第四篇:JAVA网络编程之构建和解析自定义协议消息(含代码)
- C语言编写基于TCP和UDP协议的Socket通信程序示例
- 投票协议:发送和接收
- Lodrunner Socket协议中获取发送消息长度和内容
- 消息队列示例程序
- socket通信示例程序
- 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)
- 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)
- Python socket 简单示例程序
- perl socket 聊天程序示例
- socket解析http协议头
- oracle 透明网关(oracle database gateway)介绍
- error: field `list' has incomplete type的解决!:) [复制链接] 00
- Linux命令:ping
- 程序员面试问题(三)
- HDU 1203 I NEED A OFFER! 01背包 dp
- Socket 构建和解析协议消息-- "投票"示例程序
- Java 垃圾收集与内存分配
- Linux命令:traceroute
- Linux用户及用户组设置
- LeetCode-Simplify Path
- hdu fast food(1227)
- BZOJ 1083: [SCOI2005]繁忙的都市
- 对数组中的自定义的类型根据姓名,年龄排序(升序, 降序)sortedArrayUsingSelector
- OllyDbg 使用笔记 (六)