2025年2月27日11:48:15 多路由模式

master
qmstyle 2025-02-27 11:48:37 +08:00
parent d32086be0b
commit 89025e4c34
7 changed files with 141 additions and 18 deletions

View File

@ -1,5 +1,8 @@
package com.zhangmeng;
import com.zhangmeng.service.MsgHandle;
import com.zhangmeng.service.impl.HelloRouter;
import com.zhangmeng.service.impl.MsgHandleImpl;
import com.zhangmeng.service.impl.PingRouter;
import com.zhangmeng.service.impl.ServerImpl;
import com.zhangmeng.utils.Globalobj;
@ -31,7 +34,11 @@ public class TcpApplication {
config.setPort(instance.getTcpPort());
ServerImpl server = new ServerImpl();
server.setConfig(config);
server.AddRouter(new PingRouter());
MsgHandle msgHandle =new MsgHandleImpl();
server.setMsgHandle(msgHandle);
server.AddRouter(0,new PingRouter());
server.AddRouter(1,new HelloRouter());
server.Start();
}
}

View File

@ -0,0 +1,14 @@
package com.zhangmeng.service;
/**
* @author zm
* @date 2025/2/27 11:20
* @version: 1.0
*/
public interface MsgHandle {
public void DoMsgHandler(Request request); //马上以非阻塞方式处理消息
public void AddRouter(int msgId, Router router); //为消息添加具体的处理逻辑
}

View File

@ -18,5 +18,5 @@ public interface Server {
public void Serve();
//路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用
public void AddRouter( Router router);
public void AddRouter( int msgId,Router router);
}

View File

@ -36,7 +36,8 @@ public class ConnectionImpl implements Connection {
boolean ExitBuffChan;
//该连接的处理方法router
private Router router;
// private Router router;
private MsgHandle msgHandler;
private BufferedReader reader;
private BufferedWriter writer;
@ -45,13 +46,14 @@ public class ConnectionImpl implements Connection {
//创建连接的方法
public ConnectionImpl(Socket conn, int connID, Router router) {
public ConnectionImpl(Socket conn, int connID, MsgHandle msgHandler) {
this.Conn = conn;
this.ConnID = connID;
this.isClosed = false;
// this.handleAPI = callback_api;
this.ExitBuffChan = false;
this.router = router;
// this.router = router;
this.msgHandler = msgHandler;
try {
this.inputStream = conn.getInputStream();
@ -124,9 +126,11 @@ public class ConnectionImpl implements Connection {
//构建request对象,并调用router的PreHandle,Handle,PostHandle方法
Request request = new RequestImpl(this, unpack);
this.router.PreHandle(request);
this.router.Handle(request);
this.router.PostHandle(request);
// this.router.PreHandle(request);
// this.router.Handle(request);
// this.router.PostHandle(request);
this.msgHandler.DoMsgHandler(request);
// log.info("recv buf : " + str);
// writer.write("\n");
@ -214,4 +218,12 @@ public class ConnectionImpl implements Connection {
public void setExitBuffChan(boolean exitBuffChan) {
ExitBuffChan = exitBuffChan;
}
public MsgHandle getMsgHandler() {
return msgHandler;
}
public void setMsgHandler(MsgHandle msgHandler) {
this.msgHandler = msgHandler;
}
}

View File

@ -0,0 +1,32 @@
package com.zhangmeng.service.impl;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.zhangmeng.service.Request;
import com.zhangmeng.utils.ByteBufferUtil;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
/**
* @author zm
* @date 2025/2/27 11:35
* @version: 1.0
*/
public class HelloRouter extends BaseRouterImpl {
private final Log log = LogFactory.get();
@Override
public void Handle(Request request) {
log.info("Call HelloZinxRouter Handle");
//先读取客户端的数据再回写ping...ping...ping
log.info("recv from client : msgId={}, data={}", request.GetMsgID(), new String(request.GetData(), StandardCharsets.UTF_8));
try {
OutputStream outputStream = request.GetConnection().GetTCPConnection().getOutputStream();
ByteBufferUtil.sendMsg(1, "Hello Zinx Router V0.6".getBytes(), outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,49 @@
package com.zhangmeng.service.impl;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.zhangmeng.service.MsgHandle;
import com.zhangmeng.service.Request;
import com.zhangmeng.service.Router;
import java.util.HashMap;
import java.util.Map;
/**
* @author zm
* @date 2025/2/27 11:21
* @version: 1.0
*/
public class MsgHandleImpl implements MsgHandle {
private final Log log = LogFactory.get();
private final Map<Integer, Router> apis = new HashMap<>();//存放每个MsgId 所对应的处理方法的map属性
@Override
public void DoMsgHandler(Request request) {
Router handler = this.apis.get(request.GetMsgID());
//执行对应处理方法
handler.PreHandle(request);
handler.Handle(request);
handler.PostHandle(request);
}
@Override
public void AddRouter(int msgId, Router router) {
//1 判断当前msg绑定的API处理方法是否已经存在
Router oldRouter = this.apis.get(msgId);
if (oldRouter!= null){
log.error("repeated api,msgId = "+ msgId);
}
//2 添加msg与api的绑定关系
this.apis.put(msgId, router);
log.info("Add api msgId = ", msgId);
}
public Map<Integer, Router> getApis() {
return apis;
}
}

View File

@ -12,6 +12,7 @@ import cn.hutool.socket.aio.SimpleIoAction;
import com.zhangmeng.callBack.HandlerApiCallBack;
import com.zhangmeng.handler.ClientHandler;
import com.zhangmeng.service.Connection;
import com.zhangmeng.service.MsgHandle;
import com.zhangmeng.service.Router;
import com.zhangmeng.service.Server;
@ -42,7 +43,8 @@ public class ServerImpl implements Server {
private BufferedReader in;
private Router router; //当前Server由用户绑定的回调router,也就是Server注册的链接对应的处理业务
//private Router router; //当前Server由用户绑定的回调router,也就是Server注册的链接对应的处理业务
private MsgHandle msgHandle; //当前Server的消息管理模块用来绑定MsgId和对应的处理方法
public static Map<String, Socket> socketList = new HashMap<>();
@ -62,7 +64,7 @@ public class ServerImpl implements Server {
log.info("key=====================================: " + key);
//new ClientHandler(accept).start();
log.info("[ACCEPT] Accept a client at IP: {}, Port {}", accept.getInetAddress().getHostAddress(), accept.getPort());
Connection conn = new ConnectionImpl(accept,cid,this.router);
Connection conn = new ConnectionImpl(accept,cid,this.msgHandle);
conn.Start();
cid++;
}
@ -89,8 +91,8 @@ public class ServerImpl implements Server {
}
@Override
public void AddRouter(Router router) {
this.router = router;
public void AddRouter(int msgId, Router router) {
this.msgHandle.AddRouter(msgId, router);
log.info("[ADD ROUTER] Add a router to server");
}
@ -143,13 +145,20 @@ public class ServerImpl implements Server {
}
}
public Router getRouter() {
return router;
// public Router getRouter() {
// return router;
// }
//
// public void setRouter(Router router) {
// this.router = router;
// }
public MsgHandle getMsgHandle() {
return msgHandle;
}
public void setRouter(Router router) {
this.router = router;
public void setMsgHandle(MsgHandle msgHandle) {
this.msgHandle = msgHandle;
}
}