(JAVASE)CSFrameWork详解(communication层及笼统概述)

首先先引入一个配置文件

public interface INetConfig {
	String ip = "127.0.0.1";
	int port = 54123;
	
	default void close(InputStream is, OutputStream os, Socket socket) {
		if (null != is) {
			try {
				is.close();
			} catch (IOException e) {
			} finally {
				is = null;
			}
		}
		if (null != os) {
			try {
				os.close();
			} catch (IOException e) {
			} finally {
				os = null;
			}
		}
		
		if (null != socket && !socket.isClosed()) {
			try {
				socket.close();
			} catch (IOException e) {
			} finally {
				socket = null;
			}
		}
	}
}

其中包含ip,端口及一个经常使用的close方法用于关闭通信信道。

作为框架最底层,其应该只包含最基本的操作,如信息在通道间的往来,通道的关闭。其具体得到信息的处理操作不应由底层实现,先用抽象方法来留给上层实现。

对于CSFrameWork来说,总共分为五个大块,client、clientConversation、server、serverConversation、communication.
而其中每个客户有一套(client、clientConversation、communication)
每个客户端有一套(server、serverConversation、communication)

而实际用于通信时,由上层client→clientConversation→communication(客户端)→communication(服务端)serverConversation→server

可以看出每当建立一个通信,需要两个communication完成客户端与服务端的信息传递。

首先底层包括

	protected Socket socket;
	
	protected DataInputStream dis;
	protected DataOutputStream dos;
	
	protected boolean running;
	protected boolean listening;

其中两个Boolean一个running表示是否正在运行,listening表示是否处在监听的状态。
其中socket可以看做为信息交互的主战场(信息入口、出口)这点由构造方法可以看出:
构造:

public Communication(Socket socket) throws IOException {
		this.socket = socket;
		
		this.dis = new DataInputStream(socket.getInputStream());
		this.dos = new DataOutputStream(socket.getOutputStream());
		
		this.running = true;
		this.listening = false;
		
		new Thread(this).start();
	}

数据输入输出流都是从各自的socket中取出,在实例化communication时,当前对象就已经开始运行了,但是并不处于监听状态。
基于之前的线程编程基础结合CSFrameWork,无论客户端还是服务端,底层都是communication,所以从communication建立开始就应该单独线程控制。

信息发送:

public void send(NetMessage message) {
		try {
			this.dos.writeUTF(message.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

通过dos发送数据。

信息接受:

@Override
	public void run() {
		String message;
		this.listening = true;
		while (running) {
			try {
				message = this.dis.readUTF();
				dealNetMessage(new NetMessage(message));
			} catch (IOException e) {
				if (running) {
					running = false;
					dealAbnormalDrop();
				}
			}
		}
	}

与信息发送不同,信息接受是一个被动状态,我们需要在信息传达过来时候及时接收到。当开始进入准备接收信息状态时,才是进入了监听状态。

未完成:

	public abstract void dealNetMessage(NetMessage netMessage);
	public abstract void dealAbnormalDrop();

两个抽象方法,这两个方法并不是底层就该实现的,就算想实现,在底层也没有办法遇见上层会做什么具体操作。
以及客户端对应服务端异常掉线、服务端对应客户端异常掉线操作都是各不相同的。

关闭:

protected void close() {
		this.running = false;
		this.listening = false;
		
		close(this.dis, this.dos, this.socket);
	}

首先将监听状态退出,运行结束,调用close方法来关闭信息通道。

上一篇:Java TCP & UDP 代码示例


下一篇:第一章 sysrepod概述