WebSocket 学习

websocket深入浅出 websocket简介 websocket是什么 答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 为什么需要websocket? 疑问? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答: 因为 HTTP 协议有一个缺陷:通信只能由客户端发起 我们都知道轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP... 阅读详情

一、WebSocket 简介

1、什么是 WebSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的应用层的协议。在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就创建了持久性的连接,两者之间就直接可以进行双向数据传输。
所有浏览器都支持 WebSocket ,目的是在服务器可以在任意时刻发消息给浏览器, 不需要等待浏览器的请求。
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

(1)WebSocket 特点

服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

1)建立在 TCP 协议之上,服务器端的实现比较容易。
2)与 HTTP 协议有着良好的兼容性,握手阶段采用 HTTP 协议。
3)数据格式比较轻量,性能开销小,通信高效。
4)可以发送文本,也可以发送二进制数据。
5)没有同源限制,客户端可以与任意服务器通信。
6)协议标识符是 ws(如果加密,则为wss),服务器网址就是 URL。

(2)HTTP 和 WebSocket 的区别
在这里插入图片描述
(3)AJAX 与 WebSocket 的区别

Ajax 是 Web 应用程序通过频繁的异步的 javaScript 长时间的轮循来更新浏览器页面显示的内容。
在这里插入图片描述
WebSocket 是全双工通信,双方都可以向对方推送消息,不需要长轮询。
在这里插入图片描述

2、WebSocket 的由来

HTTP 在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”。要保持客户端程序的在线状态,就需要向服务器轮询,即不断地向服务器发起连接请求。即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
简单的说就是 TCP 连接是一个长连接,HTTP 是一个短连接。

(1)HTTP 的缺点

1)不支持长连接:信息的获取需要通过轮徇的方式, 每隔一段时间发一次请求, 才能得到更新的消息。
2)通信只能由客户端发起:如果你不主动发请求要查询、查看, 服务器商不主动推送消息给客户。(“请求—响应”的方式:发送请求才建立连接,服务器只能请求之后发消息到客户端)

(2)以往和服务器交互的几种方式

1)轮询
长轮询就是客户端按照一个固定的时间定期向服务器发送请求,通常这个时间间隔的长度受到服务端的更新频率和客户端处理更新数据时间的影响。这种方式缺点很明显,就是浏览器要不断发请求到服务器以获取最新信息,造成服务器压力过大,占用宽带资源。
2)使用 streaming AJAX
streaming ajax是一种通过 ajax 实现的长连接维持机制。主要目的就是在数据传输过程中对返回的数据进行读取,并且不会关闭连接。
3)iframe方式
iframe 可以在页面中嵌套一个子页面,通过将 iframe 的 src 指向一个长连接的请求地址,服务端就能不断往客户端传输数据。

现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出 HTTP 请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而 HTTP 请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
为了能更好的节省服务器资源和带宽,并且能够更实时地进行通讯,WebSocket 应运而生。

3、WebSocket 的工作流程

在这里插入图片描述
(1)WebSocket 连接的建立

1)客户端申请升级

浏览器发送一个 ‘upgrade’ request,这是一个标准的 HTTP 请求,使用的是 HTTP 协议。请求如下:

GET ws://localhost:3000/ws/chat HTTP/1.1 
Host: localhost:8080 
Origin: http://127.0.0.1:3000 
Connection: Upgrade     // 表示要升级协议
Upgrade: websocket		// 表示要升级到websocket协议
Sec-WebSocket-Version: 13 		// 表示websocket的版本。如果服务端不支持该版本,需要返回一个Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。
Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==		// 与后面服务端响应首部的 Sec-WebSocket-Accept 是配套的,提供基本的防护,比如恶意的连接,或者无意的连接。

注:客户端发起的协议升级请求只支持 GET 方法;GET 请求的地址不是类似 http:// 开头,而是以 ws:// 开头的。

2)服务端响应协议升级:

服务端返回内容如下:

HTTP/1.1 101  Switching Protocols 
Connection:Upgrade
Upgrade: websocket 
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

状态代码101表示协议切换。到此完成协议升级,后续的数据交互都按照新的协议来。
过了握手阶段后,就只能采用特定的错误码。

(2)相互通讯

