WebSocket——学习

WebSocket

      • WebSocket 的基本概念
        • 什么是 WebSocket?
        • WebSocket 的优点
      • WebSocket 的工作原理
        • 握手过程
        • 数据传输
      • WebSocket API
        • JavaScript WebSocket API
      • WebSocket 服务器端实现
        • 使用 Java 实现 WebSocket 服务器
        • 使用 Netty 实现 WebSocket 服务器
      • WebSocket 应用场景
      • 总结

WebSocket 是一种全双工通信协议,允许在客户端和服务器之间进行实时的双向通信。它是在 HTML5 标准中引入的,旨在解决传统 HTTP 协议在实时通信中的一些限制。

WebSocket 的基本概念

什么是 WebSocket?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它与 HTTP 协议的主要区别在于 WebSocket 允许服务器主动向客户端推送消息,而不仅仅是响应客户端的请求。

WebSocket 的优点
  • 低延迟:WebSocket 是一种持久化的连接,客户端和服务器之间只需要一次握手,之后的数据交换都通过这个单一连接进行,减少了延迟。
  • 双向通信:允许服务器和客户端随时发送消息,适合实时应用。
  • 减少开销:WebSocket 连接建立后,通信报文头信息较小,减少了数据传输的开销。

WebSocket 的工作原理

握手过程

WebSocket 连接是通过标准 HTTP/HTTPS 请求发起的。客户端发送一个带有特定头信息的 HTTP 请求到服务器,服务器在接受并识别到这个请求是 WebSocket 请求后,会返回一个 HTTP 101 状态码响应,表示协议切换成功。

客户端握手请求

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器握手响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
数据传输

握手完成后,WebSocket 连接建立,客户端和服务器可以相互发送消息。消息可以是文本或二进制数据。WebSocket 数据帧具有较小的头信息,减少了传输开销。

示例数据帧

  • 帧头信息包含了帧的类型(文本、二进制、关闭、Ping、Pong 等)和长度等信息。
  • 数据部分包含实际的消息内容。

WebSocket API

JavaScript WebSocket API

WebSocket 在浏览器中通过 JavaScript API 使用。以下是基本用法示例:

// 创建 WebSocket 连接
const socket = new WebSocket('ws://localhost:8080/ws');// 连接成功回调
socket.onopen = function(event) {console.log('Connected to WebSocket server.');socket.send('Hello Server!');
};// 接收消息回调
socket.onmessage = function(event) {console.log('Received message from server:', event.data);
};// 连接关闭回调
socket.onclose = function(event) {console.log('WebSocket connection closed.');
};// 错误处理回调
socket.onerror = function(error) {console.error('WebSocket error:', error);
};

WebSocket 服务器端实现

使用 Java 实现 WebSocket 服务器

Java 提供了多种实现 WebSocket 服务器的方法,包括原生的 javax.websocket API 和基于 Netty 的实现。

使用 javax.websocket API

@ServerEndpoint("/ws")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session) {System.out.println("Connected: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("Received: " + message);// Echo the message back to the clientsession.getAsyncRemote().sendText("Echo: " + message);}@OnClosepublic void onClose(Session session, CloseReason closeReason) {System.out.println("Disconnected: " + session.getId());}@OnErrorpublic void onError(Session session, Throwable throwable) {throwable.printStackTrace();}
}
使用 Netty 实现 WebSocket 服务器

Netty 是一个高性能的网络应用框架,适合实现复杂的 WebSocket 服务器。

Netty WebSocket 服务器示例

public class NettyWebSocketServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new HttpServerCodec());pipeline.addLast(new HttpObjectAggregator(64 * 1024));pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));pipeline.addLast(new SimpleChannelInboundHandler<TextWebSocketFrame>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {ctx.channel().writeAndFlush(new TextWebSocketFrame("Hello! " + msg.text()));}@Overridepublic void handlerAdded(ChannelHandlerContext ctx) {System.out.println("Client connected: " + ctx.channel().id());}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) {System.out.println("Client disconnected: " + ctx.channel().id());}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}});}});ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();channelFuture.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

WebSocket 应用场景

