猜测Tomcat如何实现WebSocket协议
一、WebSocket协议的实现
(一)WebSocket是官方的协议接口标准。
(二)如果一门编程语言可以网络连接和并发,就能创建一种WebSocket实现。
(三)同一种编程语言,有不同的协议实现版本和框架。
二、Tomcat实现
在Tomcat容器中实现了对应的WebSocket版本,比较难使用。
(一)需要实现官方接口的实现类。
1、实现javax.websocket.Session接口,实现里面的抽象方法。
需要在子类中定义java.net.Socket类型的成员变量来和客户端通信,读取和接收数据。
2、Tomcat需要用java.net.ServerSocket监听端口,获取来自客户端的连接。
需要用输入输出流来接收和发送二进制数据。
需要判断是否为WebSocket请求,只有满足要求才能调用程序处理。
(二)需要用反射来加载用@ServerEndpoint修饰的类,生成对象。
这些类是用户开发的Websocket通信程序,代表着用户设计的通信逻辑。
(三)每次获得连接需要验证和握手,握手通过后创建和java.net.Socket类的对象相关的会话对象。
该会话对象是javax.websocket.Seesion接口的子类实例。
(四)每次需要根据接收的数据单位,调用事件处理方法,传入接收的数据和参数。
从用户设计的程序中得到监听对象,根据对应注解(例如@OnOpen)来获取方法对象,得到方法参数列表,根据列表来准备参数,调用方法。
1、第一次连接验证通过后,调用@OnOpen修饰的方法。
2、当读取到来自客户端的数据时,需要根据@OnMessage修饰的方法来调用,把数据传递。
3、当读取到是关闭数据包,调用@OnClose修饰的方法。
4、当在数据读取和发送中出现错误,调用@OnError修饰的方法,把错误对象传递该方法。
相关文章:
猜测Tomcat如何实现WebSocket协议
一、WebSocket协议的实现 (一)WebSocket是官方的协议接口标准。 (二)如果一门编程语言可以网络连接和并发,就能创建一种WebSocket实现。 (三)同一种编程语言,有不同的协议实现版本和框架。 二、Tomcat实现 在Tomcat容器中实现了对应的WebSocket版本&am…...
uniApp @input事件更改输入框值,值改变了但是页面没更新新的值
<uni-easyinputtype"text"trim"all":inputBorder"false"v-model"customFormData.completePercent"input"(val) > completeOnInput(val)"placeholder"请输入" /> function completeOnInput(val) {let num…...
两行css 实现瀑布流
html <ul ><li><a href"" ><img src"05094532gc6w.jpg" alt"111" /><p>传奇</p></a></li><li><a href"" ><img src"05094532gc6w.jpg" alt"111"…...
Centos7.9部署单节点K8S环境
Centos7.9部署单节点K8S环境 通过Centos extras镜像源安装K8S环境,优点是方便快捷,缺点是版本较低,安装后的版本为1.5.2。 1. 准备工作 关闭selinux [rootlocalhost ~]# cat /etc/selinux/config# This file controls the state of SELin…...
【CV】stable diffusion初步理解
来自gpt-4o Stable diffusion 和DALLE的关系 Stable Diffusion 和 DALL-E 都是生成图像的人工智能模型,但它们有不同的开发背景和技术实现。 Stable Diffusion: 开发者: 由Stability AI开发,并与CompVis和LAION等组织合作。技术: 基于扩散模型…...
足底筋膜炎最好的恢复办法
足底筋膜炎是一种由足底筋膜受到炎症刺激而引起的疼痛和不适的疾病。其典型症状主要包括: 1、足底疼痛:这是足底筋膜炎最常见的症状。疼痛通常位于足跟部位,患者可能感到刺痛或灼热感。尤其在早晨起床或长时间站立后,这种疼痛感会…...
Fiddler抓包工具介绍
下载 下载:Web Debugging Proxy and Troubleshooting Tools|Fiddler 进去要填一个表 汉化版 百度网盘 请输入提取码 提取码:xq9t 下载过附件之后分别把两个文件 点开fiddler就ok了 配置https fiddler要想抓到https包(解密的),点击tools->options勾选三个对…...
知乎号开始运营了,宣传一波
知乎号开始发布一些小说、散文还有诗歌了,欢迎大家多来关注 知乎链接:姜亚轲 每篇小说都改编成网易云音乐,文章中也有链接,我做的词,Suno编曲和演唱,欢迎大家来听听...
Go 基础丨切片 slice
1. 底层 runtime/slice.go type slice struct {array unsafe.Pointer // 指向底层数组len int // 切片元素数量cap int // 底层数组容量 }reflect/value.go type SliceHeader struct {Data uintptrLen intCap int }2. 创建 根据数组创建 s : arr[0:3]字面…...
哪个牌子充电宝好用?精选四大热门款充电宝品牌!公认好用
在当今快节奏的生活中,充电宝已经成为了我们日常生活中不可或缺的数码伴侣。无论是旅行、出差还是日常通勤,拥有一款好用的充电宝,能够确保我们的手机、平板等设备随时保持充足电量。然而,市场上充电宝品牌繁多,如何选…...
WPF/C#:如何将数据分组显示
WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下: MainWindow.xaml如下: <Window x:Class"Grouping.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&q…...
leetcode 200 岛屿数量
思路 就是深搜,将可以走到的都标为0 ##代码 class Solution {static int[][] to {{1,0},{0,1},{-1,0},{0,-1}};public int numIslands(char[][] grid) {// 深搜int result 0;for (int i 0; i < grid.length; i) {for (int j 0; j < grid[0].length; j)…...
1:25万基础电子地图(江西版)
我们在《50幅1:25万基础电子地图(四川版)》和《1:25基础电子地图(云南版)》等文中,为你分享过四川和云南的基础电子地图。 现在我们再为你分享江西的1:25万基础电子地图,你可以在文…...
【RabbitMQ】初识 RabbitMQ
初识 RabbitMQ 1.认识 RabbitMQ1.1 介绍1. 2.使用场景1.2.1 推送通知1.2.2 异步任务1.2.3 多平台应用的通信1.2.4 消息延迟1.2.5 远程过程调用 1.3 特性 2.基本概念2.1 生产者、消费者和代理2.2 消息队列2.3 交换机2.3.1 direct2.3.2 topic2.3.3 headers2.3.4 fanout 2.4 绑定2…...
Qt QListView自定义树状导航控件
大部分的软件都有多个页面,这时候就需要一个导航栏控件,通过在导航栏中选择某一栏,同时显示对应的页面。 本文代码效果如下: 本文的导航栏控件基于大佬 feiyangqingyun 的导航栏控件博客Qt/C编写自定义控件46-树状导航栏_qt之实现…...
Java 数组的全面解析与应用
Java 中的数组是一种基础且重要的数据结构,用于存储相同类型的多个数据项。它提供了有效的数据组织和访问机制,是 Java 编程中不可或缺的部分。本文将从多个角度全面探讨 Java 数组的特性、操作和实际应用,帮助读者深入理解和有效利用这一数据…...
Thinkphp起名网宝宝起名网站源码
Thinkphp起名网宝宝起名网站源码 源码介绍 1.宝宝在线起名 2.八字起名,周易取名 3.一对一起名 5.支持手机wap 链接数据库地址:Application\Common\Conf 修改里面config.php数据库连接,导入sm.sql数据库文件即可 伪静态用thinkphp 后台…...
【解决方案】【最佳实践】React高阶组件中Refs 不会被传递的问题
大家好,我是DX3906。 最近遇到React高阶组件中Refs 不会被传递的问题。 在这里总结一下解决方案和解决思路:主要是通过从内向外和从外向内2种思路来分析解决的。 目录 前言 解决方案一:React.forwardRef 解决方案二:使用prop…...
SRAM和DRAM
1.SRAM(静态RAM) 把存放一个二进制位的物理器件称为存储元,它是存储器最基本的构件。 地址码相同的多个存储元构成一个存储单元。 存储单元的集合构成存储体。 静态RAM的存储元是用双稳态触发器(六晶体管MOS)来记忆…...
浅析Spring中Async注解底层异步线程池原理
一、前言 开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程,然后启动异步线程;再如,可以直接用java.uti…...
开源物联网平台SiteWhere:微服务架构下的设备管理与数据流实战
1. 项目概述:一个开源的物联网应用平台如果你正在寻找一个能帮你快速搭建、管理和扩展物联网应用的核心平台,而不是从零开始造轮子,那么SiteWhere这个开源项目绝对值得你花时间深入了解。它不是一个简单的设备连接网关,而是一个功…...
从“意大利面”到整洁代码:我是如何用SonarQube重构遗留项目的
从“意大利面”到整洁代码:我是如何用SonarQube重构遗留项目的 接手一个结构混乱的遗留项目,就像面对一盘煮过头的意大利面——各种逻辑纠缠不清,随便动一处就可能引发连锁反应。去年我遇到这样一个Java项目:12万行代码࿰…...
论文降AIGC教程:从标红区到安全线,2026最新3步攻略与工具测评
今年的交稿季有一点很磨人:除了文章重复率,AIGC检测率几乎也成了各处的标配,很多小伙伴接到通知直接懵了。 我之前也有过长文盲改失败的经历:刚拿到初稿就开始一通操作,觉得把文段里面的词语换换同义词就行࿰…...
论文降AI率通关指南:7个实用技巧+高效工具一次讲清
为什么你的论文总被判定为AIGC疑似? 随着AI写作工具的广泛普及,不少科研人员和学生都碰到了同一个头疼的问题:论文AIGC疑似率超标。现在大多数高校都出台了明确规定,AIGC率超过30%就可能被判定为AI代写,直接取消答辩资…...
企业组网实战:用爱快+水星AC打造跨地域无线网络,远程管理分支AP就这么简单
企业级无线组网实战:跨地域统一管理与远程控制方案 在数字化转型浪潮中,中小企业对无线网络的依赖程度越来越高。无论是总部办公室、分支机构还是临时办公点,稳定、安全且易于管理的无线网络已成为企业高效运营的基础设施。然而,…...
CentOS7网络配置与XShell连接实战:从零搭建远程管理环境
1. 环境准备与工具安装 第一次接触Linux服务器管理的新手,往往会被网络配置和远程连接这两个基础操作难住。我自己刚开始学习时,光是让虚拟机联网就折腾了大半天。其实只要掌握正确的方法,整个过程完全可以像搭积木一样简单明了。 首先需要准…...
某恶意软件样本逆向分析报告
1.概述样本来源:微步在线恶意软件名称:刘文博-关于北京体彩中心的问题反馈.exesha256:c28d23d8658abc1f5683c6b50239d5593eb7a274a3abec56124d7fb43fec1b642.行为分析该程序图标设为word文档图标,实际为exe文件,诱骗受…...
A Survey for Image Quality Assessment: From Handcrafted Features to Deep Learning
1. 图像质量评估的起源与核心挑战 当你用手机拍完一张照片,系统自动弹出"画质优化建议"时,背后就是图像质量评估(IQA)技术在发挥作用。这项技术最早可以追溯到上世纪70年代电视信号传输质量检测,当时工程师们…...
第七部分-容器安全与监控——33. 镜像安全
33. 镜像安全 1. 镜像安全概述 镜像是容器的基石,镜像安全问题直接影响容器运行时安全。镜像安全涵盖基础镜像选择、镜像构建过程、镜像存储和分发等环节。 ┌─────────────────────────────────────────────────…...
嵌入式老C代码别重写!IAR项目混编C/C++的保姆级指南(extern “C“详解)
嵌入式老C代码别重写!IAR项目混编C/C的保姆级指南(extern "C"详解) 当你在IAR Embedded Workbench中启动一个新项目,面对那些历经千锤百炼的C语言驱动和BSP代码,是否曾为"推倒重来还是继续维护"而…...