接下来双方就开始使用 WebSocket 协议相互通讯了,不再使用 http 协议了。
一旦 WebSocket 客户端、服务端建立连接后,后续的操作都是基于数据帧的传递。WebSocket 根据 opcode 来区分操作的类型:比如 0x8 表示断开连接,0x0-0x2 表示数据交互。

(3)连接保持 + 心跳

WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。

但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。

发送方->接收方:ping
接收方->发送方:pong
ping、pong的操作,对应的是WebSocket的两个控制帧,opcode分别是0x9、0xA。

二、WebSocket 服务端 API

1、WebSocket 属性

(1)Socket.readyState

在这里插入图片描述
1) 0 - 表示连接尚未建立。

2) 1 - 表示连接已建立,可以进行通信。

3) 2 - 表示连接正在进行关闭。

4) 3 - 表示连接已经关闭或者连接不能打开

(2)Socket.bufferedAmount

只读属性 bufferedAmount 表示已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

2、WebSocket 事件

在这里插入图片描述

3、WebSocket 方法

以下是 WebSocket 对象的相关方法。假定我们使用了以上代码创建了 Socket 对象:
在这里插入图片描述

三、JS 实现 WebSocket 客户端 API

1、WebSocket 构造函数

// 地址为 WebSocket 服务端的访问地址
var ws = new WebSocket("ws://localhost:8080/websocketserver");

2、webSocket.readyState

readyState 属性返回实例对象的当前状态,共有四种。

CONNECTING:值为0,表示正在连接。
OPEN:值为1,表示连接成功,可以通信了。
CLOSING:值为2,表示连接正在关闭。
CLOSED:值为3,表示连接已经关闭,或者打开连接失败

例如:

if(ws.readyState ==WebSocket.CONNECTING ){

}

3、webSocket.onopen

用于指定连接成功后的回调函数。

// 方式一
ws.onopen = function(evt) {
	console.log("Connection open ...");
	ws.send("Hello WebSockets!");
};

// 方式二
ws.addEventListener('open', function (event) {
  ws.send('Hello Server!');
});

4、webSocket.onclose

用于指定连接关闭后的回调函数。

// 方式一
ws.onclose = function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
};

// 方式二
ws.addEventListener("close", function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
});

5、webSocket.onmessage

用于指定收到服务器数据后的回调函数。

// 方式一
ws.onmessage = function(event) {
  var data = event.data;
};

// 方式二
ws.addEventListener("message", function(event) {
  var data = event.data;
});

服务器数据有可能是文本,也有可能是二进制数据,需要判断:

ws.onmessage = function(event){
  if(typeof event.data === String) {
    console.log("Received data string");
  }
 
  if(event.data instanceof ArrayBuffer){
    var buffer = event.data;
    console.log("Received arraybuffer");
  }
}

除了动态判断收到的数据类型,也可以使用binaryType属性,显式指定收到的二进制数据类型:

// 收到的是 blob 数据
ws.binaryType = "blob";
ws.onmessage = function(e) {
  console.log(e.data.size);
};
 
// 收到的是 ArrayBuffer 数据
ws.binaryType = "arraybuffer";
ws.onmessage = function(e) {
  console.log(e.data.byteLength);
};

6、webSocket.send

send 方法用于向服务器发送数据。

(1)发送文本

ws.send("Hello WebSockets!");

(2)发送 Blob 数据

var file = document
  .querySelector('input[type="file"]')
  .files[0];
ws.send(file);

(3)发送 ArrayBuffer

var img = canvas_context.getImageData(0, 0, 400, 320);
var binary = new Uint8Array(img.data.length);
for (var i = 0; i < img.data.length; i++) {
  binary[i] = img.data[i];
}
ws.send(binary.buffer);

7、webSocket.bufferedAmount

bufferedAmount 属性,表示还有多少字节的二进制数据没有发送出去。它可以用来判断发送是否结束。

var data = new ArrayBuffer(10000000);
socket.send(data);
 
if (socket.bufferedAmount === 0) {
  // 发送完毕
} else {
  // 发送还没结束
}

8、webSocket.onerror

用于指定报错时的回调函数

// 方式一
ws.onerror = function(event) {
};
 
// 方式二
es.addEventListener("error", function(event) {
});

四、springboot 使用 WebSocket 实现在线聊天

1、群发消息

