欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-25 20:22:28
...

首先先引入一个配置文件

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方法来关闭信息通道。

相关标签: 实训