diff --git a/src/main/java/com/zhangmeng/TcpApplication.java b/src/main/java/com/zhangmeng/TcpApplication.java index a46ed1d..e08745d 100644 --- a/src/main/java/com/zhangmeng/TcpApplication.java +++ b/src/main/java/com/zhangmeng/TcpApplication.java @@ -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(); } } diff --git a/src/main/java/com/zhangmeng/service/MsgHandle.java b/src/main/java/com/zhangmeng/service/MsgHandle.java new file mode 100644 index 0000000..d5e1987 --- /dev/null +++ b/src/main/java/com/zhangmeng/service/MsgHandle.java @@ -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); //为消息添加具体的处理逻辑 + +} diff --git a/src/main/java/com/zhangmeng/service/Server.java b/src/main/java/com/zhangmeng/service/Server.java index cf20230..7bcbba6 100644 --- a/src/main/java/com/zhangmeng/service/Server.java +++ b/src/main/java/com/zhangmeng/service/Server.java @@ -18,5 +18,5 @@ public interface Server { public void Serve(); //路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用 - public void AddRouter( Router router); + public void AddRouter( int msgId,Router router); } diff --git a/src/main/java/com/zhangmeng/service/impl/ConnectionImpl.java b/src/main/java/com/zhangmeng/service/impl/ConnectionImpl.java index 598f9c6..b13350a 100644 --- a/src/main/java/com/zhangmeng/service/impl/ConnectionImpl.java +++ b/src/main/java/com/zhangmeng/service/impl/ConnectionImpl.java @@ -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; + } } diff --git a/src/main/java/com/zhangmeng/service/impl/HelloRouter.java b/src/main/java/com/zhangmeng/service/impl/HelloRouter.java new file mode 100644 index 0000000..c960bbf --- /dev/null +++ b/src/main/java/com/zhangmeng/service/impl/HelloRouter.java @@ -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(); + } + } +} diff --git a/src/main/java/com/zhangmeng/service/impl/MsgHandleImpl.java b/src/main/java/com/zhangmeng/service/impl/MsgHandleImpl.java new file mode 100644 index 0000000..bceedae --- /dev/null +++ b/src/main/java/com/zhangmeng/service/impl/MsgHandleImpl.java @@ -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 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 getApis() { + return apis; + } +} diff --git a/src/main/java/com/zhangmeng/service/impl/ServerImpl.java b/src/main/java/com/zhangmeng/service/impl/ServerImpl.java index 5484304..3aefdaa 100644 --- a/src/main/java/com/zhangmeng/service/impl/ServerImpl.java +++ b/src/main/java/com/zhangmeng/service/impl/ServerImpl.java @@ -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 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; } - - }