• SpringBoot整合Websocket实现聊天室


    1.添加依赖:在pom.xml文件中添加WebSocket相关依赖。

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-websocket</artifactId>
    4. </dependency>

    2.创建WebSocket配置类:创建一个WebSocket配置类,用于配置WebSocket端点和处理器。

    1. @Configuration
    2. @EnableWebSocket
    3. public class WebSocketConfig {
    4. @Bean
    5. public ServerEndpointExporter serverEndpoint(){
    6. return new ServerEndpointExporter();
    7. }
    8. }

    3.创建WebSocket处理器:创建一个WebSocket处理器,用于处理WebSocket连接和消息。

    1. @Component
    2. @ServerEndpoint("/chat")
    3. public class ChatService {
    4. /**
    5. * 连接会话池
    6. */
    7. private static ConcurrentHashMap SESSION_POOL = new ConcurrentHashMap<>();
    8. @OnOpen
    9. public void onOpen(Session session) throws IOException {
    10. // 判断客户端对象是否存在
    11. if (SESSION_POOL.containsKey(session.getQueryString())) {
    12. CloseReason closeReason = new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "ID冲突,连接拒绝");
    13. session.getUserProperties().put("reason", closeReason);
    14. session.close();
    15. return;
    16. }
    17. // 将客户端对象存储到会话池
    18. SESSION_POOL.put(session.getQueryString(), session);
    19. System.out.println("客户端(" + session.getQueryString() + "):开启了连接");
    20. }
    21. @OnMessage
    22. public String onMessage(String msg, Session session) throws IOException {
    23. // 解析消息 ==> ID::消息内容
    24. String[] msgArr = msg.split("::", 2);
    25. // 处理群发消息,ID==all表示群发
    26. if ("all".equalsIgnoreCase(msgArr[0])) {
    27. for (Session one : SESSION_POOL.values()) {
    28. // 排除自己
    29. if (one == session) {
    30. continue;
    31. }
    32. // 发送消息
    33. one.getBasicRemote().sendText(msgArr[1]);
    34. }
    35. }
    36. // 指定发送
    37. else {
    38. // 获取接收方
    39. Session target = SESSION_POOL.get(msgArr[0]);
    40. if (target != null) {
    41. target.getBasicRemote().sendText(msgArr[1]);
    42. }
    43. }
    44. return session.getQueryString() + ":消息发送成功";
    45. }
    46. @OnClose
    47. public void onClose(Session session) {
    48. // 连接拒绝关闭会话
    49. Object reason = session.getUserProperties().get("reason");
    50. if (reason instanceof CloseReason) {
    51. CloseReason creason = (CloseReason) reason;
    52. if (creason.getCloseCode() == CloseReason.CloseCodes.CANNOT_ACCEPT) {
    53. System.out.println("拒绝客户(" + session.getQueryString() + "):关闭连接");
    54. return;
    55. }
    56. }
    57. // 从会话池中移除会话
    58. SESSION_POOL.remove(session.getQueryString());
    59. System.out.println("客户端(" + session.getQueryString() + "):关闭连接");
    60. }
    61. @OnError
    62. public void onError(Session session, Throwable throwable) {
    63. System.out.println("客户端(" + session.getQueryString() + ")错误信息:" + throwable.getMessage());
    64. }
    65. @SneakyThrows
    66. public void sendMessage(String id, Object message) {
    67. // 群发
    68. if ("all".equalsIgnoreCase(id)) {
    69. for (Session one : SESSION_POOL.values()) {
    70. // 发送消息
    71. one.getBasicRemote().sendText(JSONUtil.toJsonStr(message));
    72. }
    73. }
    74. // 指定发送
    75. else {
    76. // 获取接收方
    77. Session target = SESSION_POOL.get(id);
    78. if (target != null) {
    79. target.getBasicRemote().sendText(JSONUtil.toJsonStr(message));
    80. }
    81. }
    82. }
    83. }

    4.创建HTML页面:创建一个HTML页面,用于在浏览器中连接WebSocket并进行聊天。

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>聊天室客户端title>
    6. head>
    7. <body>
    8. <h1>Chat Clienth1>
    9. <div>
    10. <input id="clientId" placeholder="输入ID" value="1">
    11. <input onclick="init()" value="连接服务器" type="button"><br><br>
    12. <input id="receiverId" placeholder="输入接收人ID" value="all"><br><br>
    13. <textarea id="message" style="margin: 0; height: 197px; width: 362px;"
    14. placeholder="发送消息内容">textarea><br>
    15. <input onclick="send()" value="发送消息" type="button">
    16. <input onclick="closeConnect()" value="关闭连接" type="button">
    17. div>
    18. <div id="output">div>
    19. <script type="text/javascript" language="JavaScript">
    20. //屏幕回显输出方法
    21. function writeToScreen(message) {
    22. let pre = document.createElement("p");
    23. pre.style.wordWrap = "break-word";
    24. pre.innerHTML = message;
    25. document.getElementById("output").appendChild(pre);
    26. }
    27. //初始化websocket
    28. let echo_websocket;
    29. function init() {
    30. let clientId = document.getElementById("clientId").value;
    31. let wsUri = "ws://localhost:10500/chat?" + clientId;
    32. writeToScreen("连接到" + wsUri);
    33. //1.创建WebSocket客户端对象
    34. echo_websocket = new WebSocket(wsUri);
    35. //2.开门握手完成回调
    36. echo_websocket.onopen = function (evt) {
    37. console.log(evt);
    38. writeToScreen("连接打开成功 !");
    39. };
    40. //3.监听服务端的消息
    41. echo_websocket.onmessage = function (evt) {
    42. writeToScreen("接收服务端消息:
      "
      + evt.data);
    43. };
    44. //4.如果连接中断
    45. echo_websocket.onerror = function (evt) {
    46. writeToScreen('ERROR:'+evt.data+'');
    47. //关闭连接
    48. closeConnect();
    49. };
    50. //5.注册close事件
    51. echo_websocket.onclose = function(evt){
    52. writeToScreen('INFO:关闭连接 ');
    53. if(evt.reason){
    54. writeToScreen
    55. (`错误信息:${evt.reason} `);
    56. }
    57. }
    58. }
    59. //6.向服务发送消息
    60. function send() {
    61. let message = document.getElementById("message").value;
    62. let receiver = document.getElementById("receiverId").value;
    63. echo_websocket.send(receiver + "::" + message);
    64. writeToScreen("发送消息: " + message);
    65. }
    66. //7.如果不需要通讯,那么关闭连接
    67. function closeConnect() {
    68. echo_websocket.close();
    69. }
    70. script>
    71. body>
    72. html>

  • 相关阅读:
    apple configurator 2 获取appstore ipa包
    ubuntu22sshd服务保持连接的设置
    【Graph】NetworkX官方基础教程
    K8s中的控制器和资源对象是什么关系呢?
    数字化外协生产综合管理系统,实现信息自动同步,数据自动统计分析!
    爬虫记录——第三方钱包加密参数逆向
    JDBC学习笔记
    WuThreat ITDR 可以快速构建多场景的身份认证与威胁检测能力
    半同态加密(Partially Homomorphic Encryption, PHE)
    【Kotlin精简】第3章 类与接口
  • 原文地址:https://blog.csdn.net/Candy___i/article/details/134082399