引入依赖
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.19</version>
</dependency>
编写配置
@Bean
public SocketIOServer socketIOServer() {
com.corundumstudio.socketio.Configuration conf = new com.corundumstudio.socketio.Configuration();
conf.setHostname(host);
conf.setPort(port);
return new SocketIOServer(conf);
}
@Bean
public SpringAnnotationScanner springAnnotationScanner() {
return new SpringAnnotationScanner(socketIOServer());
}
事件处理
启动服务
@PostConstruct
private void start() {
try {
socketIOServer.start();
log.info("socketServer已启动");
}catch (Exception e){
e.printStackTrace();
}
}
终止服务
@PreDestroy
private void destroy(){
try {
socketIOServer.stop();
log.info("socketServer已停止");
}catch (Exception e){
e.printStackTrace();
}
}
创建监听连接
@OnConnect
public void onConnect(SocketIOClient client) {
String userId = client.getHandshakeData().getSingleUrlParam("userId");
ChatUserDto user = sysUserService.findById(userId);
chatUsers.putIfAbsent(userId, user);
String msg = "用户:" + user.getNickname() + "------加入聊天室";
log.info(msg);
socketIOServer.getBroadcastOperations().sendEvent("login-remind",msg);
}
关闭监听连接
@OnDisconnect
public void onDisconnect(SocketIOClient client) {
String userId = client.getHandshakeData().getSingleUrlParam("userId");
ChatUserDto user = sysUserService.findById(userId);
chatUsers.remove(userId);
String msg = "用户:" + user.getNickname() + "------离开聊天室";
log.info(msg);
socketIOServer.getBroadcastOperations().sendEvent("logout-remind",msg);
}
广播和监听消息
@OnEvent("send-message")
public void onChat(SocketIOClient client, MessageDto messageDto) {
ChatMsgDto msg = new ChatMsgDto();
msg.setUser(chatUsers.get(messageDto.getUserId()));
msg.setContent(messageDto.getContent());
msg.setTime(new Date());
log.info("收到来自---" + msg.getUser().getNickname() + "---的消息---" + messageDto.getContent());
socketIOServer.getBroadcastOperations().sendEvent("receive-message", msg);
String value = redisTemplate.boundValueOps("ChatMessage").get();
if(value == null) {
list.add(msg);
redisTemplate.boundValueOps("ChatMessage").set(JSONObject.toJSONString(list));
}else{
list = Objects.requireNonNull(JSONObject.parseArray(value)).toJavaList(ChatMsgDto.class);
list.add(msg);
redisTemplate.boundValueOps("ChatMessage").set(JSONObject.toJSONString(list));
}
}
获取聊天记录
@RestController
@RequestMapping("/socket/chat")
public class SocketIOController {
@Autowired
private StringRedisTemplate redisTemplate;
@GetMapping("/roomMsg")
public R getRoomMsg() {
String value = redisTemplate.boundValueOps("ChatMessage").get();
List<ChatMsgDto> list = Objects.requireNonNull(JSONObject.parseArray(value)).toJavaList(ChatMsgDto.class);
return R.ok().put("roomMsg", list);
}
}