记录第一次使用 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);
            }
        }
    }
}
  • 最终实现效果

记录第一次使用 spring-boot + smart-socket

开始对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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!