SpringBoot+WebSocket实现多人在线聊天案例

x33g5p2x  于2022-02-11 转载在 Spring  
字(6.3k)|赞(0)|评价(0)|浏览(477)

1.pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.3</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.yl</groupId>
  12. <artifactId>chat01</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>chat01</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-websocket</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. </dependency>
  33. <!--前端库依赖-->
  34. <dependency>
  35. <groupId>org.webjars</groupId>
  36. <artifactId>sockjs-client</artifactId>
  37. <version>1.1.2</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.webjars</groupId>
  41. <artifactId>stomp-websocket</artifactId>
  42. <version>2.3.3</version>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.webjars</groupId>
  46. <artifactId>jquery</artifactId>
  47. <version>3.5.1</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.webjars</groupId>
  51. <artifactId>webjars-locator-core</artifactId>
  52. <!-- <version>0.48</version>-->
  53. </dependency>
  54. </dependencies>
  55. <build>
  56. <plugins>
  57. <plugin>
  58. <groupId>org.springframework.boot</groupId>
  59. <artifactId>spring-boot-maven-plugin</artifactId>
  60. </plugin>
  61. </plugins>
  62. </build>
  63. </project>

2.消息实体类

  1. package com.yl.chat01.domain;
  2. import java.io.Serializable;
  3. public class Message implements Serializable {
  4. private String name;
  5. private String content;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getContent() {
  13. return content;
  14. }
  15. public void setContent(String content) {
  16. this.content = content;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Message{" +
  21. "name='" + name + '\'' +
  22. ", content='" + content + '\'' +
  23. '}';
  24. }
  25. }

3.controller

  1. package com.yl.chat01.controller;
  2. import com.yl.chat01.domain.Message;
  3. import org.springframework.messaging.handler.annotation.MessageMapping;
  4. import org.springframework.messaging.handler.annotation.SendTo;
  5. import org.springframework.stereotype.Controller;
  6. @Controller
  7. public class GreetingController {
  8. @MessageMapping("/hello") //发送消息请求
  9. @SendTo("/topic/greetings") //消息广播
  10. public Message greeting(Message message) {
  11. return message;
  12. }
  13. }

4.WebSocket的配置文件

  1. package com.yl.chat01.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.messaging.simp.config.MessageBrokerRegistry;
  4. import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
  5. import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
  6. import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
  7. @Configuration
  8. @EnableWebSocketMessageBroker
  9. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
  10. // 注册端点,用于前端建立连接的
  11. @Override
  12. public void registerStompEndpoints(StompEndpointRegistry registry) {
  13. registry.addEndpoint("/chat").withSockJS();
  14. }
  15. // 配置消息代理,通过广播的形式来传递消息
  16. @Override
  17. public void configureMessageBroker(MessageBrokerRegistry registry) {
  18. registry.enableSimpleBroker("/topic");
  19. }
  20. }

5.前端发送消息页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="/webjars/jquery/jquery.min.js"></script>
  7. <script src="/webjars/sockjs-client/sockjs.min.js"></script>
  8. <script src="/webjars/stomp-websocket/stomp.min.js"></script>
  9. </head>
  10. <body>
  11. <div>
  12. <label for="username">请输入用户名:</label>
  13. <input type="text" id = "username" placeholder="用户名"/>
  14. </div>
  15. <div>
  16. <input type="button" value="连接" id="connect"/>
  17. <input type="button" value="断开连接" id="disconnect" disabled="disabled"/>
  18. </div>
  19. <div id="chat"></div>
  20. <div>
  21. <label for="content">请输入聊天内容</label>
  22. <input type="text" id="content" placeholder="聊天内容"/>
  23. </div>
  24. <input type="button" value="发送" disabled="disabled" id="send"/>
  25. <script>
  26. var stompClient;
  27. $(function () {
  28. //连接
  29. $("#connect").click(function () {
  30. connect()
  31. })
  32. //发送消息到后台
  33. $("#send").click(function () {
  34. stompClient.send("/hello",{},JSON.stringify({'name':$('#username').val(),'content':$("#content").val()}))
  35. })
  36. //断开连接
  37. $("#disconnect").cilck(function () {
  38. stompClient.disconnect();
  39. disableButton(false);
  40. })
  41. })
  42. function connect() {
  43. if (!$("#username").val()) {
  44. alert("请输入用户名")
  45. return;
  46. }
  47. //获取连接地址
  48. var socketjs = new SockJS("/chat");
  49. stompClient = Stomp.over(socketjs);
  50. //建立连接
  51. stompClient.connect({},function (frame) {
  52. alert("connect success")
  53. disableButton(true);
  54. //订阅消息
  55. stompClient.subscribe("/topic/greetings",function (obj) {
  56. var msg = JSON.parse(obj.body);
  57. $("#chat").append("<div>"+msg.name+ ":" + msg.content+"</div>")
  58. })
  59. })
  60. }
  61. function disableButton(connected) {
  62. $("#connect").prop("disabled",connected);
  63. $("#disconnect").prop("disabled",!connected);
  64. $("#send").prop("disabled",!connected);
  65. }
  66. </script>
  67. </body>
  68. </html>

6.测试

6.1.客户端A

6.2.客户端B

相关文章