WebSocket 适用于需要实时双向通信的场景,包括但不限于:

  • 实时聊天应用:如微信、Slack、WhatsApp 等。
  • 在线游戏:需要实时交互的多人游戏。
  • 实时通知系统:如股票价格、新闻推送等。
  • 实时协作应用:如在线文档编辑、协作白板等。

总结

WebSocket 是一种高效的双向通信协议,适用于需要实时数据交互的应用场景。它通过建立持久的连接,减少了网络延迟和开销,提供了更流畅的用户体验。WebSocket 在浏览器中可以通过 JavaScript API 使用,在服务器端可以使用各种编程语言和框架实现。通过 WebSocket,可以轻松构建实时聊天、在线游戏、实时通知等应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力学中应变的度量01——我好几年的疑惑终于有解了

文章目录 0、背景描述1、拉伸比&#xff08;率&#xff09; λ \lambda λ2、应变的引入3、一维应变概念的拓展4 总结 0、背景描述 在学校里的时候&#xff0c;我就一直很好奇应变的定义为何如此花里胡哨、五花八门&#xff0c;各种教材又都只是定义&#xff0c;从来不解释究竟…

Kylin V10 Server 下TongRDS独立哨兵服务配置手册

一、网络架构设计 部署类型 目录 IP Port 中心节点 /opt/rds/pcenter 10.8.3.34 6300 服务节点 /opt/rds/pmemedb 10.8.3.35 TongRDS 协议端口:6200 Redis 仿真端口:6379 哨兵监听端口:26379 10.8.3.36 二、部署服务节点 1.查看操作系统信息 [root@localhost ~]# cat /etc/.…

代码随想录算法训练营Day41|背包问题、分割等和子集

背包问题 二维 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) dp数组有两维&#xff0c;横轴表示背包重量j&#xff08;0-j&#xff09;&#xff0c;纵轴表示不同物品&#xff08;0-i&#xff09;&#xff0c;dp[i][j]即表示从下标为[0-i]的物品…

使用volta管理前端开发环境

背景&#xff1a;公司有新老不同的产品&#xff0c;使用的node版本不一样&#xff0c;每次都要手动切换node版本&#xff0c;对应的项目才能运行。这样很麻烦&#xff0c;有没有好的解决方法&#xff0c;就找到了volta。 1.为什么是volta&#xff1f; 管网介绍&#xff1a;使用…

国内外典型的知识图谱项目

文章目录 早期的知识库项目互联网时代的知识图谱中文开放知识图谱垂直领域知识图谱 从人工智能的概念被提出开始&#xff0c;构建大规模的知识库一直都是人工智能、自然语言理解等领域的核心任务之一。下面分别介绍早期的知识库项目、互联网时代的知识图谱、中文开放知识图谱和…

MYSQL 字母大小转换

1、UCASE() 解释&#xff1a;把数值列(字段)的字每母转换为大写。 语法格式&#xff1a;SELECT UCASE(column_name) FROM table_name 中文注释&#xff1a;select UCASE(数值列/字段) from 表名 ; 用法&#xff1a; SELECT UCASE(column_name) FROM table_name;2、LCASE(…

【论文阅读笔记】PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation

1.论文介绍 PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation PA-SAM&#xff1a;用于高质量图像分割的提示适配器SAM 2024年 ICME Paper Code 2.摘要 Segment Anything Model&#xff0c;SAM在各种图像分割任务中表现出了优异的性能。尽管SAM接受了超过10亿…

# Mac环境如何安装Flutter:全面指南

Mac环境如何安装Flutter&#xff1a;全面指南 Flutter 是 Google 开发的开源移动 UI 框架&#xff0c;允许开发者使用 Dart 语言快速在 iOS 和 Android 上构建高质量的原生界面。本指南将详细指导您如何在 Mac 环境下安装 Flutter&#xff0c;确保您能够顺利开始 Flutter 开发…

软考又考了,数据库范式这次一定要弄懂!

0. 引言 今年数据库范式又作为选择题在软考中出题了&#xff0c;范式和反范式同样也在我们日常开发的数据库表设计工作中提供重要理论&#xff0c;今天我们来彻底弄懂几大范式的概念和区别&#xff0c;以及常见的反范式设计方法 1. 定义 1.1 基础概念 在实际讲解之前&#…

