代码提交
This commit is contained in:
31
websocket/pom.xml
Normal file
31
websocket/pom.xml
Normal file
@@ -0,0 +1,31 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.mangmang</groupId>
|
||||
<artifactId>learning-nexus</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>websocket</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>websocket</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.mangmang;
|
||||
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class WebSocketDemoApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(WebSocketDemoApplication.class, args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.mangmang.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
|
||||
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
|
||||
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
|
||||
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
|
||||
|
||||
@Configuration
|
||||
@EnableWebSocketMessageBroker
|
||||
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
|
||||
|
||||
@Override
|
||||
public void registerStompEndpoints(StompEndpointRegistry registry) {
|
||||
// 注册STOMP协议的节点(endpoint),并指定使用SockJS协议
|
||||
registry.addEndpoint("/ws").setAllowedOrigins("http://10.6.212.39:5173/");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureMessageBroker(MessageBrokerRegistry registry) {
|
||||
// 配置消息代理,前缀为/topic的消息将会被路由到消息代理
|
||||
registry.enableSimpleBroker("/topic");
|
||||
// 以/app开头的消息将会被路由到@MessageMapping注解的方法中
|
||||
registry.setApplicationDestinationPrefixes("/app");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.mangmang.controller;
|
||||
|
||||
import com.mangmang.model.Message;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.messaging.handler.annotation.MessageMapping;
|
||||
import org.springframework.messaging.handler.annotation.Payload;
|
||||
import org.springframework.messaging.handler.annotation.SendTo;
|
||||
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
|
||||
import org.springframework.stereotype.Controller;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
|
||||
@Slf4j
|
||||
@Controller
|
||||
public class MessageController {
|
||||
|
||||
@MessageMapping("/chat.sendMessage")
|
||||
@SendTo("/topic/public")
|
||||
public Message sendMessage(@Payload Message message) {
|
||||
log.info(message.toString());
|
||||
return message;
|
||||
}
|
||||
|
||||
|
||||
@MessageMapping("/chat.addUser")
|
||||
@SendTo("/topic/public")
|
||||
public Message addUser(@Payload Message message, SimpMessageHeaderAccessor headerAccessor) {
|
||||
log.info(message.toString());
|
||||
// 将用户名添加到WebSocket会话
|
||||
Objects.requireNonNull(headerAccessor.getSessionAttributes()).put("username", message.getSender());
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.mangmang.listener;
|
||||
|
||||
import com.mangmang.model.Message;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
|
||||
import org.springframework.messaging.simp.SimpMessageSendingOperations;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class WebSocketEventListener {
|
||||
|
||||
private final SimpMessageSendingOperations messagingTemplate;
|
||||
|
||||
@EventListener
|
||||
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
|
||||
// 获取会话属性
|
||||
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(event.getMessage());
|
||||
|
||||
// 从会话中获取用户名
|
||||
String username = (String) Objects.requireNonNull(headerAccessor.getSessionAttributes()).get("username");
|
||||
|
||||
if (username != null) {
|
||||
log.info("用户断开连接: {}", username);
|
||||
|
||||
// 创建一个离开消息
|
||||
Message message = Message.builder()
|
||||
.type(Message.MessageType.LEAVE)
|
||||
.sender(username)
|
||||
.content("下线了")
|
||||
.build();
|
||||
|
||||
// 发送消息到公共主题
|
||||
messagingTemplate.convertAndSend("/topic/public", message);
|
||||
}
|
||||
}
|
||||
}
|
||||
25
websocket/src/main/java/com/mangmang/model/Message.java
Normal file
25
websocket/src/main/java/com/mangmang/model/Message.java
Normal file
@@ -0,0 +1,25 @@
|
||||
package com.mangmang.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class Message {
|
||||
private String content;
|
||||
private String sender;
|
||||
private MessageType type;
|
||||
|
||||
|
||||
public enum MessageType {
|
||||
CHAT,
|
||||
JOIN,
|
||||
LEAVE
|
||||
}
|
||||
}
|
||||
6
websocket/src/main/resources/application.yml
Normal file
6
websocket/src/main/resources/application.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
server:
|
||||
port: 8099
|
||||
# application.yml
|
||||
logging:
|
||||
level:
|
||||
org.springframework.web.socket: DEBUG
|
||||
Reference in New Issue
Block a user