1. handler的定义

spring websocket支持的消息有以下几种:

对消息的处理就使用了Handler模式,抽象handler类AbstractWebSocketHandler.java

@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {if (message instanceof TextMessage) {handleTextMessage(session, (TextMessage) message);}else if (message instanceof BinaryMessage) {handleBinaryMessage(session, (BinaryMessage) message);}else if (message instanceof PongMessage) {handlePongMessage(session, (PongMessage) message);}else {throw new IllegalStateException("Unexpected WebSocket message type: " + message);}}protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {}protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {}protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {}

具体实现handler类BinaryWebSocketHandler(为例,其它略)

public class BinaryWebSocketHandler extends AbstractWebSocketHandler {@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) {try {session.close(CloseStatus.NOT_ACCEPTABLE.withReason("Text messages not supported"));}catch (IOException e) {// ignore
        }}}

2.handler的使用

StandardWebSocketClient和服务端握手时,调用

@Overrideprotected ListenableFuture<WebSocketSession> doHandshakeInternal(WebSocketHandler webSocketHandler,HttpHeaders headers, final URI uri, List<String> protocols,List<WebSocketExtension> extensions, Map<String, Object> attributes) {int port = getPort(uri);InetSocketAddress localAddress = new InetSocketAddress(getLocalHost(), port);InetSocketAddress remoteAddress = new InetSocketAddress(uri.getHost(), port);final StandardWebSocketSession session = new StandardWebSocketSession(headers,attributes, localAddress, remoteAddress);final ClientEndpointConfig.Builder configBuilder = ClientEndpointConfig.Builder.create();configBuilder.configurator(new StandardWebSocketClientConfigurator(headers));configBuilder.preferredSubprotocols(protocols);configBuilder.extensions(adaptExtensions(extensions));final Endpoint endpoint = new StandardWebSocketHandlerAdapter(webSocketHandler, session);Callable<WebSocketSession> connectTask = new Callable<WebSocketSession>() {@Overridepublic WebSocketSession call() throws Exception {webSocketContainer.connectToServer(endpoint, configBuilder.build(), uri);return session;}};if (this.taskExecutor != null) {return this.taskExecutor.submitListenable(connectTask);}else {ListenableFutureTask<WebSocketSession> task = new ListenableFutureTask<WebSocketSession>(connectTask);task.run();return task;}}

红色部分调用一个适配器StandardWebSocketHandlerAdapter,它封装了Handler的调用

@Overridepublic void onOpen(final javax.websocket.Session session, EndpointConfig config) {this.wsSession.initializeNativeSession(session);if (this.handler.supportsPartialMessages()) {session.addMessageHandler(new MessageHandler.Partial<String>() {@Overridepublic void onMessage(String message, boolean isLast) {handleTextMessage(session, message, isLast);}});session.addMessageHandler(new MessageHandler.Partial<ByteBuffer>() {@Overridepublic void onMessage(ByteBuffer message, boolean isLast) {handleBinaryMessage(session, message, isLast);}});}else {session.addMessageHandler(new MessageHandler.Whole<String>() {@Overridepublic void onMessage(String message) {handleTextMessage(session, message, true);}});session.addMessageHandler(new MessageHandler.Whole<ByteBuffer>() {@Overridepublic void onMessage(ByteBuffer message) {handleBinaryMessage(session, message, true);}});}session.addMessageHandler(new MessageHandler.Whole<javax.websocket.PongMessage>() {@Overridepublic void onMessage(javax.websocket.PongMessage message) {handlePongMessage(session, message.getApplicationData());}});try {this.handler.afterConnectionEstablished(this.wsSession);}catch (Throwable t) {ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, t, logger);return;}}

具体实现