Python实现连连看12

4.2.5 获取图片连接方式 通过自定义函数getLinkType()获取图片的连接方式,代码如下所示。 def getLinkType(pre_row, pre_col, cur_row, cur_col):if pics_map[pre_row][pre_col] != pics_map[cur_row][cur_col]:return NONE_LINKif isNoCornerLink(pre_row, pre_col, cur_r…

嵌入式数据库_3.嵌入式数据库的主要功能及典型产品

1.嵌入式数据库的功能 嵌入式数据库的功能应与通用数据库功能相似&#xff0c;应覆盖数据库的核心功能。通常&#xff0c;嵌入式数据库有其自身的特殊需要&#xff0c;它应具备的功能包括以下4点&#xff1a; 足够高效的数据存储机制&#xff1b;数据安全控制&#xff08;锁机…

终于用上了桌面版本的chatGPT

最近经过不断的探索&#xff0c;也算是用上了桌面版本的chatgGPT&#xff0c;想要用同学&#xff0c;可以关注一下&#xff0c;后面我会出一期教程的&#xff5e;

docker安装elasticsearch8和kibana,带ik分词器

全文目录,一步到位 1.前言简介1.1 专栏传送门 2. elasticsearch和kibana安装2.1 准备工作2.1.1 下载elasticsearch2.1.2 下载kibana镜像 2.2 创建并运行es容器2.2.1 创建es网络2.2.2 创建es容器2.2.3 放行端口2.2.4 访问查看结果> 步骤一: 点击高级, 然后继续访问> 步骤二…

力扣878.第N个神奇数字

力扣878.第N个神奇数字 二分答案 check()&#xff1a;公共部分为最大公倍数的倍数 class Solution {const long MOD 1e9 7;public:int nthMagicalNumber(int n, int a, int b) {//lcm函数 求最大公倍数long lcm std::lcm(a,b);auto check [&](long long mid) -> …

KIVY AliasProperty 运用报错汇总

案例1&#xff1a; 在Kivy中&#xff0c;AliasProperty 允许你创建一个属性的别名&#xff0c;该别名可以基于其他属性计算得到。但是&#xff0c;与普通的Python属性不同&#xff0c;Kivy的Property类&#xff08;包括AliasProperty&#xff09;并没有直接提供定义getter和s…

Python 3.13 有什么新变化

Python 3.13 beta 是 Python 编译语言下一正式版本的预发布版本&#xff0c;包含多项针对语言、实现和标准库的改变。 针对实现的最大改变包括新的交互式解释器&#xff0c;以及对于去除全局解释器锁 (PEP 703) 和启用即时编译器 (PEP 744) 的实验性支持。 针对标准库的改变包括…

Tensorflow入门实战 T04-猴痘识别

本篇文章主要&#xff1a;tensorflow 运行环境&#xff1a;本地cpu 运行epoch&#xff1a;50 1、tensorflow官网 tensorflow的官网教程。初学者的 TensorFlow 2.0 教程 | TensorFlow Core 官网上有图像分类的相关详细描述还有代码示例。 2、完整代码展示 from tensorflo…

单调队列总结

单调队列的介绍 由于现在我也没接触过正经的单调队列的定义&#xff0c;因而引申为介绍&#xff0c; 单调队列&#xff0c;类似与单调栈&#xff0c;存储在单调队列里面的元素理应都是单调的&#xff0c;单调队列的基础使用deque&#xff08;双端队列&#xff09;去实现的&am…

【总线】AXI总线:FPGA设计中的通信骨干

目录 AXI4&#xff1a;高性能地址映射通信的基石 AXI4-Lite&#xff1a;轻量级但功能强大的通信接口 AXI4-Stream&#xff1a;高速流数据传输的利器 结语&#xff1a;AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…

FlowUs息流开启知识管理的新纪元|FlowUs息流公开知识库

在信息爆炸的时代&#xff0c;如何高效地管理和利用知识成为了一个挑战。FlowUs知识库以其超巨的性价比&#xff0c;为用户带来了全新的解决方案。它不仅仅是一个存储信息的工具&#xff0c;更是一个能够激发创造力和提高生产力的平台。 性价比之选 FlowUs以其合理的价格&…