当前位置: 首页 > news >正文

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

Netty netty-websocket-spring-boot-starter

  • 一、前言
  • 二、快速开始
    • 1. 引入pom坐标
    • 2. websocket实现
    • 3. 启动成功
  • 三、总结

一、前言

本文讲述 基于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.12.0</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();
    }


    /**
     * 当接收到字符串消息时,调用
     *
     * @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. 启动成功

在这里插入图片描述

三、总结

好像没啥可总结的, 有疑问,或者集成失败的,或者使用过程中的问题请留言。

相关文章:

  • C语言for循环结构经典练习
  • 【老生谈算法】matlab实现元胞自动机算法源码——元胞自动机
  • wireshark协议或者协议内容解码异常
  • nginx部署vue项目(包括一个nginx部署多个vue项目)
  • 【py】[打包exe]用auto-py-to-exe将py程序打包为exe文件
  • 【数据库迁移系列】使用pgloader将数据从MySQL迁移到openGauss的最佳实践
  • 广和通携智慧金融解决方案惊艳亮相紫光展锐2022金融支付生态论坛
  • 安装Java环境
  • vue(js)拖拽事件的drop失效
  • RFID技术,让书架智能化
  • Android 导出PDF PdfDocument
  • 《kaggle竞赛攻顶秘笈》 | 任务种类 | 任务评价指标 | 评价指标与目标函数 | 评价指标最佳化
  • 干货:秒懂redis集群
  • VNC 远程桌面很卡,替代方案如下
  • gitee 的使用
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • ES6简单总结(搭配简单的讲解和小案例)
  • js操作时间(持续更新)
  • Less 日常用法
  • React16时代,该用什么姿势写 React ?
  • React-redux的原理以及使用
  • Redux系列x:源码分析
  • Ruby 2.x 源代码分析:扩展 概述
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vuex 学习笔记 01
  • webpack入门学习手记(二)
  • 高程读书笔记 第六章 面向对象程序设计
  • 小程序01:wepy框架整合iview webapp UI
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • kubernetes资源对象--ingress
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​MySQL主从复制一致性检测
  • # 达梦数据库知识点
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (6)设计一个TimeMap
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (多级缓存)缓存同步
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (转)Oracle存储过程编写经验和优化措施
  • (转)大道至简,职场上做人做事做管理
  • .NET Core Web APi类库如何内嵌运行?
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core跨平台微服务学习资源
  • .net FrameWork简介,数组,枚举
  • .NET 分布式技术比较
  • .NET6实现破解Modbus poll点表配置文件
  • .NET与 java通用的3DES加密解密方法
  • .NET中GET与SET的用法
  • /usr/bin/env: node: No such file or directory
  • [C进阶] 数据在内存中的存储——浮点型篇