netty-socketio -夜幕思年華

有問題歡迎討論,羣聊廣播

架構圖 

https://blog.csdn.net/qq_24137609/article/details/90693558

1、啓動類注入Bean

public class IMApplication extends WebMvcConfigurerAdapter {
    static Logger logger = Logger.getLogger(IMApplication.class);

    @Autowired
    private ChatConfig chatConfig;

    public static void main(String[] args) {
        SpringApplication.run(IMApplication.class, args);
    }

    @Bean
    public SocketIOServer socketIOServer() {

        Configuration config = new Configuration();
        config.setPort(chatConfig.getSocketRamPort());
        /**
         * 修復地址佔用
         */
        SocketConfig socketConfig = config.getSocketConfig();
        socketConfig.setReuseAddress(true);

        /**
         * 超時處理
         */
        config.setTransports(Transport.WEBSOCKET, Transport.POLLING);
        config.setPingTimeout(11000);
        config.setPingInterval(3000);

        /**
         * 身份驗證
         */
        config.setAuthorizationListener(new AuthorizationListener() {
            @Override
            public boolean isAuthorized(HandshakeData data) {
                String[] params = SymmetricEncoderUtils.AESDncode("AES", data.getSingleUrlParam("token")).split("\\_");
                if (params[params.length - 1] != null) {
                    return true;
                }
                return false;
            }
        });
        final SocketIOServer server = new SocketIOServer(config);
        return server;
    }
    //掃描socket的方法
    @Bean
    public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketIOServer) {
        return new SpringAnnotationScanner(socketIOServer);
    }
}

2、寫一個啓動類,並且實現CommandLineRunner方法

@Component
@Order(value = 1)
public class ServerRunner implements CommandLineRunner {
    private final SocketIOServer server;
    @Autowired
    public ServerRunner(SocketIOServer server, MessageDispatcher messageDispatcher, ClientRunner clientRunner, ClientRunnerD clientRunnerD) {
        this.server = server;
    }
    @Override
    public void run(String... strings) {
        server.start(); 
    }
}

3、socket業務類(啓動類有掃描器)

@Component
public class MessageEventHandler {
    /**
     * 建立長連接
     *
     * @param client
     */
    @OnConnect
    public void onConnect(SocketIOClient client) {
        //獲取用戶id參數
        //建立hashMap
        //把用戶id作爲key,client作爲value存入
    }

    /**
     * 消息處理
     *
     * @param client
     * @param data
     * @param ackRequest
     */
    @OnEvent(value = "chat")
    public void onEvent(SocketIOClient client, ImMessageDetail data, AckRequest ackRequest) {
        chat 需要和前端對應
        //實體data接收前端數據
        //放入隊列(點對點模式,結合routingKey,實現集羣形式)
        //
    }

    /**
     * 斷開連接
     *
     * @param client
     */
    @OnDisconnect
    public void onDisconnect(SocketIOClient client) {
       //下線清除,hashMap中這個client的記錄(單條)
    }
}

4、隊列取出數據,獲取到目標人的client進行消息推送

5、可根據隊列實現單聊的集羣形式,橫向擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章