SpringBoot快速搭建WebSocket并测试

这篇具有很好参考价值的文章主要介绍了SpringBoot快速搭建WebSocket并测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。
在ws应用程序中,服务器发布websocket端点。
一个ws连接的建立,需要客户端和服务端维护一个Key来作为该连接的链接凭证。
客户端向服务端发送wsKey,服务器根据wsKey生成wsAccept返回给客户端,客户端进行相同操作,如果最后的值和服务器返回的Accept的值相匹配,表示握手成功。握手后客户端与服务端就互相发送消息
ws支持文本消息(UTF-8编码)、二进制消息
ws的URI形式:
ws://host:port/path?query
wss://host:port/path?query
ws:未加密连接,默认端口80
wss:加密连接,默认端口443
path:表示服务器内端点的位置
query:路径参数信息

话不多说,上代码

Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.9-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>websocketdemo</name>
  <description>Demo project for WebSocket</description>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <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>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.28</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>spring-snapshots</id>
      <name>Spring Snapshots</name>
      <url>https://repo.spring.io/snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </pluginRepository>
    <pluginRepository>
      <id>spring-snapshots</id>
      <name>Spring Snapshots</name>
      <url>https://repo.spring.io/snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
    </pluginRepository>
  </pluginRepositories>

</project>

服务端Service代码

这里的代码是websocket的服务端代码,这里相当于是服务器,负责运行wsServer,等待会话,或者发送消息。

package com.example.demo.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

/**
* @Description websocket的操作类
* @Author 
* @Date 2023/1/30 10:09
* @Version 1.0
*/
@ServerEndpoint("/websocket/{userId}")
    @Component
    @Slf4j
    public class WebSocketServer {
        /**
* ServerEndpoint注解
* 主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端

**/
        // 与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;

        // session集合,存放对应的session
        private static ConcurrentHashMap<Integer, Session> sessionPool = new ConcurrentHashMap<>();

        // concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。
        private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();

        /**
* 建立WebSocket连接
*
* @param session
* @param userId 用户ID
*/
        @OnOpen
        public void onOpen(Session session, @PathParam(value = "userId") Integer userId) {
            log.info("WebSocket建立连接中,连接用户ID:{}", userId);
            try {
                Session historySession = sessionPool.get(userId);
                // historySession不为空,说明已经有人登陆账号,应该删除登陆的WebSocket对象
                if (historySession != null) {
                    webSocketSet.remove(historySession);
                    historySession.close();
                }
            } catch (IOException e) {
                log.error("重复登录异常,错误信息:" + e.getMessage(), e);
            }
            // 建立连接
            this.session = session;
            webSocketSet.add(this);
            sessionPool.put(userId, session);
            log.info("建立连接完成,当前在线人数为:{}", webSocketSet.size());
        }
        /**
* 发生错误
*
* @param throwable e
*/
        @OnError
        public void onError(Throwable throwable) {
            throwable.printStackTrace();
        }

        /**
* 连接关闭
*/
        @OnClose
        public void onClose() {
            webSocketSet.remove(this);
            log.info("连接断开,当前在线人数为:{}", webSocketSet.size());
        }

        /**
* 接收客户端消息
*
* @param message 接收的消息
*/
        @OnMessage
        public void onMessage(String message) {
            log.info("收到客户端发来的消息:{}", message);
        }

        /**
* 推送消息到指定用户
*
* @param userId  用户ID
* @param message 发送的消息
*/
        public static void sendMessageByUser(Integer userId, String message) {
            log.info("用户ID:" + userId + ",推送内容:" + message);
            Session session = sessionPool.get(userId);
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                log.error("推送消息到指定用户发生错误:" + e.getMessage(), e);
            }
        }

        /**
* 群发消息
*
* @param message 发送的消息
*/
        public static void sendAllMessage(String message) {
            log.info("发送消息:{}", message);
            for (WebSocketServer webSocket : webSocketSet) {
                try {
                webSocket.session.getBasicRemote().sendText(message);
                } catch (IOException e) {
                log.error("群发消息发生错误:" + e.getMessage(), e);
                }
                }
                }
                }

服务端配置代码

这里是进行config的配置项
首先是对application进行配置

server:
  port: 8080
websocket:
  port: 6001
  action: ws://127.0.0.1
  thread:
    boss: 12
    work: 12

然后新建一个配置类

package com.example.demo.config;

import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

/**
* @Description websocket的配置文件, 开启websocket支持
* @Author  
* @Date 2023/1/30 10:03
* @Version 1.0
*/
@Configuration
    public class WebSocketConfig  implements ServletContextInitializer {
        /**
* 扫描所有带有@ServerEndpoint的注解成为websocket,
* 如果使用外置的tomcat就不需要该配置文件
*/
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }

        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {

        }
    }

服务端Controller:发送消息给客户端

这里的代码就是测试发信息的,你可以通过controller进行推送消息给当前链接的ws客户端

package com.example.demo.controller;

import com.example.demo.service.WebSocketServer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

/**
 * @Description 服务端向客户端发送消息
 * @Author  
 * @Date 2023/1/30 13:39
 * @Version 1.0
 */
@RestController
public class WsController {
    //给指定用户发消息
    @GetMapping("/sendone/{message}/{userId}")
    public String sendmessage(@PathVariable("message") String message, @PathVariable("userId") Integer userId) throws IOException {
        WebSocketServer.sendMessageByUser(userId,message);
        return "ok";
    }

