WebSocket学习笔记
一篇文章理解WebSocket原理
1.HTTP协议(半双工通信):
HTTP是客户端向服务器发起请求,服务器返回响应给客户端的一种模式。
特点:
1.只能是客户端向服务器发起请求,是单向的。
2.服务器不能主动发送数据给客户端。
半双工通信的局限性也从中体现出来,同一时刻数据的传输只能是单向的,想在某一段时间内监听服务器是否有新数据的更新就要不停的从客户端这边发起请求,如果服务器有数据更新那么就会返回响应。那么这种做法是特别消耗性能的,想到一种更优的办法就是监听服务器如果有数据改变就立刻返回响应,不需要客户端一直不停的请求。
举个例子,HTTP协议就是,小明要去超市买薯片,老板说没有,过了一会小明又跑来超市买薯片,老板还是说没有,这样反反复复过了很多次,超市进货的薯片终于到了,小明也拿到薯片了。这样感觉是不是特别麻烦呢?如果使用WebSocket协议就是,小明把他的电话和地址给了超市老板,当超市进货的薯片到了后,老板第一时间给小明打电话告诉他薯片到了,小明可以自己来拿,也可以超市老板送货上门。这样是不是就更省时更省事呢?
2.WebSocket协议(全双工通信):
WbeSocket 是 Html5 开始提供的一种浏览器与服务器之间进行全双工通信的协议(websocket协议本质上是一个基于tcp的协议),它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的,属于应用层,基于TCP协议,并且复用HTTP握手通道,是一个持久化的协议
简单来说,建立一个Websocket连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求头中包含了特殊的"Upgrade: WebSocket"信息表明这是一个从HTTP升级到WebSocket的请求,服务器解析之后返回响应给客户端并建立了WebSocket连接。
3.WebSocket 与 HTTP 的关系:
相同点:
都是基于TCP协议的,都是可靠性传输协议。
都是应用层协议
不同点:
WebSocket是全双工通信协议,模拟Socket协议,可以双向发送或接收信息。
HTTP是单向通信的。
WebSocket是需要浏览器和服务器握手建立连接的。
HTTP是浏览器发请求向服务器的连接,而服务器则不会提前知道这个连接。
3.http和WebSocket的联系:
WebSocket在建立握手是,数据是通过HTTP传输的,但是建立了连接后,传输则不需要HTTP协议。
总体过程:
客户端发起HTTP请求,请过三次握手后与服务器建立TCP连接,HTTP请求中包含了WebSocket的版本号信息:Upgrade、Connection、WebSocket-Version等。
服务器接收到客户端的握手请求后,使用HTTP协议返回响应给客户端。
最后,客户端收到连接成功消息后,可以借助TCP传输协议和服务器进行全双工通信。
4.WebSocket特点:
-
WebSocket约定了一个通信的规范,通过一个握手机制,将客户端与服务器端进行一个类似TCP的连接,实现了通信。
-
在使用WebSocket之前,客户端与服务器端的交互是基于HTTP协议的短连接或长连接。
-
WebSocket的协议名是"ws",是一种全新的协议,不属于HTTP无状态协议。
WebSocket和socket的区分:从本质上来说,socket并不是一个新的协议,它只是为了便于程序员进行网络编程而对tcp/ip协议族通信机制的一种封装。
5.实现WebSocket用例:
事件 | 说明 |
open | 连接建立时触发 |
message | 客户端接收到服务器消息时触发 |
error | 通信出现错误时触发 |
close | 连接关闭时触发 |
send | 客户端给服务器发送数据 |
5.1 java api实现
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;public class SocketServer extends WebSocketServer {public static void main(String[] args) throws InterruptedException, IOException {int port = 8887; // 843 flash policy portSocketServer s = new SocketServer(port);s.start();System.out.println("ChatServer started on port: " + s.getPort());BufferedReader sysIn = new BufferedReader(new InputStreamReader(System.in));while (true) {String in = sysIn.readLine();s.broadcast(in);if (in.equals("exit")) {s.stop(1000);break;}}}public SocketServer(int port) {super(new InetSocketAddress(port));}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {conn.send("Welcome to the server!"); // This method sends a message to the new clientbroadcast("new connection: " + handshake.getResourceDescriptor()); // This method sends a message to all clients connectedSystem.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!");}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {broadcast(conn + " has left the room!");System.out.println(conn + " has left the room!");}@Overridepublic void onMessage(WebSocket conn, String message) {broadcast(message);System.out.println(conn + ": " + message);}@Overridepublic void onError(WebSocket conn, Exception ex) {ex.printStackTrace();if (conn != null) {// some errors like port binding failed may not be assignable to a specific// websocket}}@Overridepublic void onStart() {System.out.println("Server started!");setConnectionLostTimeout(0);setConnectionLostTimeout(100);}}
启动服务
http://www.websocket-test.com/
进入此网站,连接本地websokcet服务ws://127.0.0.1:8887
可以互相发送消息
5.2 springboot结合redis实现发给其他人
修改端口,启动3个实例,8080,8081,8082
http://www.websocket-test.com/
依旧进入此网站连接本地启动的websocket服务
其中1和11两个客户端连同一台服务
ws://127.0.0.1:8080/websocket?userId=1
ws://127.0.0.1:8080/websocket?userId=11
ws://127.0.0.1:8081/websocket?userId=2
ws://127.0.0.1:8082/websocket?userId=3
在1客户端发送消息给3
1和3连接的服务端不在同一个,通过redis发布,3所在服务端的redis监听消息,输出信息,然后发给3客户端
1服务端
3服务端输出redis监听的消息
3服务端收到发给3客户端
相关文章:
![](https://img-blog.csdnimg.cn/0a3d4966ebdb4edca149f433621987c2.png)
WebSocket学习笔记
一篇文章理解WebSocket原理 1.HTTP协议(半双工通信): HTTP是客户端向服务器发起请求,服务器返回响应给客户端的一种模式。 特点: 1.只能是客户端向服务器发起请求,是单向的。 2.服务器不能主动发送数据给客户端。 半双工通信…...
![](https://img-blog.csdnimg.cn/8f6b96b87d5441aab73eb86bb32d742c.png)
centos 内核对应列表 内核升级 linux
近期服务器频繁出现问题,找运维同事排查,说是系统版本和内核版本和官方不一致,如下: Release 用的是7.8, kernal 用的是 5.9 我一查确实如此: 内核: Linux a1messrv1 5.9.8-1.el7.elrepo.x86_64 发行版 Cen…...
![](https://www.ngui.cc/images/no-images.jpg)
如何判断a类b类c类ip地址
在计算机网络中,IP地址用于标识和定位网络上的设备。IP地址根据其范围和结构划分为A类、B类和C类等不同类型。了解如何判断IP地址所属的类型对于理解网络结构和进行网络管理非常重要。虎观代理小二二将介绍如何判断IP地址的类别,以帮助读者更好地理解和应…...
![](https://img-blog.csdnimg.cn/cf17d806a15e432ea0e10094144c0c78.png)
SNAP对Sentinel-1预处理
SNAP对Sentinel-1预处理 一、导入数据 二、轨道校正 点击run开始处理 三、噪声去除 打开S-1 Thermal Noise Removal工具 如果选中了VH,就只会输出一个VH极化结果 四、辐射定标 Run 五、滤波处理 六、地形校正 这边的dem需要自己下载 dem下载地址 如果一格…...
![](https://www.ngui.cc/images/no-images.jpg)
GEE案例——指定区域纯净森林提取分析(红和近红外波段)阈值法提取森林面积
本教程主要是利用影像波段的近红外和红波段的指数作为森林区域的筛选,利用大津法进行指定区域的森林夏季的遥感影像的红波段和近红外波段。 简介: 提取森林范围是遥感影像处理中的一项常见任务。以下是可能用到的一些步骤: 1. 数据预处理:首先,需要进行数据预处理,包括…...
![](https://img-blog.csdnimg.cn/bd4309e5470e46409774854c0a76f50a.png)
JavaScript从入门到精通系列第二十一篇:JavaScript中的原型对象详解
文章目录 前言 一:原型对象 1:什么是原型对象 2:原型对象的作用 3:通过原型对象实现工厂方法 二:原型对象咋说 1:in和原型对象 2:hasOwnProperty()函数 3:hasOwnProperty()来…...
![](https://img-blog.csdnimg.cn/bc452003b5dd447f8c144e78d7b69cfd.png)
app.json: [“usingComponents“][“van-icon“]: “@vant/weapp/icon/index“ 未找到
维护一个微信小程序的项目,运行报错如下: app.json: ["usingComponents"]["van-icon"]: "vant/weapp/icon/index" 未找到解决办法 我只说我用到的,如果解决不了你的问题,详细的可以参照官方文档&…...
![](https://www.ngui.cc/images/no-images.jpg)
Kotlin中循环语句
在Kotlin中,循环语句有多种形式,包括while循环、do-while循环、for循环等。下面将逐个说明每种形式的使用。 while循环: var n: Int 5 while (n > 0) {println("n$n")n-- }上述代码中,使用while循环打印n的值&…...
![](https://www.ngui.cc/images/no-images.jpg)
Java String之正则表达式
Java String之正则表达式 导言 最近做项目时,遇到了限制输入字符格式的问题,采用了Java String的正则表达式,下面针对正则表达式使用进行概述 正则表达式 正则表达式类似可以通俗的理解为字符模板,通过符号的方式进行表述&…...
![](https://www.ngui.cc/images/no-images.jpg)
Kotlin 协程再探之为什么使用协程反而更慢了?
前言 在几个月前,我曾经写了一篇文章,Kotlin 协程中的并发问题:我明明用 mutex 上锁了,为什么没有用?,讲述在某次 debug 某个问题时,发现同事写的 Koltin 协程某个不恰当的地方,并最…...
![](https://www.ngui.cc/images/no-images.jpg)
Hadoop3教程(十六):MapReduce中的OutputFormat
文章目录 (105)OutputFormat概述(106)自定义OutputFormat案例需求分析(107/108)自定义OutputFormat案例实现自定义Mapper自定义Reducer自定义OutputFormatDriver 参考文献 (105)Outp…...
![](https://www.ngui.cc/images/no-images.jpg)
通过表查询 sm37 排程运行情况 JOB 数据保存在表TBTCP 和 TBTCO中
sm36 设置排程 sm37 查看排程 se11 查表 Values for TBTCO-STATUS: A - Cancelled F - Completed P - Scheduled R - Active S - Released JOB 数据保存在表TBTCP 和 TBTCO中 参考 https://blog.51cto.com/u_15680210/5757746?articleABtest0 https://answers.sap.co…...
![](https://www.ngui.cc/images/no-images.jpg)
append_ocr_trainf
read_image (Image, D:/图像文件/字符识别/1-1.bmp) access_channel (Image, Image1, 1) * draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2) gen_rectangle2 (Rectangle, 96.0436, 715.9526, 0.0173917050943654, 110.186941, 18.041084) reduce_domain (Image1, …...
![](https://img-blog.csdnimg.cn/877e94506c604b799d9661fda29ddfdd.png)
小程序原生代码转uniapp
写了一份小程序原生代码,想转为uniapp 再转为其他平台发布 1、在命令行里,运行【 npm install miniprogram-to-uniapp -g 】进行安装,因为这个包是工具,要求全局都能使用&#x…...
![](https://img-blog.csdnimg.cn/b34d33d5196549859f6a6670b747aadc.png)
云原生微服务 第五章 Spring Cloud Netflix Eureka集成负载均衡组件Ribbon
系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 文章目录 系列文章目录[TOC](文章目录) 前言1、负载均衡1.1、服务端负载均衡1.2、…...
![](https://img-blog.csdnimg.cn/d0e90ec536c44c84905f11f3ad0e0eec.png)
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
一:排序的概念及引入 1.1 排序的概念 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在…...
![](https://www.ngui.cc/images/no-images.jpg)
一、nginx配置
一、nginx配置 配置简介 1)nginx相关目录 工作目录:/etc/nginx 执行文件:/usr/sbin/nginx 日志目录:/var/log/nginx 启动文件:/etc/init.d/nginx web目录:/var/www/html/,首页文件是index.ng…...
![](https://www.ngui.cc/images/no-images.jpg)
win32汇编-LEA指令是将一个内存地址加载到一个寄存器中
LEA (Load Effective Address) 指令是用来将一个内存地址加载到一个寄存器中的指令。 其语法为: lea destination, source 其中,destination 是目标寄存器,source 是一个内存地址(即一个存储器操作数)。 举个例子…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode做题笔记189. 轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…...
![](https://www.ngui.cc/images/no-images.jpg)
数据库第七章作业
本篇用于日常记录和分享 第7章作业.xls 题量: 25 满分: 100 一. 单选题(共25题) 1. (单选题)二级封锁协议不能保证消除( )这一不一致现象。 A. 读取脏数据B. 死锁C. 不可重复读D. 丢失修改 我的答案: C :不可重复读; 2. (单…...
![](https://www.ngui.cc/images/no-images.jpg)
使用服务器训练模型的注意事项
一、图像展示 1.1、用VS Code远程连接服务器时,当我们想用matplotlib库来进行图像展示的时候,需要设置DISPLAY变量。 # 用终端工具(XShell)SSH远程服务器,在终端上输入下列语句 # 如果使用了anaconda的虚拟环境&…...
![](https://img-blog.csdnimg.cn/12b9d1f9d07f4036b0055ef48b5805cf.png)
Linux性能优化--性能追踪3:系统级迟缓(prelink)
12.0 概述 本章包含的例子说明了如何用Linux性能工具寻找并修复影响整个系统而不是某个应用程序的性能问题。阅读本章后,你将能够: 追踪是哪一个进程导致了系统速度的降低。用strace调查一个不受CPU限制的进程的性能表现。用strace调查一个应用程序是如…...
![](https://img-blog.csdnimg.cn/6b5c94724bd94d33ab4c310e3bd32f19.png#pic_center)
SpringBoot2.x简单集成Flowable
环境和版本 window10 java1.8 mysql8 flowable6 springboot 2.7.6 配置 使用IDEA创建一个SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.…...
![](https://img-blog.csdnimg.cn/aa6d07a916e64b82af72581f97f7c84e.png)
微信小程序一键获取位置
需求 有个表单需要一键获取对应位置 并显示出来效果如下: 点击一键获取获取对应位置 显示在 picker 默认选中 前端 代码如下: <view class"box_7 {{ showChange1? change-style: }}"><view class"box_11"><view class"…...
![](https://img-blog.csdnimg.cn/a399c55e4b7549078dd8ab3117e3bc09.png)
Linux性能优化--使用性能工具发现问题
9.0 概述 本章主要介绍综合运用之前提出的性能工具来缩小性能问题产生原因的范围。阅读本章后,你将能够: 启动行为异常的系统,使用Linux性能工具追踪行为异常的内核函数或应用程序。启动行为异常的应用程序,使用Linux性能工具追…...
![](https://img-blog.csdnimg.cn/71e4a3eb956044cf99e667f5ca6a8354.png)
【Proteus仿真】【STM32单片机】路灯控制系统
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、人体红外传感器、光线检测模块、路灯继电器控制等。 主要功能: 系统运行后,LCD1602显示时间、工作模…...
![](https://img-blog.csdnimg.cn/fa0c26aad8164f718a8ab56213c1d0e2.png)
Flutter笔记:发布一个Flutter头像模块 easy_avatar
Flutter笔记 发布一个头像Flutter模块 easy_avatar 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1339…...
![](https://img-blog.csdnimg.cn/9463a906287940f5b84a23232b6f1e6b.png)
标准化助推开源发展丨九州未来参编开源领域4项团体标准正式发布
在数字中国及数字经济时代的大背景下,开源逐步成为各行业数字化发展的关键模式。在开源产业迅速发展的同时,如何评估、规范开源治理成为行业极度关注的问题。 近日,中电标2023年第27号团体标准公告正式发布,九州未来作为起草单位…...
![](https://img-blog.csdnimg.cn/img_convert/98fe73d0d8943105c273a07d620e344a.png)
ChatGPT对于留学生论文写作有哪些帮助?
2022年11月,OpenAI公司的智能聊天产品ChatGPT横空出世,并两个月之内吸引了超过1亿用户,打破了TikTok(抖音国际版)9个月用户破亿的纪录。 划时代的浪潮 ChatGPT的火爆立即引起了全球关注并成为热门话题,它…...
![](https://img-blog.csdnimg.cn/009ae31184b542cb8cf5e256af42d0e1.png)
【yolov8目标检测】使用yolov8训练自己的数据集
目录 准备数据集 python安装yolov8 配置yaml 从0开始训练 从预训练模型开始训练 准备数据集 首先得准备好数据集,你的数据集至少包含images和labels,严格来说你的images应该包含训练集train、验证集val和测试集test,不过为了简单说…...
![](https://img-blog.csdnimg.cn/img_convert/75f456e49d893d81176e2069b0074046.png)
做盗链电影网站怎么样/个人免费开发app
类型:便捷生活大小:101.2MB评分:10平台:ofo共享单车貌似出了点问题!今天很多朋友都无法登录、显示网络错误,还无法结算,这是怎么回事,又该怎么办呢?来看看吧!…...
![](https://img-blog.csdnimg.cn/92166a17a189438f8110aa848adf98fd.gif#pic_center)
河北网站开发多少钱/如何免费推广一个网站
文章目录流程循环数组简单案例先看看效果图 流程 使用数组的slice() 方法通过条件判断截取原数组相应内容组成新数组 循环数组 let currentPage 0 // arr:原数组 newLen:新数组需要的长度 currentPage:现在的页码// 方法一: function loopData(arr, newLen) {…...
![](/images/no-images.jpg)
金银回收东莞网站建设/游戏搜索风云榜
1.页面向Controller传数组,Controller这边该怎么写 页面中有个多选,name为id,在Controller中RequestParam(value "Id")long[] id; 2.content实体中将置顶设置为boolean了,而存进数据库的时候是0,1。这该怎么办。 实体和数据库的对…...
![](https://img-blog.csdnimg.cn/f2a415f25bf14fb2844b3555eb1805c4.png)
厦门电子商务网站建设/陕西网络推广公司
BDD - SpecFlow Context Injection 上下文依赖注入引言Context Injection如何使用 Context InjectionContext Injection 规则举例 1 共享字段举例 2 共享引用类自定义 Injection Framework 注入框架自定义 Container引言 BDD SpecFlow Scenario 在整个执行周期,Ste…...
![](https://img-blog.csdnimg.cn/img_convert/24b7d040aedea4eddacdfad2559df92e.png)
赵县住房和城乡建设局网站首页/百度商城官网
如下图这个sql语句,扫描的行数成百万级以上的时候就可以使用分段查询12、避免在 where 子句中对字段进行 null 值判断对于null的判断会导致引擎放弃使用索引而进行全表扫描。13、不建议使用%前缀模糊查询例如LIKE “%name”或者LIKE “%name%”,这种查询…...
![](https://img-blog.csdnimg.cn/20200728123027109.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hhaWt1b3RpYW5rb25nMTExMTE=,size_16,color_FFFFFF,t_70)
下载用的网站怎么做/网站开发是做什么的
一、 4.2.5版本下载 链接: https://pan.baidu.com/s/1qKQ9Kzb7qtjfwu8msBNRHA 密码: seun 二、安装 先将下载好的压缩包解压,然后打开 shell 终端,切换到你已经解压好的文件的bin目录下,然后执行下面的命令: install_compass …...