首页 > 其他分享 >SpringBoot 使用WebSocket

SpringBoot 使用WebSocket

时间:2024-10-21 11:47:42浏览次数:1  
标签:WebSocket SpringBoot void session 使用 println import websocket public

WebSocket 是一种网络通信协议,提供了在单个TCP连接上进行全双工通信的能力。这意味着客户端和服务器可以同时发送和接收数据,而不需要等待对方的回应。
Spring Boot 提供了对WebSocket的自动配置和简化的编程模型,使得在Spring Boot应用程序中集成WebSocket变得相对简单。

需要引入依赖

	    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

创建socket配置文件

package com.ggp.test1017.config;

import com.ggp.test1017.controller.ServerController;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ServerController(), "/websocket").setAllowedOrigins("*");
    }

    public ServerController serverController() {
        return new ServerController();
    }
}

创建客户端配置

package com.ggp.test1017.controller;

import javax.websocket.*;
import java.io.IOException;
import java.net.URI;

@ClientEndpoint
public class ClientController {

    private Session session;
    private static volatile boolean isConnected = false;

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket 连接已经建立。");
        this.session = session;
        isConnected = true;
    }

    @OnMessage
    public void onMessage(String message, Session session) {
//        打印在客户端
        System.out.println(message);
    }

    @OnClose
    public void onClose() {
        System.out.println("WebSocket 连接已经关闭。");
        isConnected = false;
    }

    @OnError
    public void one rror(Throwable t) {
        System.out.println("WebSocket 连接出现错误:" + t.getMessage());
    }

    public void connect(String url) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, new URI(url));
    }

    public void send(String message) throws IOException {
        if (isConnected) {
            session.getBasicRemote().sendText(message);
        } else {
            System.out.println("WebSocket 连接未建立,无法发送消息。");
        }
    }

    public void close() throws IOException {
        if (session != null) {
            session.close();
        }
    }

    // 添加一个方法来检查连接是否已经建立
    public boolean isIsConnected() {
        return isConnected;
    }
}

创建一个服务端配置

package com.ggp.test1017.controller;

import org.springframework.web.socket.*;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@ServerEndpoint("/websocket")
public class ServerController implements WebSocketHandler {

    private static final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<WebSocketSession>());

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        System.out.println("有新连接加入,当前连接数:" + sessions.size());
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        String payload = message.getPayload().toString();
        System.out.println("收到来自 " + session.getId() + "的客户端信息: " + payload);

        // 将消息发送给所有客户端
        for (WebSocketSession s : sessions) {
            if (s.isOpen()) {
                s.sendMessage(new TextMessage("服务器收到信息。(已读) " + payload));
            }
        }
        System.out.println("服务器收到信息!(已读) " + payload);
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.out.println("传输错误:" + exception.getMessage());
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        sessions.remove(session);
        System.out.println("连接关闭,当前连接数:" + sessions.size());
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}

测试

启动服务 Application

创建模拟客户端

package com.ggp.test1017.controller;

import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.net.URI;

public class ClientDemo01 {
    public static void main(String[] args) throws Exception {
        ClientController client = new ClientController();
        String url = "ws://localhost:8080/websocket"; // 假设这是你的服务端WebSocket URL
        // 建立连接
        client.connect(url);
        // 发送消息
        client.send("666");
        System.out.println("66");
        // 等待连接建立
        Thread.sleep(500);
        client.close();
    }
}

运行demo,结果会在服务端控制台看到。

客户端界面显示

服务端界面显示

标签:WebSocket,SpringBoot,void,session,使用,println,import,websocket,public
From: https://www.cnblogs.com/Gguopeng/p/18489151

相关文章

  • 使用http请求jenkins 构建Job
    1.创建专门用于api的用户,授予对应项目的权限2.生成api_tocken3.远程构建打开job的构建界面复制url使用buildWithParameters接口http://192.168.xx.xxx:12000/view/运维工具/job/lijq-test/buildWithParameters授权处填写用户id作为用户名前面生成的api_tocken即为密......
  • Springboot计算机毕业设计毕设课题的选择和申报管理系统2u465
    Springboot计算机毕业设计毕设课题的选择和申报管理系统2u465本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:专业,班级,学生,教师,通知类型,通知公告,学院,课题类型,课题信息,选题信息,论文信息,论文......
  • 使用Python解决化学问题的实用指南
    使用Python解决化学问题的实用指南Python作为一种高级编程语言,因其简洁的语法、强大的库支持和活跃的社区,在科学研究领域得到了广泛应用,特别是在化学领域。Python提供了丰富的科学计算和数据处理库,如NumPy、SciPy、Pandas等,以及专为化学设计的库,如RDKit、OpenBabel等,使得......
  • 【JAVA毕业设计】基于Vue和SpringBoot的网上订餐系统
    本文项目编号T018,文末自助获取源码\color{red}{T018,文末自助获取源码}......
  • 【JAVA毕业设计】基于Vue和SpringBoot的大学生租房平台
    本文项目编号T019,文末自助获取源码\color{red}{T019,文末自助获取源码}......
  • Springboot计算机毕业设计沧州交通学院教师趣味竞赛管理系统y08ot
    Springboot计算机毕业设计沧州交通学院教师趣味竞赛管理系统y08ot本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:教师,竞赛项目,竞赛报名,比赛结果,竞赛奖品,比赛排序,竞赛闭幕,竞赛数据开题报告内......
  • Springboot计算机毕业设计超市仓库管理系统15g4i
    Springboot计算机毕业设计超市仓库管理系统15g4i本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,商品种类,商品信息,入库信息,出库信息,供应商信息开题报告内容一、项目背景与意义随着零售业......
  • Springboot计算机毕业设计仓库管理oni4h
    Springboot计算机毕业设计仓库管理oni4h本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:员工,客户信息,供应商,通知公告,商品信息,商品出货,商品进货开题报告内容一、项目背景与意义在快速发展的......
  • Springboot计算机毕业设计病历管理系统j78e5
    Springboot计算机毕业设计病本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列项目功能:科室,医生,病人信息,病历信息,病情分类,手术信息开题报告内容一、研究背景与意义随着信息技术的迅猛发展,数字化、智能化......
  • Springboot计算机毕业设计仓储线上管理系统7te15
    Springboot计算机毕业设计仓储线上管理系统本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,员工,材料信息,材料入库,材料出库,供应商,商品信息,商品类型,订单信息,利润信息,材料盘点,商品盘点开......