2025-02-21 09:24:05 +00:00
|
|
|
package com.zhangmeng.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.io.BufferUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import cn.hutool.log.Log;
|
|
|
|
|
import cn.hutool.log.LogFactory;
|
|
|
|
|
import cn.hutool.log.StaticLog;
|
|
|
|
|
import cn.hutool.socket.aio.AioServer;
|
|
|
|
|
import cn.hutool.socket.aio.AioSession;
|
|
|
|
|
import cn.hutool.socket.aio.SimpleIoAction;
|
2025-02-22 07:38:53 +00:00
|
|
|
import com.zhangmeng.callBack.HandlerApiCallBack;
|
2025-02-21 09:24:05 +00:00
|
|
|
import com.zhangmeng.handler.ClientHandler;
|
2025-02-22 07:38:53 +00:00
|
|
|
import com.zhangmeng.service.Connection;
|
2025-02-22 08:47:52 +00:00
|
|
|
import com.zhangmeng.service.Router;
|
2025-02-21 09:24:05 +00:00
|
|
|
import com.zhangmeng.service.Server;
|
|
|
|
|
|
|
|
|
|
import java.io.*;
|
|
|
|
|
import java.net.ServerSocket;
|
|
|
|
|
import java.net.Socket;
|
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
|
import java.nio.charset.Charset;
|
|
|
|
|
import java.nio.charset.StandardCharsets;
|
2025-02-22 07:38:53 +00:00
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
2025-02-21 09:24:05 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author zm
|
|
|
|
|
* @date 2025/2/21 15:04
|
|
|
|
|
* @version: 1.0
|
|
|
|
|
*/
|
|
|
|
|
public class ServerImpl implements Server {
|
|
|
|
|
|
|
|
|
|
private final Log log = LogFactory.get();
|
|
|
|
|
|
|
|
|
|
private Config config;
|
|
|
|
|
|
|
|
|
|
private ServerSocket serverSocket;
|
|
|
|
|
|
2025-02-22 07:38:53 +00:00
|
|
|
private BufferedReader in;
|
|
|
|
|
|
2025-02-22 08:47:52 +00:00
|
|
|
private Router router; //当前Server由用户绑定的回调router,也就是Server注册的链接对应的处理业务
|
|
|
|
|
|
2025-02-22 07:38:53 +00:00
|
|
|
public static Map<String, Socket> socketList = new HashMap<>();
|
|
|
|
|
|
2025-02-21 09:24:05 +00:00
|
|
|
@Override
|
|
|
|
|
public void Start() {
|
2025-02-22 09:25:00 +00:00
|
|
|
log.info("[START] Server listenner at Name: {}, IPVersion {}, is starting", config.getName(), config.getIPVersion());
|
2025-02-21 09:24:05 +00:00
|
|
|
log.info("[START] Server listenner at IP: {}, Port {}, is starting", config.getIP(), config.getPort());
|
|
|
|
|
try {
|
|
|
|
|
serverSocket = new ServerSocket(config.getPort());
|
|
|
|
|
|
2025-02-22 07:38:53 +00:00
|
|
|
int cid = 0;
|
|
|
|
|
|
2025-02-21 09:24:05 +00:00
|
|
|
while (true) {
|
|
|
|
|
Socket accept = serverSocket.accept();
|
2025-02-22 07:38:53 +00:00
|
|
|
String key = accept.getInetAddress().getHostAddress() + ":" + accept.getPort();
|
|
|
|
|
socketList.put(key, accept);
|
|
|
|
|
log.info("key=====================================: " + key);
|
|
|
|
|
//new ClientHandler(accept).start();
|
2025-02-21 09:24:05 +00:00
|
|
|
log.info("[ACCEPT] Accept a client at IP: {}, Port {}", accept.getInetAddress().getHostAddress(), accept.getPort());
|
2025-02-22 08:47:52 +00:00
|
|
|
Connection conn = new ConnectionImpl(accept,cid,this.router);
|
2025-02-22 07:38:53 +00:00
|
|
|
conn.Start();
|
|
|
|
|
cid++;
|
2025-02-21 09:24:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
2025-02-22 07:38:53 +00:00
|
|
|
// throw new RuntimeException(e);
|
|
|
|
|
log.error(e.getMessage());
|
2025-02-21 09:24:05 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void Stop() {
|
|
|
|
|
log.info("[STOP] Server listenner at IP: {}, Port {}, is stoped", config.getIP(), config.getPort());
|
|
|
|
|
try {
|
|
|
|
|
serverSocket.close();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void Serve() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-22 08:47:52 +00:00
|
|
|
@Override
|
|
|
|
|
public void AddRouter(Router router) {
|
|
|
|
|
this.router = router;
|
|
|
|
|
log.info("[ADD ROUTER] Add a router to server");
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-21 09:24:05 +00:00
|
|
|
public void setConfig(Config config) {
|
|
|
|
|
this.config = config;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class Config {
|
|
|
|
|
//服务器的名称
|
|
|
|
|
private String Name;
|
|
|
|
|
|
|
|
|
|
//tcp4 or other
|
|
|
|
|
private String IPVersion;
|
|
|
|
|
|
|
|
|
|
//服务绑定的IP地址
|
|
|
|
|
private String IP;
|
|
|
|
|
//服务绑定的端口
|
|
|
|
|
private int Port;
|
|
|
|
|
|
|
|
|
|
public String getName() {
|
|
|
|
|
return Name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setName(String name) {
|
|
|
|
|
Name = name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getIPVersion() {
|
|
|
|
|
return IPVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setIPVersion(String IPVersion) {
|
|
|
|
|
this.IPVersion = IPVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getIP() {
|
|
|
|
|
return IP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setIP(String IP) {
|
|
|
|
|
this.IP = IP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getPort() {
|
|
|
|
|
return Port;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setPort(int port) {
|
|
|
|
|
Port = port;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-22 08:47:52 +00:00
|
|
|
|
|
|
|
|
public Router getRouter() {
|
|
|
|
|
return router;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setRouter(Router router) {
|
|
|
|
|
this.router = router;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-02-21 09:24:05 +00:00
|
|
|
}
|