2025年2月27日11:48:15 多路由模式
parent
d32086be0b
commit
89025e4c34
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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); //为消息添加具体的处理逻辑
|
||||
|
||||
}
|
||||
|
|
@ -18,5 +18,5 @@ public interface Server {
|
|||
public void Serve();
|
||||
|
||||
//路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用
|
||||
public void AddRouter( Router router);
|
||||
public void AddRouter( int msgId,Router router);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue