JAVA |日常开发中Websocket详解
JAVA |日常开发中Websocket详解
- 前言
- 一、Websocket 概述
- 1.1 定义
- 1.2 优势
- 二、Websocket 协议基础
- 2.1 握手过程
- 2.2 消息格式
- 2.3 数据传输方式
- 三、Java 中使用 Websocket
- 3.1 Java WebSocket API(JSR - 356)
- 3.2 第三方库(如 Tyrus)
- 四、应用场景
- 4.1 实时聊天应用
- 4.2 实时数据推送(如股票行情、体育赛事比分)
- 4.3 在线游戏
- 结束语
- 优质源码分享
JAVA |日常开发中Websocket详解
,WebSocket是一种在单个TCP连接上进行全双工通信的协议,它在Web应用中实现了客户端与服务器之间的实时数据传输。与HTTP不同,WebSocket在建立连接后,客户端和服务器都可以随时向对方发送数据,而无需像HTTP那样每次请求都需要建立新的连接。这使得WebSocket非常适合需要实时通信的场景,如在线聊天、实时通知、股票行情推送等。本文将详细介绍Java开发中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事项。
前言
在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。
一、Websocket 概述
1.1 定义
Websocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时的、双向的数据传输,与传统的 HTTP 请求 - 响应模式不同,HTTP 是单向的,客户端请求,服务器响应后连接就关闭,而 Websocket 保持连接打开,以便随时交换数据。
例如,在一个实时聊天应用中,Websocket 可以让客户端(如浏览器)和服务器之间实时地发送和接收聊天消息,而不需要像传统的 HTTP 轮询那样频繁地发送请求来检查是否有新消息。
1.2 优势
实时性高:能够实现服务器和客户端之间的实时通信,数据可以即时地在双方之间传递,减少了延迟。这对于需要实时更新数据的应用场景,如股票交易平台、在线游戏等非常关键。
高效节能:相较于传统的 HTTP 轮询(客户端定时向服务器发送请求来获取最新信息),Websocket 避免了频繁建立和断开连接的开销,从而节省了网络资源和服务器资源,提高了效率。
跨平台支持:Websocket 协议是基于 TCP 协议的,并且在现代浏览器和大多数服务器环境中都有良好的支持,这使得它可以方便地用于开发跨平台的实时应用。
二、Websocket 协议基础
2.1 握手过程
Websocket 协议在建立连接时需要进行握手。客户端首先向服务器发送一个 HTTP 请求,这个请求中包含一些特殊的头部信息,用于表明这是一个 Websocket 请求。例如,请求头中包含Upgrade: websocket和Connection: Upgrade字段,用于请求将协议从 HTTP 升级到 Websocket。
服务器收到请求后,如果支持 Websocket 协议并且同意升级,会返回一个响应,其中包含101 Switching Protocols状态码,表示协议切换成功,之后双方就建立了 Websocket 连接。
2.2 消息格式
Websocket 消息主要有两种格式:文本格式和二进制格式。消息以帧(frame)为单位进行传输,一个完整的消息可以由一个或多个帧组成。
文本消息以 UTF - 8 编码进行传输,方便处理文本数据,如聊天消息等。二进制格式则适用于传输图像、音频、视频等二进制数据。
2.3 数据传输方式
全双工通信意味着客户端和服务器都可以主动发送消息。在连接建立后,任何一方都可以随时发送数据,并且不需要等待对方的请求。例如,服务器可以主动向客户端推送实时的股票价格变化,同时客户端也可以向服务器发送交易指令。
三、Java 中使用 Websocket
3.1 Java WebSocket API(JSR - 356)
简介:Java 提供了 WebSocket API 来方便地在 Java 应用中实现 Websocket 功能。这个 API 定义了客户端和服务器端的接口,使得开发者可以轻松地构建 Websocket 应用。
服务器端实现示例:
首先,创建一个@ServerEndpoint注解的类来表示 Websocket 服务器端点。
import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/chat")
public class ChatServer {@OnMessagepublic String onMessage(String message) {// 简单的消息处理,例如将消息转换为大写return message.toUpperCase();}
}
在上述示例中,@ServerEndpoint("/chat")注解定义了 Websocket 服务器端点的路径为/chat。@OnMessage注解标记的方法会在收到消息时被调用,这里只是简单地将收到的消息转换为大写并返回。
客户端实现示例:
客户端需要创建一个WebSocketContainer来建立连接并发送和接收消息。
import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.net.URI;
public class ChatClient {public static void main(String[] args) {try {WebSocketContainer container = ContainerProvider.getWebSocketContainer();String uri = "ws://localhost:8080/chat";javax.websocket.Session session = container.connectToServer(ChatClientEndpoint.class, new URI(uri));// 发送消息session.getBasicRemote().sendText("Hello");// 接收消息String response = session.getBasicRemote().receiveText();System.out.println("收到回复: " + response);} catch (Exception e) {e.printStackTrace();}}
}
在这个客户端示例中,首先获取WebSocketContainer,然后通过connectToServer方法连接到服务器端点。之后可以使用sendText发送消息,使用receiveText接收消息。
3.2 第三方库(如 Tyrus)
简介:Tyrus 是一个流行的 Websocket 实现库,它提供了丰富的功能和更好的性能。它是 Java EE 规范的参考实现,支持 JSR - 356 标准。
示例代码(服务器端):
添加 Tyrus 依赖到项目(以 Maven 为例)。
<dependency><groupId>org.glassfish.tyrus - servlet</groupId><artifactId>tyrus - servlet</artifactId><version>1.15</version>
</dependency>
创建服务器端点类。
import org.glassfish.tyrus.server.Server;
public class TyrusChatServer {public static void main(String[] args) {Server server = new Server("localhost", 8080, "/", null, ChatServerEndpoint.class);try {server.start();System.out.println("服务器已启动");// 保持服务器运行Thread.sleep(Long.MAX_VALUE);} catch (Exception e) {e.printStackTrace();} finally {server.stop();}}
}
其中ChatServerEndpoint类可以类似于前面 JSR - 356 中的服务器端点类定义,用于处理消息。
示例代码(客户端):
同样需要添加 Tyrus 客户端依赖。
<dependency><groupId>org.glassfish.tyrus - client</groupId><artifactId>tyrus - client</artifactId><version>1.15</version>
</dependency>
客户端连接和消息发送接收示例。
import org.glassfish.tyrus.client.ClientManager;
import javax.websocket.Session;
import java.io.IOException;
import java.net.URI;
public class TyrusChatClient {public static void main(String[] args) {try {ClientManager clientManager = new ClientManager();String uri = "ws://localhost:8080/chat";Session session = clientManager.connectToServer(ChatClientEndpoint.class, new URI(uri));// 发送消息session.getBasicRemote().sendText("Hello");// 接收消息String response = session.getBasicRemote().receiveText();System.out.println("收到回复: " + response);} catch (Exception e) {e.printStackTrace();}}
}
四、应用场景
4.1 实时聊天应用
这是 Websocket 最典型的应用场景之一。用户在浏览器中打开聊天界面,通过 Websocket 与服务器建立连接。当用户发送聊天消息时,消息通过 Websocket 即时传输到服务器,服务器再将消息转发给其他相关用户的客户端,实现实时聊天功能。
4.2 实时数据推送(如股票行情、体育赛事比分)
对于需要实时更新数据的应用,如金融领域的股票行情监控应用,Websocket 可以让服务器在股票价格发生变化时,立即将最新价格推送给客户端。体育赛事比分更新也是类似的,观众可以在浏览器中实时看到比分的变化,而不需要手动刷新页面。
4.3 在线游戏
在多人在线游戏中,Websocket 用于实时同步玩家的操作和游戏状态。例如,在一个多人竞技游戏中,玩家的移动、攻击等操作可以通过 Websocket 即时传输到服务器,服务器再将这些信息广播给其他玩家,确保游戏的实时性和公平性。
结束语
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
优质源码分享
-
【百篇源码模板】html5各行各业官网模板源码下载
-
【模板源码】html实现酷炫美观的可视化大屏(十种风格示例,附源码)
-
【VUE系列】VUE3实现个人网站模板源码
-
【HTML源码】HTML5小游戏源码
-
【C#实战案例】C# Winform贪吃蛇小游戏源码
💞 关注博主 带你实现畅游前后端
🏰 大屏可视化 带你体验酷炫大屏
💯 神秘个人简介 带你体验不一样得介绍
🎀 酷炫邀请函 带你体验高大上得邀请
① 🉑提供云服务部署(有自己的阿里云);
② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
如🈶合作请联系我,期待您的联系。
注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。
亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌
原文地址:https://blog.csdn.net/weixin_43151418/article/details/144187452(防止抄袭,原文地址不可删除)
相关文章:

JAVA |日常开发中Websocket详解
JAVA |日常开发中Websocket详解 前言一、Websocket 概述1.1 定义1.2 优势 二、Websocket 协议基础2.1 握手过程2.2 消息格式2.3 数据传输方式 三、Java 中使用 Websocket3.1 Java WebSocket API(JSR - 356)3.2 第三方库(如 Tyrus&…...

Typora教程
目录 一、下载安装 二、激活 1.激活 2.解决激活提示窗口 一、下载安装 去官网下载Typora安装,我的是1.9.5版本 二、激活 1.激活 根据路径找到Typora/resources/page-dist/static/js 使用记事本打开LicenseIndex文件,如下图: 按住快捷…...

泛微E9常见API保姆级详解!!!!
前言 在泛微前端开发过程中,虽然大部分是对流程以及流程逻辑的调整,但是还是会有一些小的个性化需求是需要借助JS来实现的。 比如:对同一组数据,前后变化不一样时,需要对这组变化后的数据进行标红处理;对提…...
UniApp配置使用原子化tailwindcss
参考视频 创建项目 新建项目选择uniapp - vue版本这里我选择3 - 点击创建即可 创建完成后,如果是要编译到小程序的项目则可以先将项目运行到小程序打开了 初始化package.json 执行 npm init -y安装和配置 安装 npm i -D tailwindcss postcss autoprefixer # 安…...

02. Docker:安装和操作
目录 一、Docker的安装方式 1、实验环境准备 1.1 关闭防火墙 1.2 可以访问网络 1.3 配置yum源 2、yum安装docker 2.1 安装docker服务 2.2 配置镜像加速 2.3 启动docker服务 3、二进制安装docker 3.1 下载或上传安装包并解压 3.2 配置使用systemctl管理 3.3 配置镜像…...

【MySQL中多表查询和函数】
目录 1.多表查询 1.1 外键 1.2 链接查询 2.MySQL函数 内置函数简介 数值函数 字符串函数 时间日期函数 条件判断操作 开窗函数 1.多表查询 本质:把多个表通过主外键关联关系链接(join)合并成一个大表,在去单表查询操作…...

加速科技精彩亮相ICCAD 2024
12月11日—12日 ,中国集成电路设计业的年度盛会——ICCAD 2024在上海世博馆隆重举行。本次活动以“智慧上海,芯动世界”为主旨,汇聚了众多业界精英,共同探讨集成电路产业的未来。作为半导体测试行业领军企业,加速科技携…...

免费下载 | 2024算网融合技术与产业白皮书
《2024算网融合技术与产业白皮书(2023年)》的核心内容概括如下: 算网融合发展概述: 各国细化算网战略,指引行业应用创新升级。 算网融合市场快速增长,算力互联成为投资新热点。 算网融合产业模式逐渐成型…...

Ubuntu系统下部署大语言模型:Ollama和OpenWebUI实现各大模型的人工智能自由
之前在window下安装过 Ollama和OpenWebUI搭建本地的人工智能web项目(可以看我之前写的文章),无奈电脑硬件配置太低,用qwen32b就很卡,卡出PPT了,于是又找了一台机器安装linux系统,在linux系统下测试一下速度能否可以快一些。 系统硬件介绍 Ubuntu 22.04.4 LTS CPU: i5…...

基于Mybatis,MybatisPlus实现数据库查询分页功能
基于Mybatis,MybatisPlus实现数据库查询分页功能 目录 基于Mybatis,MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据: 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…...

【razor】echo搭配relay功能分析
echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…...

技术文档的定义和规范,以及技术文档模板参考
技术文档是指用于记录、传达和共享技术信息的文档,通常涵盖系统设计、开发过程、用户指南、维护手册等内容。技术文档的质量直接影响到项目的可维护性、可扩展性和团队的协作效率。以下是技术文档的定义和一些规范: 一、定义 技术文档是用于描述产品、系…...

基于windows环境使用nvm安装多版本nodejs
目录 前言 一、卸载node 二、nvm是什么? 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…...
力扣9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而…...
C#—BitArray点阵列
C#—BitArray点阵列 在 C# 中,BitArray 类用来管理一个紧凑型的位值数组,数组中的值均为布尔类型,其中 true(1)表示此位为开启,false(0)表示此位为关闭。 当需要存储位(…...

国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证
华为于今年10月22日在深圳正式发布了其原生鸿蒙系统HarmonyOS NEXT。这是我国首个实现全栈自研的操作系统,标志着中国在操作系统领域取得了突破性进展。HarmonyOS NEXT 5.0的发布,使得鸿蒙操作系统成为继苹果iOS和安卓系统之后的全球第三大移动操作系统&…...
esxi8 虚拟机使用ubuntu22模板后 没有ip配置文件,只有ipv6链接正常使用
esxi8 虚拟机使用模板后 没有ip配置文件,只有ipv6链接正常使用,/etc/NetworkManager/system-connections配置下没有配置文件 只有/etc/netplan/有文件 sudo ip addr add 192.168.1.9/24 dev ens35 # 临时设置ip, 接口名ens35 sudo vi /et…...
【Qualcomm】IPQ5018查看连接终端RSSI、SNR、NF方法
IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...

【构建工具】现代开发的重要角色
你可能有所听闻构建工具,但是不知道是干什么的,或者是开发中用到了,大概会使用,但是想理解一下具体的工作原理等,那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时,可以把它…...

【Linux系统】—— 初识 shell 与 Linux 中的用户
【Linux系统】—— 初识shell 与 Linux 中的用户 1 Xshell 运行原理1.1 命令行的组成1.2 外壳程序 2 Linux中的用户2.1 两种用户2.2 创建普通用户2.3 用户切换2.3.1 普通->超级2.3.2 超级->普通 3 指令的短暂提权3.1 为什么要提权3.2 sudo 指令3.3 人人都能提权吗 1 Xshe…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...