有問題歡迎討論,羣聊廣播
架構圖
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、可根據隊列實現單聊的集羣形式,橫向擴展