概述
CSFramework是一套于客户端/服务器端的通信框架。客户端与服务器端进行完整交流的前提是要有一套应用层协议。本项目将框架分为三层体系:
- 通信层:主要负责客户端/服务器端消息的收发。
- 会话层:对消息进行解析,按照约定的应用层协议规范进行相应的处理。
- 最外层(Client/Server):主要给使用者提供一些操作入口。
通信层
核心类:下面的Communiaction类主要实现一个通信道路上的消息首发,至于具体消息如何处理则交付给会话层处理。
public abstract class Communication implements Runnable{
private Socket socket = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private volatile boolean goon; //控制线程执行的变量
public Communication(Socket socket) throws IOException {
this.socket = socket;
this.dis = new DataInputStream(socket.getInputStream());
this.dos = new DataOutputStream(socket.getOutputStream());
goon = true;
new Thread(this, "通信层").start();
}
public abstract void dealMessage(NetMessage netMessage);
public abstract void dealAbnormalDrop();
@Override
public void run() {
String message = null;
while(goon) {
try {
message = dis.readUTF();
//处理消息
dealMessage(new NetMessage(message));
} catch (IOException e) {
/*
* 连接如果断开会掉入异常
*/
if(goon == true) {
//处理对端异常掉线
dealAbnormalDrop();
}
goon = false;
}
}
}
public void sendMessage(NetMessage netMessage) {
try {
this.dos.writeUTF(netMessage.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() {
goon = false;
if(dis != null) {
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
dis = null;
}
}
if(dos != null) {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
dos = null;
}
}
if(socket != null && !socket.isClosed()) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
socket = null;
}
}
}
}
会话层能处理消息的前提是协议,如下则是一个表示应用层协议的类。这个类主要是将三个字段转化成字符串的形式并用‘&’分割开,而且可以由这种形式的字符串再反向解析出协议对象:
public class NetMessage {
private ENetCommand command; //消息类型的枚举
private String action; //用于处理请求与响应
private String message; //存储消息内容
public NetMessage() {}
//消息体由三部分组成,由&作为分隔符
public NetMessage(String data) {
String[] strArr = data.split("&");
this.command = ENetCommand.valueOf(strArr[0]);
this.action = strArr[1];
this.message = strArr[2];
}
public ENetCommand getCommand() {
return command;
}
public NetMessage setCommand(ENetCommand command) {
this.command = command;
return this;
}
public String getAction() {
return action;
}
public NetMessage setAction(String action) {
this.action = action;
return this;
}
public String getMessage() {
return message;
}
public NetMessage setMessage(String message) {
this.message = message;
return this;
}
@Override
public String toString() {
return command + "&" + action + "&" + message;
}
}
综上,一些基本的底层类准备好之后主要的实现就在于会话层和最外层了。
最后
以上就是风中美女为你收集整理的CSFramework(一)---通信层的全部内容,希望文章能够帮你解决CSFramework(一)---通信层所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复