(1)添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>        
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

(2)WebSocket 配置类

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

注入 ServerEndpointExporter,这个 bean 会自动注册使用了 @ServerEndpoint 注解声明的 Websocket endpoint。 要注意,如果使用独立的 servlet 容器,而不是直接使用 springboot 的内置容器,就不要注入ServerEndpointExporter, 因为它将由容器自己提供和管理。

(3)创建一个服务端

@ServerEndPoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个 websocket 服务器端。
注解的值将被用于监听用户连接的终端访问 UR L地址,客户端可以通过这个 URL 连接到 websocket 服务器端

@ServerEndpoint("/websocket/{name}")  	// 服务端访问地址
@RestController
public class WebSocketServer {

    // 存储客户端的连接对象,每个客户端连接都会产生一个连接对象,即 WebSocketServer 实例。
    private static ConcurrentHashMap<String,WebSocketServer> map = new ConcurrentHashMap();
    //每个连接都会有自己的会话
    private Session session;
    private String name;
    
    @OnOpen
    public void open(@PathParam("name") String name, Session session){
        map.put(name,this);		// 存储客户端连接对象
        System.out.println(name + "连接服务器成功");
        System.out.println("客户端连接个数:" + getConnetNum());
        this.session=session;
        this.name=name;
    }
    
    @OnClose
    public void close(){
        map.remove(name);
        System.out.println(name+"断开了服务器连接");
    }
    
    @OnError
    public void error(Throwable error){
        error.printStackTrace();
        System.out.println(name+"出现了异常");
    }
    
    @OnMessage
    public void getMessage(String message) throws IOException {
        System.out.println("收到" + name+":" + message);
        System.out.println("客户端连接个数:" + getConnetNum());
        Set<Map.Entry<String, WebSocketServer>> entries = map.entrySet();
        for (Map.Entry<String, WebSocketServer> entry : entries) {
            if(!entry.getKey().equals(name)){//将消息转发到其他非自身客户端
                entry.getValue().send(message);

            }
        }
    }

    public void send(String message) throws IOException {
        if(session.isOpen()){
           session.getBasicRemote().sendText(message);
        }
    }

    public int  getConnetNum(){
        return map.size();
    }
}

(4)创建一个客户端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>在线聊天</title>
</head>
<body>
Welcome<br/>
<input id="login" type="text" />
<button onclick="login()">登录</button><br>
<div id="message1"></div><br><br>
<input id="text" type="text"/>
<button onclick="send()">发送消息</button>
<hr/>
<button onclick="closeWebSocket()">关闭WebSocket连接</button>
<hr/>
<div id="message"></div>
</body>

