WebSocket | Netty netty-websocket-spring-boot-starter

一、前言

本文讲述 基于springboot + netty 实现websocket服务端搭建。

使用springboot 集成 netty-websocket-spring-boot-starter 来实现websocket

也有直接通过netty 代码方式实现的方式但是不推荐,传统方式暂时我还无法找到通过url的方式来进行路由区分的,需要每个业务场景定义一个端口。
netty代码方式实现地址https://blog.csdn.net/qq825478739/article/details/126263050

需要了解netty的 请点击网址查看我总结的一些netty的介绍
netty介绍地址:还没完善后边不上

netty-websocket-spring-boot-starter gitee地址:https://gitee.com/Yeauty/netty-websocket-spring-boot-starter

二、快速开始

1. 引入pom坐标

	<dependency>
		<groupId>org.yeauty</groupId>
		<artifactId>netty-websocket-spring-boot-starter</artifactId>
		<version>0.9.5</version>
	</dependency>

2. websocket实现

/**
 * 当springboot 项目启动会通过自动装配 找到netty-websocket-spring-boot-starter 中META-INF 加载 NettyWebSocketAutoConfigure
 * 通过@EnableWebSocket -> @Import({NettyWebSocketSelector.class})
 * 在 NettyWebSocketSelector 中会创建  Bean ServerEndpointExporter 被Spring声明并使用
 *
 * ServerEndpointExporter 类通过Spring配置声明并被使用,
 * ServerEndpointExporter 将会去扫描带有@ServerEndpoint 注解的类注册成为一个WebSocket断电。
 * 所有的配置项都在这个@ServerEndpoint注解属性中  ( 如:@ServerEndpoint("/ws") )
 * 
 */
 //TODO 不需要加Spring的注解加载, 多例的,每次请求过来都会创建一个新的可以通过。无参构造查看
// port 默认80  host默认 0.0.0.0
@ServerEndpoint(path = "/ws/{arg}",port = "80",host = "0.0.0.0")
public class MyWebSocket {

    public MyWebSocket() {
        System.out.println("通过这里可以看到 每次请求过来都会创建");
    }

    /**
     * 当有新的连接进入时,对该方法进行回调 注入参数的类型  一般用不是 可以去掉
     *
     * @param session
     * @param headers
     * @param req
     * @param reqMap
     * @param arg
     * @param pathMap
     */
    @BeforeHandshake
    public void handshake(Session session, HttpHeaders headers, @RequestParam String req, @RequestParam MultiValueMap reqMap, @PathVariable String arg, @PathVariable Map pathMap){
        session.setSubprotocols("stomp");
        if (!"ok".equals(req)){
            System.out.println("Authentication failed!");
            session.close();
        }
    }

    /**
     * 当有新的WebSocket连接完成时,会调用这个方法
     *
     * @param session
     * @param headers
     * @param req
     * @param reqMap
     * @param arg
     * @param pathMap
     */
    @OnOpen
    public void onOpen(Session session, HttpHeaders headers, @RequestParam String req, @RequestParam MultiValueMap reqMap, @PathVariable String arg, @PathVariable Map pathMap){
        System.out.println("new connection");
        System.out.println(req);
    }

    /**
     * 当有WebSocket 关闭连接时 调用
     *
     * @param session
     * @throws IOException
     */
    @OnClose
    public void onClose(Session session) throws IOException {
       System.out.println("one connection closed"); 
    }

    /**
     * 当有WebSocket 抛出异常 调用
     *
     * @param session
     * @param throwable
     */
    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }


    /**
     * 当接收到字符串消息时,调用
     *  message 请求参数 只能用字符串接收否则会报错 类型转换异常
     *
     * @param session
     * @param message
     */
    @OnMessage
    public void onMessage(Session session, String message) {
        System.out.println(message);

        //TODO 发送消息
        session.sendText("Hello Netty!");
    }

    /**
     * 当接收到二进制消息时 调用
     *
     * @param session
     * @param bytes
     */
    @OnBinary
    public void onBinary(Session session, byte[] bytes) {
        for (byte b : bytes) {
            System.out.println(b);
        }
        session.sendBinary(bytes); 
    }

    /**
     * 当接收到Netty的事件时 调用
     *
     * @param session
     * @param evt
     */
    @OnEvent
    public void onEvent(Session session, Object evt) {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
            switch (idleStateEvent.state()) {
                case READER_IDLE:
                    System.out.println("read idle");
                    break;
                case WRITER_IDLE:
                    System.out.println("write idle");
                    break;
                case ALL_IDLE:
                    System.out.println("all idle");
                    break;
                default:
                    break;
            }
        }
    }

}

3. 启动成功

在这里插入图片描述

三、总结

在使用过程中遇到一个问题 ,当 onMessage 方法 接收参数用对象接收的话会报错。
我以为@RequestParam


错误使用方式
在这里插入图片描述
在这里插入图片描述
将对象改成字符串接收。再用Json转换把。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Netty-WebSocket-Spring-Boot-Starter是一个用于将Websocket集成到Spring Boot应用程序中的库。它使用Netty作为底层框架,提供了一种快速和可靠的方式来处理异步通信。 这个库提供了一种简单的方法来创建Websocket端点,只需要使用注释和POJO类即可。在这些端点上可以添加动态的事件处理程序,以处理连接、断开连接和消息事件等。 此外,Netty-WebSocket-Spring-Boot-Starter还包括了一些安全性的特性,如基于令牌的授权和XSS保护,可以帮助您保持您的Websocket应用程序安全。 总的来说,Netty-WebSocket-Spring-Boot-Starter提供了一种快速和易于使用的方式来构建Websocket应用程序,使得它成为应用程序开发人员的有用工具。 ### 回答2: netty-websocket-spring-boot-starter 是一个开源的 Java Web 开发工具包,主要基于 Netty 框架实现了 WebSocket 协议的支持,同时集成了 Spring Boot 框架,使得开发者可以更加方便地搭建 WebSocket 服务器。 该工具包提供了 WebSocketServer 配置类,通过在 Spring Boot 的启动配置类中调用 WebSocketServer 配置类,即可启动 WebSocket 服务器。同时,该工具包还提供了多种配置参数,如端口号、URI 路径、SSL 配置、认证配置等等,可以根据业务需求进行自定义配置。 此外,该工具包还提供了一些可扩展的接口和抽象类,如 WebSocketHandler、ChannelHandlerAdapter 等,可以通过继承和实现这些接口和抽象类来实现业务逻辑的处理和拓展。 总的来说,netty-websocket-spring-boot-starter 提供了一个高效、简单、易用的 WebSocket 服务器开发框架,可以减少开发者的开发成本和工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一介草民丶

谢谢老板的一分钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值