锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. springboot websocket 知识点汇总

springboot websocket 知识点汇总

0
  • JAVA
  • 发布于 2024-08-13
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

以下是一个详细全面的 Spring Boot 使用 WebSocket 的知识点汇总

1. 配置 WebSocket

添加依赖

进入 maven 官网, 搜索spring-boot-starter-websocket,选择版本, 然后把依赖复制到 pom.xml 的dependencies标签中

配置 WebSocket

创建一个配置类 WebSocketConfig,并启用 WebSocket 支持:

这个类的主要作用就是

  • 启用 WebSocket 支持: 这个配置类通过返回 ServerEndpointExporter 实例来启用 WebSocket 支持。
  • 自动注册端点: 它会自动注册用 @ServerEndpoint 注解标识的 WebSocket 端点,使它们能够处理 WebSocket 请求。
package com.example.websocketdemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

2. 创建 WebSocket 端点

创建一个 WebSocket 端点 WebSocketServer,处理客户端与服务器之间的 WebSocket 通信。

当一个用户向服务端发送 socket 连接时, 相当于创建了一个WebSocketServer 类的实例对象

代码中的Session 放到文章最后讲。

package com.example.websocketdemo.websocket;
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;

@Component	// 下面路径最后面不要写 '/'这个符号
@ServerEndpoint("/websocket/{username}")	// 我们配置的有WebSocketConfig类, 所以可以使用这个注解
public class WebSocketServer {

    private Session session;

    @OnOpen	// 建立连接的时候会调用这个函数
    public void onOpen(Session session, @PathParam("username") String username) {
        this.session = session;
        System.out.println("Connected with username: " + username);
    }

    @OnMessage	// 接收到客户端的信息时调用
    public void onMessage(String message, Session session) {
        System.out.println("Received message: " + message);
        try {
            session.getBasicRemote().sendText("Server received [" + message + "]");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnClose	// 关闭连接的时候调用
    public void onClose(Session session) {
        System.out.println("Session closed");
    }

    @OnError	// 错误时调用
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }
}

3. Spring Security 配置(可选)

如果你的应用使用了 Spring Security,可能需要配置忽略 WebSocket 端点的安全检查:

需要在你的SecurityConfig 类中添加下面内容才可以让服务器接收到 websocket 的请求。SecurityConfig是一个管理Spring Security的自定义类

package com.example.websocketdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;

@Configuration
public class SecurityConfig {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().requestMatchers("/websocket/**");
    }
}

4. 客户端代码

可以使用 JavaScript 在前端与 WebSocket 服务器进行通信。

<script>
    let socket = null;

    function connect() {
        let username = "your user name";
        
        // @ServerEndpoint("/websocket/{username}")	这里也可以传递其他参数, 比如token, 它会被服务端的这个注解接收到
        socket = new WebSocket('ws://localhost:8080/websocket/' + username);
		
		// 建立连接时会调用
        socket.onopen = function(event) {
            
        };

		// 接收到服务端的信息时调用
        socket.onmessage = function(event) {
            
        };
		
		// 关闭连接时调用
        socket.onclose = function(event) {
            
        };
		
		// 错误时调用
        socket.onerror = function(event) {
            
        };
		
		// 也可以通过close()手动关闭连接, 他会调用onclose(), 一般vue中在取消挂在组件时手动关闭连接
		socket.close(); 
		
		// 向服务端发送信息, message最好是json格式, JSON.stringify()
		socket.send(message)
    }
</script>

5. 处理 JSON 消息

在信息交换的时候, 我们一般用 JSON 格式的信息。Java 标准库中并不包含直接处理 JSON 的功能。因此,需要引入第三方库来处理 JSON 数据。
这里我们讲的是 Alibaba 提供的 fastjson, 还是在 maven 官网 搜索 fastjson 选择对应版本, 引入到 pom.xml 的dependencies标签中。

// 将 Java 对象序列化为 JSON 字符串
String jsonString = JSON.toJSONString(user);
        
// 将 JSON 字符串反序列化为 Java 对象
User deserializedUser = JSON.parseObject(jsonString, User.class);

