WebSocket 协议详述( java在线聊天室_上篇)

news2024/9/25 11:19:28

文章目录

  • 1、 WebSocket 协议
    • 1.1、 何为WebSocket?
    • 1.2、 websocket 和 http(应用层的俩个协议)
    • 1.3、 websocket协议的具体过程
    • 1.4、websocket好处
  • 2、 WebSocket实现
    • 2.1、 客户端实现
      • 2.1.1、 websocket对象
      • 2.1.2、 websocket事件
      • 2.1.3、 websocket方法
    • 2.2、 服务端实现


2022即将结束,跨入2023,愿大家:
从今诸事愿,胜如旧。人生强健,喜一年入手。

1、 WebSocket 协议

1.1、 何为WebSocket?

WebSocket是一种网络通信协议,是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议,能更好的节省服务器资源和带宽并达到实时通讯的目的。WebSocket是一个持久化的协议

1.2、 websocket 和 http(应用层的俩个协议)

如果学过计算机网络的读者应该知道,WebSocket和http都是属于应用层协议,那么为啥有了http协议还需要websocket协议?

HTTP协议是一种无状态,无连接的,单向的应用层协议,它的通信请求只能由客户端发起,服务端对请求进行应答处理。

单向请求的特点,注定了要实现即时通讯等功能,就要定时的进行请求操作,浪费资源, 像下图一样:

image-20221231185457762

客户端进行定时的请求,服务端进行回应,来模拟实时的通讯,定时请求也是有延迟的,假如客户端10s,20s,30s,请求一次?

请求快了,浪费资源太严重,请求慢了,用户感觉延迟太严重,???

WebSocket

如果是websocket,双向通信协议,可以双向发送或者接收消息,像下图一样

image-20221231185600693

如图中红色框,WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的(绿色框)。

上面的过程可以概况为:

客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。

1.3、 websocket协议的具体过程

本协议有俩部分:握手和数据传输

握手是基于http协议的,

image-20221231195610126

握手结束后,建立TCP连接,然后借助TCP传输信道,进行全双工通信

1.4、websocket好处

当WebSocket建立连接后,后续的数据将以帧序列的形式传输。直到客户端断开WebSocker连接或者服务端中断连接前,都不需要俩端重新发送连接请求。

可谓是:

  • 极大的节省带宽消耗
  • 客户端发送和接收消息在**同一个持久连接上,**实时性优势明显

总结,WebSocket有以下特点:

  1. 真正的全双工,可以相互主动的进行请求
  2. 通过建立tcp连接后,后续交换的数据都不需要发送 HTTP header就能交换数据

2、 WebSocket实现

2.1、 客户端实现

2.1.1、 websocket对象

var ws = new WebSocket(url);

url格式说明:ws://ip地址:端口号/资源名称

2.1.2、 websocket事件

image-20221231200310559

2.1.3、 websocket方法

send() 使用连接发送数据

2.2、 服务端实现

Tomcat的7.0.5开始支持WebSocket,并且实现了Java WebSocket规范

Java WebSocket应用由一系列WebSocketEndPoint组成,EndPoint是一个Java对象,代表WebSocket服务端,我们可以视作WebSocket消息的接口

定义Endpoint的俩种方法

  • 编程式:即继承类javax.websocket.Endpoint并实现其方法
  • 注解式:即定义一个POJO,并添加@ServerEndpoint相关注解

具体实现过程还请参考下一篇博客,《基于WebSocket实现Java即时通讯》

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

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

相关文章

【linux】linux中vim/vi (linux基本开发工具)

本期主题:linux中vim/vi的使用和介绍。博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐 目录 🍁vim键盘图 🍁vim基本概念 🍁vim的基本操作 &#x1…

Python使用库(二)

Python使用库(二) 第三方库 认识第三方库 第三方库就是别人已经实现好了的库, 我们可以拿过来直接使用. 虽然标准库已经很强大了, 但是终究是有限的. 而第三方库可以视为是集合了全世界 Python 程序猿的智慧, 可以说是几乎无穷无尽. 问题来了, 当我们…

Linux驱动入门-最简单字符设备驱动(基于pc ubuntu)

一.字符设备驱动概念 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备&#xff0…

公共管理老师赴英国G5名校-伦敦大学学院CSC公派访学

CSC青年骨干教师项目的实施院校一般都要求申请人提前上报邀请函等申请材料,以进行校内遴选。为提升竞争优势,A老师希望能获得英国名校的邀请函。最终我们为其申请到英国G5名校之一的伦敦大学学院,凭借该邀请函,A老师顺利通过了本校…

【2022年终总结】勇敢追梦,去和人生博弈

目录序言刚开始的1月松懈的2月忙碌的3月迷茫的4月开源项目的5月入职汇报的6月7月8月9月假期过后的10月至关重要的11月最后冲刺的12月2022年的总结2023年的目标往年回顾序言 在刚刚过完的平安夜和圣诞节之际,同时意味着2022年要画上一个句号。这一周算是比较煎熬的几…

高效的事件处理模式——Reactor、Proactor

