我是靠谱客的博主 风中美女,最近开发中收集的这篇文章主要介绍CSFramework(一)---通信层,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

CSFramework是一套于客户端/服务器端的通信框架。客户端与服务器端进行完整交流的前提是要有一套应用层协议。本项目将框架分为三层体系:

  1. 通信层:主要负责客户端/服务器端消息的收发。
  2. 会话层:对消息进行解析,按照约定的应用层协议规范进行相应的处理。
  3. 最外层(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(一)---通信层所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部