记录第一次使用 spring-boot + smart-socket
- pom文件添加依赖
<!-- smart-socket 基础子模块 -->
<dependency>
<groupId>org.smartboot.socket</groupId>
<artifactId>aio-core</artifactId>
<version>1.5.17</version>
</dependency>
<!-- smart-socket 高级子模块 -->
<dependency>
<groupId>org.smartboot.socket</groupId>
<artifactId>aio-pro</artifactId>
<version>1.5.17</version>
</dependency>
- 添加config配置类
@Slf4j
@Configuration
public class SmartSocketConfig {
/**
* 端口号
*/
@Value("${smart-socket.port}")
private int port;
@Resource
private StringProtocol stringProtocol;
/**
* smart-socket 启动服务
*/
@Bean
public void start() {
try {
// 1.定义服务
AioQuickServer server = new AioQuickServer(port, stringProtocol, new SmartSocketProcessor());
// 2.启动服务
server.start();
} catch (IOException e) {
log.error("smart-socket 启动错误");
log.error(e.toString());
}
}
}
- stringProtocol(字符串消息处理类)
@Slf4j
@Component
public class StringProtocol implements Protocol<String> {
/**
* 定义协议-消息长度
*/
@Value("${smart-socket.mesLength}")
private int mesLength;
/**
* 消息解码
* @param buffer - 消息内容
* @param session - 当前操作人身份
*/
@Override
public String decode(ByteBuffer buffer, AioSession session) {
byte[] b = new byte[mesLength];
buffer.get(b);
buffer.mark();
return new String(b);
}
}
- processor类
@Slf4j
public class SmartSocketProcessor implements MessageProcessor<String> {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(SmartSocketProcessor.class);
/**
* 存放所有的客户端
*/
private final Map<String, AioSession> sessionMap = new ConcurrentHashMap<>();
@Override
public void process(AioSession session, String msg) {
toClients(session, msg, false);
}
@Override
public void stateEvent(AioSession session, StateMachineEnum stateMachineEnum, Throwable throwable) {
switch (stateMachineEnum) {
case NEW_SESSION:
LOGGER.info("客户端:{} 建立连接", session.getSessionID());
sessionMap.put(session.getSessionID(), session);
break;
case SESSION_CLOSED:
LOGGER.info("客户端:{} 断开连接", session.getSessionID());
sessionMap.remove(session.getSessionID());
break;
default:
}
}
/**
* 广播
* @param session 客户端
* @param msg 推送消息
* @param pushSelf 是否光宝自己 默认 false
*/
public void toClients(AioSession session, String msg, boolean pushSelf) {
LOGGER.info("收到消息:{}:{}", session.getSessionID(), msg);
byte[] bytes = msg.getBytes();
for (AioSession client : sessionMap.values()) {
if (!pushSelf && session == client) {
continue;
}
WriteBuffer writeBuffer = client.writeBuffer();
try {
LOGGER.info("推送消息:{}:{}", client.getSessionID(), msg);
writeBuffer.writeInt(bytes.length);
writeBuffer.write(bytes);
writeBuffer.flush();
} catch (Exception e) {
LOGGER.error("推送消息异常:{} :", client.getSessionID(), e);
}
}
}
}
- 最终实现效果
开始对socket协议不太了解,在decode的地方卡了半天,发现还是对通信协议不是很了解,通过 这篇文章 最后解决了我的疑惑。
其他 smart-socket 文档地址 :
smartboot.gitee.io/book/ 官方使用文档
www.bookstack.cn/read/smart-socket... 文档
my.oschina.net/u/2385344/blog/4189... 文档
www.mianshigee.com/tutorial/smart-... 文档
my.oschina.net/u/2385344/blog/4262... 心跳
本作品采用《CC 协议》,转载必须注明作者和本文链接