netty-websocket-spring-boot-starter gitee地址
环境
SpringBoot 2.1.4
Java8
maven坐标
使用
在端点类上加上@ServerEndpoint
注解,并在相应的方法上加上@BeforeHandshake
、@OnOpen
、@OnClose
、@OnError
、@OnMessage
、@OnBinary
、@OnEvent
注解
官方样例
注解说明
@ServerEndpoint
当ServerEndpointExporter类通过Spring配置进行声明并被使用,它将会去扫描带有@ServerEndpoint注解的类 被注解的类将被注册成为一个WebSocket端点 所有的配置项都在这个注解的属性中 ( 如:@ServerEndpoint("/ws") )
@BeforeHandshake
当有新的连接进入时,对该方法进行回调 注入参数的类型:Session、HttpHeaders...
@OnOpen
当有新的WebSocket连接完成时,对该方法进行回调 注入参数的类型:Session、HttpHeaders...
@OnClose
当有WebSocket连接关闭时,对该方法进行回调 注入参数的类型:Session
@OnError
当有WebSocket抛出异常时,对该方法进行回调 注入参数的类型:Session、Throwable
@OnMessage
当接收到字符串消息时,对该方法进行回调 注入参数的类型:Session、String
@OnBinary
当接收到二进制消息时,对该方法进行回调 注入参数的类型:Session、byte[]
@OnEvent
当接收到Netty的事件时,对该方法进行回调 注入参数的类型:Session、Object
配置说明
属性 | 默认值 | 说明 |
---|---|---|
path | "/" | WebSocket的path,也可以用value 来设置 |
host | "0.0.0.0" | WebSocket的host,"0.0.0.0" 即是所有本地地址 |
port | 80 | WebSocket绑定端口号。如果为0,则使用随机端口(端口获取可见 多端点服务) |
bossLoopGroupThreads | 0 | bossEventLoopGroup的线程数 |
workerLoopGroupThreads | 0 | workerEventLoopGroup的线程数 |
useCompressionHandler | false | 是否添加WebSocketServerCompressionHandler到pipeline |
optionConnectTimeoutMillis | 30000 | 与Netty的ChannelOption.CONNECT_TIMEOUT_MILLIS 一致 |
optionSoBacklog | 128 | 与Netty的ChannelOption.SO_BACKLOG 一致 |
childOptionWriteSpinCount | 16 | 与Netty的ChannelOption.WRITE_SPIN_COUNT 一致 |
childOptionWriteBufferHighWaterMark | 64*1024 | 与Netty的ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK 一致,但实际上是使用ChannelOption.WRITE_BUFFER_WATER_MARK |
childOptionWriteBufferLowWaterMark | 32*1024 | 与Netty的ChannelOption.WRITE_BUFFER_LOW_WATER_MARK 一致,但实际上是使用 ChannelOption.WRITE_BUFFER_WATER_MARK |
childOptionSoRcvbuf | -1(即未设置) | 与Netty的ChannelOption.SO_RCVBUF 一致 |
childOptionSoSndbuf | -1(即未设置) | 与Netty的ChannelOption.SO_SNDBUF 一致 |
childOptionTcpNodelay | true | 与Netty的ChannelOption.TCP_NODELAY 一致 |
childOptionSoKeepalive | false | 与Netty的ChannelOption.SO_KEEPALIVE 一致 |
childOptionSoLinger | -1 | 与Netty的ChannelOption.SO_LINGER 一致 |
childOptionAllowHalfClosure | false | 与Netty的ChannelOption.ALLOW_HALF_CLOSURE 一致 |
readerIdleTimeSeconds | 0 | 与IdleStateHandler 中的readerIdleTimeSeconds 一致,并且当它不为0时,将在pipeline 中添加IdleStateHandler |
writerIdleTimeSeconds | 0 | 与IdleStateHandler 中的writerIdleTimeSeconds 一致,并且当它不为0时,将在pipeline 中添加IdleStateHandler |
allIdleTimeSeconds | 0 | 与IdleStateHandler 中的allIdleTimeSeconds 一致,并且当它不为0时,将在pipeline 中添加IdleStateHandler |
maxFramePayloadLength | 65536 | 最大允许帧载荷长度 |
通过application.properties进行配置
所有参数皆可使用${...}
占位符获取application.properties
中的配置
首先在@ServerEndpoint
注解的属性中使用${...}
占位符
接下来即可在application.properties
中配置
多端点服务
- 在快速启动的基础上,在多个需要成为端点的类上使用
@ServerEndpoint
、@Component
注解即可 - 可通过
ServerEndpointExporter.getInetSocketAddressSet()
获取所有端点的地址 - 当地址不同时(即host不同或port不同),使用不同的
ServerBootstrap
实例 - 当地址相同,路径(path)不同时,使用同一个
ServerBootstrap
实例 - 当多个端点服务的port为0时,将使用同一个随机的端口号
- 当多个端点的port和path相同时,host不能设为
"0.0.0.0"
,因为"0.0.0.0"
意味着绑定所有的host
注入Spring管理的Bean
参考:https://blog.csdn.net/m0_37202351/article/details/86255132
初始化:项目启动时,spring 工厂会创建 websocket 的单例对象(此时注解合法,spring 就会为 TestSocket类的属性 SomeService进行注入,并创建一个单例对象,spring 并不知道 websocket 的特殊意义,只是该类的注解合法,便会进行操作,与其他 controller 进行的操作一模一样),因此 chatService 不是 null。
接通时:当websocket接通时,,后台(不管是tomcat 还是java)会根据 TestSocket类创建一个新的 TestSocket对象,保存与用户的连接。因为someService是属于类的,所以也不是 null