// 创建一个 JSONObject
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "John");
// 转换成JSON字符串
jsonObject.toString()

// 解析 JSON 字符串
String jsonString = "{\"name\":\"ld\",\"age\":18,\"city\":\"ShangHai\"}";
JSONObject parsedObject = JSONObject.parseObject(jsonString);
// 获取value, 输出 ld
System.out.println("Name: " + parsedObject.getString("name"));

6. Session

Session 在 WebSocket 中是一个重要的概念,它代表了客户端和服务器之间的 WebSocket 连接。通过 Session 对象,你可以发送和接收消息、获取连接信息、管理连接状态以及处理连接中的错误。

1. 创建 WebSocket 服务器端点

在 Java 中使用 WebSocket 的第一步是创建一个 WebSocket 服务器端点。通过使用 @ServerEndpoint 注解,你可以定义 WebSocket 服务器端点,并处理连接、关闭、消息和错误事件。

示例代码:

import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/websocket")
public class WebSocketServer {
    
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Connected: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("Received: " + message);
        session.getBasicRemote().sendText("Echo: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("Disconnected: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }
}
2. Session 对象的常用方法
  • 获取连接的唯一 ID:session.getId()
  • 发送消息:
    • 发送文本消息:session.getBasicRemote().sendText("message")
    • 发送二进制消息:session.getBasicRemote().sendBinary(ByteBuffer buffer)
  • 获取连接的基本信息:
    • 获取连接的 URI:session.getRequestURI()
    • 获取连接的参数:session.getPathParameters()
    • 获取连接的请求参数:session.getRequestParameterMap()
  • 关闭连接:session.close()
  • 检查连接状态:session.isOpen()
3. 处理消息

在 WebSocket 中,处理消息是通过 @OnMessage 注解的方法实现的。你可以在这个方法中处理来自客户端的消息,并使用 Session 对象发送响应。

示例代码:

@OnMessage
public void onMessage(String message, Session session) throws IOException {
    System.out.println("Received: " + message);
    // 向客户端发送回显消息
    session.getBasicRemote().sendText("Echo: " + message);
}
4. 处理连接和断开

@OnOpen 和 @OnClose 注解的方法分别用于处理连接建立和连接断开事件。在这些方法中,你可以执行一些初始化或清理操作。

示例代码:

@OnOpen
public void onOpen(Session session) {
    System.out.println("Connected: " + session.getId());
}

@OnClose
public void onClose(Session session) {
    System.out.println("Disconnected: " + session.getId());
}
5. 处理错误

@OnError 注解的方法用于处理 WebSocket 连接中的错误。在这个方法中,你可以记录错误信息或执行其他的错误处理操作。

示例代码:

@OnError
public void onError(Session session, Throwable throwable) {
    throwable.printStackTrace();
}

6. 使用 Session 进行高级操作

6.1 保存和共享用户状态

在 WebSocket 应用中,你可以使用 Session 对象来保存和共享用户状态。例如,你可以在 Session 对象中存储用户的身份信息,并在后续的消息处理中使用这些信息。

示例代码:

@OnOpen
public void onOpen(Session session) {
    session.getUserProperties().put("username", "John");
}

@OnMessage
public void onMessage(String message, Session session) throws IOException {
    String username = (String) session.getUserProperties().get("username");
    session.getBasicRemote().sendText("Hello, " + username + "! You sent: " + message);
}
6.2 广播消息

你可以使用 Session 对象的集合来实现消息的广播,即将消息发送给所有连接的客户端。

示例代码:

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@ServerEndpoint("/websocket")
public class WebSocketServer {
    private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
        System.out.println("Connected: " + session.getId());
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
        System.out.println("Disconnected: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        for (Session s : sessions) {
            if (s.isOpen()) {
                s.getBasicRemote().sendText("Broadcast: " + message);
            }
        }
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }
}

文章到这里就这束了!~

其他文章地址:

快速入门,springboot 知识点汇总

springboot 常用注解大全 (超详细, 30 个)

springboot websocket 知识点汇总

spring cloud 知识点汇总, 待更

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.