    //这个可以后台群发,所有用户都能看到
    @GetMapping("/sendall/{message}")
    public String sendmessageall(@PathVariable("message") String message) throws IOException {
        WebSocketServer.sendAllMessage(message);
        return "ok";
    }
}

测试

一般来说,测试需要js的前端代码实现,这里为了简化,我们直接调用网页形式进行测试文章来源地址https://www.toymoban.com/news/detail-400538.html

开启ws服务端

  1. 把上述所有的springboot项目启动,主要就是把WebSocketServer启动起来
  2. 打开链接http://www.jsons.cn/websocket/
    SpringBoot快速搭建WebSocket并测试
    输入你的ws地址,1是你的客户端ID,这个是自定义的,这个网页模仿的就是客户端。
    SpringBoot快速搭建WebSocket并测试
    /websocket 这个则是按照ws服务端代码中的规定写路由的
  3. 点击链接
    正常你会看到
    SpringBoot快速搭建WebSocket并测试
    然后就可以愉快的客户端向服务端发信息了。
    服务端向客户端发信息也很简单,之前写的那个controller就是干这个的,不再演示。

到了这里,关于SpringBoot快速搭建WebSocket并测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot使用-基于Idea搭建WebSocket应用

    SpringBoot是所有基于Spring开发项目的起点,使得开发者能快速搭建 Spring 项目。在Idea集成工具环境下,通过使用SpringBoot,开发人员选用合适的Maven设置,能够方便地搭建WebSocket应用。 不同的Idea版本可能搭建方式略有出入,本文采用的Idea版本为 2018.3.5 (Ultimate Edition), 具体搭建

    2024年02月11日
    浏览(35)
  • 【Java】SpringBoot快速整合WebSocket实现客户端服务端相互推送信息

    目录 什么是webSocket? webSocket可以用来做什么? WebSocket操作类 一:测试客户端向服务端推送消息 1.启动SpringBoot项目 2.打开网站 3.进行测试消息推送 4.后端进行查看测试结果 二:测试服务端向客户端推送消息 1.接口代码 2.使用postman进行调用 3.查看测试结果         WebSocke

    2024年01月20日
    浏览(62)
  • Springboot+Netty+WebSocket搭建简单的消息通知

    Springboot+Netty+WebSocket搭建简单的消息通知 一、快速开始 1、添加依赖 2、添加配置 3、添加启动类 二、添加WebSocket部分代码 1、WebSocketServer 2、WebSocketConfig 3、DemoController 6、添加templates/index.html 三、添加Netty部分 1、NettyServer 2、WSChannelHandlerPool 3、WSWebSocketHandler 四、启动服务 ht

    2024年02月11日
    浏览(44)
  • springBoot集成webSocket并使用postMan进行测试

    简单来讲,webSocket是一种在http协议基础上的另一种新协议,叫ws协议。 http协议是单工通信,客户端发起请求,服务端收到请求并处理,返回给客户端,然后客户端收到服务端的请求。 ws协议是全双工通信,客户端发起请求后,相当于搭建了一个通道,在不断开的情况下,在

    2024年02月02日
    浏览(43)
  • win10中 hyper-v 中搭建 docker 快速搭建一个thinkphp6 的项目 swoole 环境 websocket 示例代码

    1. 先安装docker  和docker-composer    1.1安装docker 直接使用快捷一键安装   1.2等待一分钟docker安装完成启动docker     1.3 测试docker 安装 和镜像加速    直接参考文章安装和调试  CentOS 安装 Docker | Docker 从入门到实践 2.安装php 运行环境   2.1   选用最简单 的拥有 php-fpm 和 ngin

    2024年02月05日
    浏览(56)
  • Springboot 项目中引入WebSocket后,单元测试出现错误,前端开发揭秘

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108) at org.springframework.test.context.w

    2024年04月27日
    浏览(36)
  • k8s简介及虚拟机快速搭建k8s集群

    1.1、部署方式的变迁 传统部署时代: 在物理服务器上运行应用程序 无法为应用程序定义资源边界 导致资源分配问题 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是

    2024年02月12日
    浏览(79)
  • 【中间件-Openjob】高性能任务调度框架Openjob简介及快速搭建

    一款分布式高性能任务调度框架,支持多种定时任务、延时任务、工作流设计、轻量级分布式计算、无限水平扩容,并具有较高的可伸缩性和容错性,以及完善权限管理、强大的告警监控、原生支持多语言。 基础信息 中文官网 :https://openjob.io/zh-Hans/ 开源地址 :https://githu

    2024年02月12日
    浏览(63)
  • 新手快速搭建springboot项目

    添加完成maven的pom文件之后,会自动更新,也可能不会自动更新,那么我们需要手动更新它。 配置完成后,maven打包可以生成可执行jar文件 在resources文件夹下,创建application.properties 在resources文件夹下,创建templates文件夹 在templates下创建index.html 需要maven执行编译,否则容易

    2024年02月09日
    浏览(35)
  • 如何快速搭建一个SpringBoot项目

    前面我们了解了SpringBoot背景和特点,本节我们主要介绍如何快速构建一个SpringBoot项目,以此来提升日常开发效率。 SpringBoot是搭建应用的手脚架,由Spring公司的核心团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Sp

    2024年02月02日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包