private void handleTextMessage(javax.websocket.Session session, String payload, boolean isLast) {TextMessage textMessage = new TextMessage(payload, isLast);try {this.handler.handleMessage(this.wsSession, textMessage);}catch (Throwable t) {ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, t, logger); } } private void handleBinaryMessage(javax.websocket.Session session, ByteBuffer payload, boolean isLast) { BinaryMessage binaryMessage = new BinaryMessage(payload, isLast); try { this.handler.handleMessage(this.wsSession, binaryMessage); } catch (Throwable t) { ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, t, logger); } } private void handlePongMessage(javax.websocket.Session session, ByteBuffer payload) { PongMessage pongMessage = new PongMessage(payload); try { this.handler.handleMessage(this.wsSession, pongMessage); } catch (Throwable t) { ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, t, logger); }

转载于:https://www.cnblogs.com/davidwang456/p/5672677.html

spring websocket源码分析续Handler的使用相关推荐

  1. spring websocket源码分析

    什么是websocket? 摘录于wiki[1]: WebSocket is a protocol providing full-duplex communication channels over ...

  2. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

  3. spring AOP源码分析(一)

    spring AOP源码分析(一) 对于springAOP的源码分析,我打算分三部分来讲解:1.配置文件的解析,解析为BeanDefination和其他信息然后注册到BeanFactory中:2.为目 ...

  4. Spring AOP 源码分析 - 拦截器链的执行过程

    1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...

  5. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

  6. Spring AOP 源码分析 - 筛选合适的通知器

    1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析.本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出 ...

  7. 源码分析Android Handler是如何实现线程间通信的

    源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...

  8. 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  9. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现

    概述 我们知道 Spring Boot 能够创建独立的 Spring 应用,内部嵌入 Tomcat 容器(Jetty.Undertow),让我们的 jar 无需放入 Servlet 容器就能直接运行. ...

最新文章

  1. python大作业 学生管理系统 以Excel(xls)格式导入文件
  2. 【c语言】蓝桥杯算法训练 1的个数
  3. [转]Hyper-V功能大跃进 或引发市场洗牌
  4. Play-With-Docker在chrome上的插件
  5. python字符串补空格输出_python格式化打印字符串
  6. layui js添加html,layui.js如何声明全局变量?
  7. Notice: Undefined variable: id in D:\phpStudy18\PHPTutorial\WWW\sqli-labs-master\Less-32\index.php o
  8. 如何使用多个端口访问tomcat
  9. 图片压缩但质量不减,这个工具很不错
  10. 读书:《带人的技术》
  11. 详细解读Android中的搜索框(二)—— Search Dialog
  12. 设计模式一(抽象工厂模式)
  13. 2021大厂Java面试真题(分布式 )
  14. python 学习2
  15. 简单计算机硬件知识ppt,计算机硬件知识教程课件.ppt
  16. 进制转换--(2-8)为什么2的3次方=8,所以三位变一位
  17. 常用Linux版本虚拟机的使用比较
  18. python xlwt 设置表格的行高方法
  19. 德威控股在港交所招股书失效:2021年度利润大增,由杨时家族控股
  20. android 短信数据库在哪个文件夹,安卓手机的短信备份后存到了哪个文件夹下

热门文章

  1. python做exe开发教程_python做exe开发教程
  2. c语言产生cl.exe错误,vc++6.0执行cl.exe时出错
  3. 8 一点就消失_微信富二代男友转账20w后,却在见面前一秒消失??...
  4. python xgboost参数_如何对XGBoost模型进行参数调优
  5. c++ 纯虚函数和抽象类那些事(三)
  6. pytorch笔记:VGG 16
  7. 禁忌搜索算法求解带时间窗的车辆路径问题原理讲解
  8. MATLAB实战系列(十八)-遗传算法解决TSP(旅行商)问题-算法原理
  9. Flink从入门到精通100篇(七)-如何基于 Flink 搭建一个实用有效的在线实时反欺诈平台?
  10. tensorflow从入门到精通100讲(四)-细粒度的情感分析Gated Convolutional Networks