首先先引入一个配置文件
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方法来关闭信息通道。