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 {
    @OnMessage
    public 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(防止抄袭,原文地址不可删除)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935074.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot Maven快速上手

文章目录 一、Maven 1.1 Maven 简介&#xff1a;1.2 Maven 的核心功能&#xff1a; 1.2.1 项目构建&#xff1a;1.2.2 依赖管理&#xff1a; 1.3 Maven 仓库&#xff1a; 1.3.1 本地仓库&#xff1a;1.3.2 中央仓库&#xff1a;1.3.3 私服&#xff1a; 二、第一个 SpringBoot…

【论文阅读】处理器芯片敏捷设计方法:问题与挑战

作者&#xff1a;包云岗老师 包云岗老师是计算机体系结构方向的大牛&#xff0c;推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会&#xff1a; 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…

方案介绍|CW32L010安全低功耗MCU:驱动高速风筒新力量

吹风机一直以来都是消费者日常生活中的高频刚需产品&#xff0c;而高速风筒更是因为其快速干发、护发养发和低噪音的优势&#xff0c;逐渐成为家庭不可或缺的电器之一。 高速风筒通过采用高速电机和优化的气流设计&#xff0c;能够在短时间内快速吹干头发&#xff0c;同时减少…

uniapp uni-table最简单固定表头

需求&#xff1a;固定表头数据&#xff0c;在网上找了半天&#xff0c;啥都有&#xff0c;就是一直实现不了&#xff0c;最后更改代码实现 1.效果 2.主要代码讲解完整代码 表格的父级一定要设置高度&#xff0c;不然会错位&#xff0c;我看网上说设置position&#xff1a;fixed…

单元测试SpringBoot

添加测试专用属性 加载测试专用bean Web环境模拟测试 数据层测试回滚 测试用例数据设定

9. Win11上原生运行Ubuntu

本文介绍如何在win11原生系统上运行ubuntu&#xff0c;不需要额外安装虚拟机&#xff0c;以及如何配置网络等。 1.安装正版Win11 由于正版Win11需要钱&#xff0c;网上能破解的win11可能有问题&#xff0c;但是它们的破解工具&#xff0c;却是能正常用的&#xff0c;所以&…

小皮面板(PHPSTUDY)配置多个域名或IP

问题描述 小皮面板默认采用nginx的静态部署&#xff0c;按照使用nginx的习惯只需要额外添加一个server即可&#xff0c;但是会发现直接往配置文件里添加新的server是不生效的&#xff0c;小皮的官网论坛几乎已经停止维护&#xff0c;因此资料较少&#xff0c;原本也没有仔细使…

基于自注意力网络的SASRec

运用了自注意力网络&#xff08;self-attention network&#xff0c;SAN&#xff09;的序列推荐算法&#xff08;SASRec&#xff09;能以并行化的方式捕捉同一序列上不同时间步间的转移关系&#xff0c;最后通过加权求和的方式得出每个时间步的序列特征。 算法原理&#xff1a;…

软件工程知识点

CMMI 阶段式模型 初始的&#xff1a;过程不可预测且缺乏控制。 已管理的&#xff1a;过程为项目服务。 已定义的&#xff1a;过程为组织服务。 定量管理的&#xff1a;过程已度量和控制。 优化的&#xff1a;集中于过程改进。 CMMI连续式模型 CL0&#xff08;未完成的&#…

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(上)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Windows11安装Isaac Lab

1.1 下载文件 将 Isaac Lab 仓库克隆到您的工作空间&#xff1a; git clone https://github.com/isaac-sim/IsaacLab.git 1.2 创建Isaac Sim符号链接 F:cd IsaacLab 官方文档里路径/有问题&#xff0c;改成\&#xff09;&#xff1a; # 打开IsaacLab目录cd IsaacLab# 使用…

AI 的时代,新科技和新技术如何推动跨学科的整合?

在当前AI的发展中&#xff0c;我们面临的一个主要挑战就是融合的问题&#xff0c;这实际上不仅是技术上的融合&#xff0c;还有更深层次的哲学层面的思考。 或许在中国这方面的讨论较少&#xff0c;但在西方哲学和神学的语境中&#xff0c;探讨万物的根本和不同学科之间的联系…

力扣打卡12:复原IP地址

链接&#xff1a;93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 这道题需要对字符串进行操作&#xff0c;我选择了三层循环&#xff0c;其实还可以递归。 我在循环时进行了剪枝&#xff0c;比如一些情况直接跳出循环。 我的代码&#xff1a; class Solution { p…

R学习——数据框

目录 1数据框的合并 2数据框的访问 2.1 通过索引[] 2.2符号$访问 2.3 attach访问 2.4 with访问 1数据框的合并 当每个内容存储为单独的向量&#xff0c;data.frame可以进行这些内容单独数据框合并。 2数据框的访问 2.1 通过索引[] [i]输出对应的列 [i,]输出对应的行 …

XMOS将在CES 2025上展出多款由边缘AI驱动的创新音效、音频、识别和处理解决方案

全球智能物联网技术领导者暨匠心独到的半导体科技企业XMOS宣布&#xff1a;该公司将再次参加2025年国际消费电子展&#xff08;CES 2025&#xff09;&#xff0c;并将在本届CES上展出一系列由人工智能&#xff08;AI&#xff09;驱动的全新空间音效、语音捕获与降噪、音视频多模…

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…

密码学——密码学基础、散列函数与数字签名

1.密码学概述 是信息安全的基础和核心&#xff0c;是防范各种安全威胁的重要手段&#xff0c;信息安全的许多相关知识都与密码学相关。 密码学发展 密码学是一门古老而又年轻的学科 &#xff0c;几千年以前就存在&#xff0c;至今仍在发展演进。地位非常重要甚至起决定性作用…

李飞飞的生成式3D场景,对数字孪生的未来影响几何?

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;致力于技术与艺术的融合。这是2024年输出的第47/100篇文章。 前言 这两天&#xff0c;AI界的教母李飞飞团队重磅发布了空间智能生成式AI大模型。 仅通过一张图片就能够生成一个可操作和交互的3D空间场景。 空间智能的…

H3C NAT实验

实验拓扑 实验需求 按照图示配置 IP 地址私网 A 通过 R1 接入到互联网&#xff0c;私网 B 通过 R3 接入到互联网私网 A 内部存在 Vlan10 和 Vlan20&#xff0c;通过 R1 上单臂路由访问外部网络私网 A 通过 NAPT 使 Vlan10 和 Vlan20 都能够使用 R1 的公网地址访问互联网私网 B…

【Java Web】Tomcat 快速入门

通常&#xff0c;为了让 Java 开发的应用程序&#xff08;app&#xff09;能够在服务器上正常运行&#xff0c;必须安装 Java 运行时环境&#xff08;JRE&#xff09;。JRE 主要支持 Java SE&#xff0c;而如果要运行 Java EE 应用&#xff0c;则需要更多的支持&#xff0c;比如…