IO模型 从理论上说,阻塞IO、IO复用和信号驱动IO都是同步IO模型。因为在这三种IO模型中,IO的读写操作,都是在IO事件发生之后,由应用程序来完成的。而POSIX规范所定义的异步IO模型则不同。对异步IO而言,用户可以直接对I…

ubuntu18.04安装docker和nvidia-docker2

ubuntu18.04安装docker和nvidia-docker 1、卸载旧版本的docker 旧版本的 Docker 被称为 docker、docker.io 或 docker-engine。 如果安装了这些,需要卸载它们: sudo apt-get remove docker docker-engine docker.io containerd runc2、 使用存储库安装…

聊一聊 SQLSERVER 的行不能跨页

一:背景 1. 讲故事 相信有很多朋友在学习 SQLSERVER 的时候都听说过这句话,但大多都是记忆为主,最近在研究 SQLSERVER,所以我们从 底层存储 的角度来深入理解下。 二:理解数据页 1. 数据页的组织 在前面的文章中我…

Vue2学习笔记(二):MVVM模型、数据代理

一、MVVM M(Model): 对应data中的数据 V(View): 也就是模板(template) VM(ViewModel): 对应Vue实例对象 大多数的前端框架都或多或少借鉴了MVVM模型,其中VM可以看做是View与Model中间的桥梁,它协助页面(View)和数据(Model)的展示。 二、数据代理 1.了…

JUC(十一)-线程池-ScheduledThreadPoolExecutor分析

ScheduledThreadPoolExecutor 分析 文章目录ScheduledThreadPoolExecutor 分析一、ScheduledThreadPoolExecutor介绍二、ScheduledThreadPoolExecutor应用2.1 ScheduledThreadPoolExecutor 构造器2.2 ScheduledThreadPoolExecutor 应用代码三、ScheduledThreadPoolExecutor源码…

10多个LearnDash示例和演示:从这些在线教育网站获得灵感!

正在寻找真实的LearnDash示例来激发您自己的电子学习网站的灵感? LearnDash 是最受欢迎的 WordPress LMS 插件之一,约翰霍普金斯大学和 Collibra 等大型组织以及 Yoast 和 ProBlogger 等小型品牌都在使用它。 LearnDash在线教育网站定制 LearnDash是最…

基于FireBeetle 2 ESP32-E开发板的LVGL移植及传感器显示(Arduino+TFT_eSPI+LVGL)

目录项目介绍硬件介绍硬件结构说明LVGL移植综合实现功能展示项目总结👉 【Funpack2-3】基于FireBeetle 2 ESP32-E开发板的LVGL移植及传感器显示 👉 CSDN-工程源文件 👉 Github-KafCoppelia/FireBeetle2_lvgl_sensors 项目介绍 本项目基于Fir…

蓝桥杯寒假集训第三天《灌溉》

没有白走的路,每一步都算数🎈🎈🎈 题目描述: 一个长方形块,在方形块的中间位置有给定的水管,这些水管在单位时间会往上下左右四个方向进行灌溉。问在给定的方块中,一定时间后&#…

PyCharm 发布了新版,支持最新 Python 3.11 和 PyScript 框架

通常而言,使用新潮的或者快速发展的技术,可能会挺有挑战性,你可能得经常阅读文档,才能熟悉新的语法、API 和协议。 PyCharm 2022.2 通过提供对 Python 3.11 的语言特性和新的 PyScript 框架的支持,能够帮助你完成这一…

代码随想录算法训练营day59|503.下一个更大元素II,42. 接雨水

503.下一个更大元素II 503. 下一个更大元素 II - 力扣(LeetCode) 思路:单调栈 1. 单调递增栈;在遍历的过程中模拟走两边nums; class Solution {public int[] nextGreaterElements(int[] nums) {if(numsnull || num…

【MySQL】八,角色管理

创建角色 引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定,可以确保数据的安全性。 语法 CREATE ROLE role_name[host_name] [,role_name[host_name]]...创建一个经理的角色 create role managerlocalhost;给角色赋予权限 创建角色之后&#xff0…

使用 npm link 测试本地编写的 node 模块 / 引入全局安装的 node 模块

目录 1. npm install VS npm install -g 2. npm install -g 的本质?映射脚本的作用? 3. 如何测试使用未发布的 npm 包?npm link 原理? 4. link 到项目 4.1 全局 link 4.2 解除 link 4.3 link 到项目有两种情况(…

ansible 第二天

要求: 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下: 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示: 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和…

什么是 Loader、手写 Webpack Loader

目录 1. 什么是 Loader 1.1 Loader 工作原理 1.2 Loader 执行顺序 1.3 内联 Loader 前缀​​​​​​​ 2. 如何开发 Loader 2.1 Loader 长什么样子 2.2 配置本地 Loader 的四种方法 2.2.1 在配置 rules 时,指定 Loader 的绝对路径 2.2.2 在 resolveLoader…

Windows配置万德(Wind)量化接口

原理:wind会在python的第三方库中安装一个属于wind的库 文章目录步骤1:确定python的路径步骤2:配置wind的接口步骤3:检查配置步骤4:使用python提取任意的wind数据步骤1:确定python的路径 如果是默认安装,一般路径是:C:\Users\用户名\Anacond…