<script type="text/javascript">
    var websocket = null;
   
    // 输入账户名登录,然后进行 WebSocket 连接
    function login() {
    	// 页面显示登陆信息
        document.getElementById('message1').innerHTML += '欢迎' + document.getElementById('login').value + '<br/>';
        //判断当前浏览器是否支持WebSocket
        if ('WebSocket' in window) {
        	// 获得当前登录的用户名,作为与服务端建立的连接对象的标识 
            var user = document.getElementById('login').value
            websocket = new WebSocket('ws://localhost:8010/websocket/'+user);
        }
        else {
            alert('当前浏览器 Not support websocket')
        }

        //连接成功建立的回调方法
        websocket.onopen = function () {
            setMessageInnerHTML("WebSocket连接成功");
        }

        //接收到消息的回调方法
        websocket.onmessage = function (event) {
            console.log(event.data)
            setMessageInnerHTML(event.data);
        }

        //连接关闭的回调方法
        websocket.onclose = function () {
            setMessageInnerHTML("WebSocket连接关闭");
        }

        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
        window.onbeforeunload = function () {
            closeWebSocket();
        }

		//连接发生错误的回调方法
        websocket.onerror = function () {
            setMessageInnerHTML("WebSocket连接发生错误");
        };
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //关闭WebSocket连接
    function closeWebSocket() {
        websocket.close();
    }

    //发送消息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</body>
</html>

(5)效果

用户1:
在这里插入图片描述
用户2:
在这里插入图片描述
服务器连接信息:
在这里插入图片描述

Spring WebSocket实现实时通信的详细教程 WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。WebSocket 连接允许客户端和服务器之间的全双工通信,以便任何一方都可以通过已建立的连接将数据推送到另一方。我们常用的HTTP是客户端通过「请求-响应」的方式与服务器建立通信的,必须是客户端主动触发的行为,服务端只是做好接口被动等待请求。而在某些场景下的动作,是需要服务端主动触发的,比如向客户端发送消息、实时通讯、远程控制等。 阅读详情

相关推荐

WebSocket(保姆级教学)

快速了解WebSocket,对WebSocket的介绍堪称保姆级,初学者上手即可使用

weixin_70563938的博客 6584

Websocket 详解

详细了解websocket及应用

Hei, Welcome To vickie's Blog,Good Good Study, Day Day Up ~ 2万+

Vc出现不能连接到一个或多个 vCenter server 系统:http://vcenter-vx.utibet.edu.cn:443/sdk

问题描述: 解决办法: esxi6.7的bug 第一种通过升级系统来解决问题 第二种是通过删除数据来解决 第一步:进入到esxi的shell 第二步查看其中的服务开启状态 第二步 df -h 第三步 /opt/vmware/vpostgres/current/bin/psql -d VCDB -U postgres 第四步 SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oi

m0_49328536的博客 9898

WebSocket(看这一篇就够了)

WebSocket是基于 TCP 的一种新的应用层网络协议。它提供了一个全双工的通道,允许服务器和客户端之间实时双向通信。因此,在 WebSocket 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输,客户端和服务器之间的数据交换变得更加简单。WebSocket 的其他特点包括:(1)建立在 TCP 协议之上,服务器端的实现比较容易。(2)与 HTTP 协议有着良好的兼容性。

m0_74436895的博客 5万+

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

ROS机器人全覆盖路径规划实战:6种ipa算法对比与选型指南(附避坑经验)

本文深入对比了ROS中ipa_coverage_planning功能包集成的6种全覆盖路径规划算法,包括牛耕分解、栅格旅行商、神经网络、局部能量最小、轮廓线和凸感知放置。文章从覆盖率、重复率、计算效率、动态避障等核心工程指标出发,提供了基于不同场景(如静态/动态环境、规则/复杂布局)的实战选型指南,并分享了神经网络和局部能量最小等关键算法的参数调优与避坑经验,旨在帮助开发者根据实际需求选择并优化最合适的ipa覆盖算法。

perl8的博客 362

WebSocket 学习笔记

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

mio1012436的博客 1113

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 773

如何学习 websocket ?

如何学习 websocket ? 使用 HTML https://github.com/phoboslab/jsmpeg MPEG1 进行播放 https://w3c.github.io/media-source/ 使用原始 API 使用 canvas 绘制图像,通过 API URL.createObjectURL(Blob or ArrayBuffer) 拿到数据 ArrayBuffer Bl...

weixin_30517001的博客 188

芯片设计-信号完整性 SI 解析:Unit Interval 与比特周期的关系及其在高速信号中的应用

本文深入解析了芯片设计中信号完整性(SI)的核心概念Unit Interval(UI)与比特周期的关系及其在高速信号中的应用。通过实际案例和计算公式,详细阐述了UI在不同数据速率下的变化、在眼图分析中的关键作用,以及如何应对高速信号设计中的抖动和码间干扰等挑战。文章还提供了PCB布线和芯片设计中的UI优化技巧,帮助工程师提升高速信号设计的实战能力。

weixin_28683391的博客 468

SpringBoot如何正确连接SqlServer(亲测可用)

对于SpringBoot连接SqlServer的方式和常见的错误的汇总。1、驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。2、com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 ‘DUAL‘ 无效。

黄团团的个人博客 2万+

Pig4cloud学习版使用websocket的过程

使用sping4cloud3.8.2整合websocket功能遇到的问题和最终解决方法

sunxuthydrology的博客 1523

YOLOv11改进-卷积-引入Upsampling by Dynamic DySample 解决传统上采样灵活性问题

现有的上采样方法如等,依赖于动态卷积来生成上采样的内容感知核,但这些方法需要额外的子网络生成动态卷积核计算量较大。尤其是 FADE 和 SAPA 需要高分辨率的特征图作为引导,进一步增加了计算负担,并限制了应用场景。DySample的核心思想是将上采样过程重新定义为点采样(Point Sampling)。通过学习输入特征图中的采样点坐标,DySample 生成内容感知的采样点来对特征图进行重新采样,而不是使用动态卷积核。具体实现步骤如下:​​1. 输入特征图:大小为 C×H×W的输入特征图。

qq_64693987的博客 4659

【备忘】websocket学习之挖坑埋自己

虽然这个问题让我花了3天来寻找问题所在,但是也在过程中学习了掌握了很多知识点,毕竟是从0开始学websocket,也是实战项目,想来这样也好,遇到的问题越多,经验涨得也越快!功夫不负有心人,有心,大概说的就是坚持吧,不负,大概就是说的结果吧。

qq_15941409的博客 563

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

websocket学习

【代码】websocket学习。

weixin_43481665的博客 129

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

webSocket 学习

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它是 HTML5 中的一种新特性,能够实现 Web 应用程序和服务器之间的实时通信,比如在线聊天、游戏、数据可视化等。相较于 HTTP 协议的请求-响应模式,使用 WebSocket 可以建立持久连接,允许服务器主动向客户端推送数据,避免了不必要的轮询请求,提高了实时性和效率。

qq1195566313的博客 8497

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WebSocket 系统学习笔记

WebSocket 是一种基于TCP协议的新型网络协议,实现了(类似电话通话,双方可同时发送接收数据)。只需一次握手即可建立持久连接,支持双向数据传输。

2301_81511613的博客 1232

【网络】WebSocket学习总结

避免网络阻塞:WebSocket会受到网络阻塞的影响,当有太多的数据连接同时请求时,服务器性能会下降,使用更合适的线程池和异步IO操作可以避免线程阻塞,提高WebSocket的并发性能。使用CDN(内容分发网络)加速:可以将静态资源缓存到离用户更近的节点上,提高传输速度和性能,CDN可以缓存WebSocket的初始握手,避免不必要的网络延迟;更好的服务端资源管理:WebSocket可以保持持续活动的连接状态,服务端可以更好地管理客户端的连接,减少服务端的开销和处理时间。通过单一的TCP提供了持久化连接;

weixin_47220117的博客 573

WebSocket学习

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】TML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等**

2401_84433807的博客 1084

WebSocket学习笔记

这篇文章是WebSocket学习笔记,介绍了WebSocket的基本概念、优劣势及使用方法,并附有应用示例。

君主,永远在高峰等你 1585

WHAT - 学习 WebSocket 实时 Web 开发

学习 WebSocket 是掌握实时 Web 开发的重要一步。

weixin_58540586的博客 1561

学习WebSocket

WebSocket是一种基于TCP的全双工通信协议,支持客户端与服务器之间建立持久连接,实现实时数据交换。它通过一次握手建立连接后,双方可随时传输文本或二进制数据,相比HTTP具有更低延迟和更小开销。WebSocket协议包含握手过程、消息帧结构和API接口,支持扩展机制和子协议选择。其数据帧包含FIN、Opcode、Mask等控制字段,确保高效可靠的消息传输。开发者可通过浏览器原生API轻松实现WebSocket通信,适用于需要实时交互的应用场景。

m0_74037439的博客 732

Websocket学习

WebSocket 是一种基于 TCP 的网络协议。是一种全双工通信的协议,既允许客户端向服务器主动发送消息,也允许服务器主动向客户端发送消息。在 WebSocket 中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,进行双向数据传输。

Filwaod 986

WebSocket学习,前端面试真题解析火爆全网

在Http2.0出现之前,通过使用 Ajax、Comet,就必须要使用Http,如果使用Http,就无法彻底解决瓶颈问题,这是出现了新的一种技术,就是WebSocket,它正是为了解决这些问题而实现的一套新协议以及API。的人,其实就能理解Http2.0很大程度的借鉴了SPDY的技术,所以有人把SPDY看成是Http2.0的前身,也是可以理解的。也就是说,基于原本的Http,服务器在接收到请求后,会将响应至于挂起状态,当服务器内容有了更新,就会通过该响应返回给客户。期间,为了维持连接会消耗更多的资源。

2301_78416543的博客 686
上一篇: 各式各样的 session
下一篇: Java 基础 —— NIO 学习
IT__learning
博客等级 码龄7年 1107粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值