websocket初识

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

一,WebSocket 的特点

  1. 建立连接后全双工通信
    • WebSocket 连接建立后,客户端和服务器可以同时发送数据,实现双向通信。
  2. 轻量级的通信协议
    • WebSocket 协议的数据包头非常小,相比于 HTTP 请求,它可以更高效地传输数据。
  3. 持久性连接
    • 与 HTTP 的无状态请求不同,WebSocket 连接是持久的,只要双方都不关闭连接,就可以一直保持通信状态。
  4. 减少延迟
    • 由于 WebSocket 是基于 TCP 的持久连接,因此它减少了每次数据传输时的握手延迟。
  5. 支持文本和二进制数据
    • WebSocket 支持发送纯文本和二进制数据,适用于多种应用场景。

二,WebSocket 的工作原理

  1. 握手
    • 客户端通过 HTTP 协议发起一个特殊的请求,请求建立 WebSocket 连接。
    • 服务器收到请求后,通过 HTTP 响应来接受或拒绝这个请求。
    • 如果服务器接受请求,则客户端和服务器之间建立了 WebSocket 连接。
  2. 数据传输
    • 一旦连接建立,客户端和服务器就可以开始发送数据帧。
    • 数据帧可以是文本或二进制格式。
    • WebSocket 协议定义了一种帧格式来封装数据,包括控制帧和应用数据帧。
  3. 关闭连接
    • 当不再需要通信时,客户端或服务器可以通过发送一个特殊的关闭帧来关闭连接。
    • 关闭帧包含一个状态代码和可选的关闭原因。

三,WebSocket 的使用场景

  1. 实时聊天应用
    • 实时聊天应用需要客户端和服务端之间持续的双向通信,WebSocket 非常适合这种场景。
  2. 在线游戏
    • 在线游戏需要低延迟的数据传输,WebSocket 可以提供这种性能。
  3. 实时数据分析
    • 对于需要实时更新数据的应用程序,如股票报价、传感器数据等,WebSocket 可以实现实时数据流。
  4. 协作编辑工具
    • 多人协作编辑文档时,需要实时同步编辑内容,WebSocket 可以提供高效的解决方案。

四,WebSocket 的实现

要实现 WebSocket,既可以在服务器端进行 WebSocket 支持的配置,也可以在客户端使用 WebSocket API 进行连接和通信。下面是如何在客户端和服务器端分别实现 WebSocket 的步骤。

1. 客户端实现

在浏览器中,WebSocket API 提供了非常简单的方法来与服务器建立 WebSocket 连接,并进行数据传输。使用 WebSocket API 的基本流程如下:

  • 创建 WebSocket 连接: 使用 new WebSocket(url) 创建一个 WebSocket 实例,并传入要连接的 WebSocket 服务器的 URL。

    const socket = new WebSocket('ws://example.com/socket');
    
  • 连接事件处理: 监听 WebSocket 的 onopen 事件,当连接成功建立时,会调用该回调函数。你可以在这个事件中发送初始的消息。

    socket.onopen = function(event) {console.log('WebSocket is open now.');socket.send('Hello Server!');
    };
    
  • 接收消息: 使用 onmessage 事件来接收服务器发送的消息,服务器可以发送文本或二进制数据。

    socket.onmessage = function(event) {console.log('Message from server ', event.data);
    };
    
  • 错误处理: 如果连接过程中发生错误,可以使用 onerror 事件处理。

    socket.onerror = function(error) {console.log('WebSocket Error: ', error);
    };
    
  • 关闭连接: 使用 onclose 事件来处理 WebSocket 连接的关闭。客户端或服务器都可以关闭连接。

    socket.onclose = function(event) {console.log('WebSocket is closed now.');
    };
    
  • 手动关闭 WebSocket 连接: 在需要时,客户端可以调用 socket.close() 手动关闭连接。

    socket.close();
    
2. 服务器端实现

在服务器端,WebSocket 的实现可以使用多种语言和框架。以下是常见的 WebSocket 服务器实现方式之一——基于 Java 的实现。

使用 Java 的 WebSocket 实现(基于 javax.websocket

Java 提供了对 WebSocket 的原生支持,开发者可以使用 javax.websocket API 进行服务器端的 WebSocket 实现。

  • 导入依赖: 首先需要在项目中添加对 WebSocket 的依赖。例如,在 Maven 中可以这样添加依赖:

    <dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version>
    </dependency>
    
  • 创建 WebSocket 服务器端点: 使用 @ServerEndpoint 注解创建一个 WebSocket 端点,定义与客户端通信的方法。

    import javax.websocket.OnClose;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.ServerEndpoint;@ServerEndpoint("/socket")
    public class WebSocketServer {@OnOpenpublic void onOpen(Session session) {System.out.println("New connection opened: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("Message received: " + message);try {// Echo the message back to the clientsession.getBasicRemote().sendText("Echo: " + message);} catch (Exception e) {e.printStackTrace();}}@OnClosepublic void onClose(Session session) {System.out.println("Connection closed: " + session.getId());}
    }
    

    在这个例子中,@OnOpen@OnMessage@OnClose 注解分别处理 WebSocket 连接的打开、消息接收和连接关闭事件。

  • 部署 WebSocket 服务器: 将 WebSocket 端点类部署到支持 Java EE 的服务器(如 Tomcat、Jetty)。当客户端连接到 ws://localhost:8080/your-app/socket 时,服务器将处理 WebSocket 消息。

3. 其他服务器端实现(Node.js 示例)

除了 Java,Node.js 也是实现 WebSocket 服务器的常用语言之一。下面是使用 ws 库在 Node.js 中实现 WebSocket 的例子:

  • 安装 WebSocket 库

    npm install ws
    
  • 编写 WebSocket 服务器

    const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {ws.on('message', function incoming(message) {console.log('received: %s', message);ws.send(`Echo: ${message}`);});ws.send('Welcome to the WebSocket server!');
    });console.log('WebSocket server is running on ws://localhost:8080');
    

    运行这个脚本后,服务器就可以监听来自客户端的 WebSocket 连接并处理消息。

五,WebSocket 和 HTTP 的区别

  1. 通信模型
    • HTTP 是请求-响应模型,客户端主动发起请求,服务器被动响应。而 WebSocket 是全双工通信,客户端和服务器可以随时主动发送数据。
  2. 连接持久性
    • HTTP 是无状态协议,通常每次请求都会建立和关闭连接。而 WebSocket 一旦握手成功,连接就会保持,直到客户端或服务器主动关闭。
  3. 协议头的开销
    • HTTP 每次请求都要带上大量的头部信息,而 WebSocket 在握手之后,数据包的头部很小,通信更加高效。
  4. 数据传输模式
    • HTTP 主要传输文本数据,而 WebSocket 除了支持文本,还可以传输二进制数据,适合多种数据传输场景。

六,WebSocket 的优点和缺点

优点:
  1. 双向通信:允许客户端和服务器同时发送和接收数据,实现了实时、双向的通信。
  2. 高效性:相比于 HTTP 协议,WebSocket 的数据包头部很小,减少了带宽消耗。
  3. 低延迟:由于是持久性连接,不需要频繁建立和关闭连接,因此延迟较低,适合需要实时互动的应用。
  4. 支持二进制数据:WebSocket 支持传输二进制数据,非常适合音频、视频和文件等场景。
缺点:
  1. 服务器压力大:由于连接是长时间保持的,服务器需要维护每一个客户端的连接,导致服务器资源消耗较大。
  2. 防火墙问题:某些防火墙可能会阻止 WebSocket 连接,因为它使用的是非标准 HTTP 协议。
  3. 兼容性问题:虽然大多数现代浏览器都支持 WebSocket,但在较旧的浏览器或网络环境中可能需要使用备用方案(如轮询)来模拟双向通信。

七,总结

WebSocket 是一种强大的通信协议,它通过减少通信的开销和延迟,实现了客户端和服务器的实时双向通信。对于需要高效实时数据传输的应用场景,如聊天、游戏、股票行情、协同办公等,WebSocket 是非常适合的选择。

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

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

相关文章

【Android 14源码分析】Activity启动流程-1

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

Llama 3.2:利用开放、可定制的模型实现边缘人工智能和视觉革命

在我们发布 Llama 3.1 模型群后的两个月内&#xff0c;包括 405B - 第一个开放的前沿级人工智能模型在内&#xff0c;它们所产生的影响令我们兴奋不已。 虽然这些模型非常强大&#xff0c;但我们也认识到&#xff0c;使用它们进行构建需要大量的计算资源和专业知识。 我们也听到…

Meta首款多模态Llama 3.2开源:支持图像推理,还有可在手机上运行的版本 | LeetTalk Daily...

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 Meta最近推出的Llama Stack的发布标志着一个重要的里程碑。这一新技术的推出不仅为开发者提供了强大的多模态能力&#xff0c;还为企业和初…

编程题 7-15 计算圆周率【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 根据下面关系式&#xff0c;求圆周率的值&#xff0c;直到最后一项的值小于给定阈值。 2 π 1 1 3 2 ! 3 5 3 ! 3 5 7 ​ n ! ​ 3 5 7 ⋯ ( 2 n 1 ) ⋯ {\frac 2…

安卓13设置删除网络和互联网选项 android13隐藏设置删除网络和互联网选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有些客户不想让用户修改默认的网络配置,禁止用户进入里面调整网络相关的配置。 2.问题分析 像这个问题,我们有好几种方法去处理,这种需求一般…

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范&#xff08;Java Bean Validation&#xff0c;简称 JSR 380&#xff09;&#xff0c;它并没有具体的实现&#xff0c;它的常用实现&#xff0c;是hibernate-validator。…

java技能

日志实际使用 log.error(“111”,e);和 System.out.println(ExceptionUtils.getStackTrace(error)); 日志查询 tail -f root.log 前端页面命名&#xff1a; mounted(){ document.title‘设备可视页面’ } 查看ips所属mac nbtstat -a 10.87.236.60 获取容器名称 hostName In…

POW 与 POS是什么?

POW 与 POS是什么? POW(Proof of Work)和POS(Proof of Stake)是区块链技术中两种常见的共识机制,它们在区块链网络中扮演着至关重要的角色,用于确保网络的安全性、去中心化和交易的验证。下面将分别详细解释这两种共识机制。 POW(工作量证明) 定义: POW,即工作量…

匿名管道 Linux

管道 首先自己要用用户层缓冲区&#xff0c;还得把用户层缓冲区拷贝到管道里&#xff0c;&#xff08;从键盘里输入数据到用户层缓冲区里面&#xff09;&#xff0c;然后用户层缓冲区通过系统调用&#xff08;write&#xff09;写到管道里&#xff0c;然后再通过read系统调用&…

[leetcode] 70. 爬楼梯

文章目录 题目描述解题方法动态规划java代码复杂度分析 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1…

每一个云手机的ip是独立的吗

每一个云手机的IP地址通常是独立的。以下是关于云手机IP地址的一些详细信息&#xff1a; 1. 云手机的概念 云手机是将手机操作系统&#xff08;如Android&#xff09;虚拟化后托管在云服务器上的一种服务。用户可以通过互联网访问和控制这些云手机&#xff0c;进行应用使用、…

城市轨道交通网络客流大数据可视化分析系统----以某市交通网络客流数据为例

1 引言 1.1研究背景、目的与意义 1.1.1研究背景 城市轨道交通系统是现代城市的重要交通方式之一&#xff0c;随着城市化进程的加速和人口增长&#xff0c;轨道交通系统的客流量不断增加。因此&#xff0c;轨道交通部门和相关企业需要对客流数据进行实时监测和分析&#xff0…

BERT训练之数据集处理(代码实现)

目录 1读取文件数据 2.生成下一句预测任务的数据 3.预测下一个句子 4.生成遮蔽语言模型任务的数据 5.从词元中得到遮掩的数据 6.将文本转化为预训练数据集 7.封装函数类 8.调用 import os import random import torch import dltools 1读取文件数据 def _read_wiki(data_d…

可视化是工业互联网的核心技术之一,都有哪些应用场景?

一、工业互联网是什么&#xff0c;发展的来胧去脉 工业互联网是指利用互联网技术和物联网技术&#xff0c;将工业生产中的各种设备、机器、传感器等进行互联互通&#xff0c;实现信息的实时采集、传输和分析&#xff0c;从而实现生产过程的智能化、自动化和高效化。 工业互联网…

工业交换机一键重启的好处

在当今高度自动化和智能化的工业环境中&#xff0c;工业交换机作为网络系统中至关重要的一环&#xff0c;其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行&#xff0c;一键重启功能应运而生&#xff0c;并呈现出诸多显著的好处。 首先&am…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【下篇】

将 Mixture-of-Experts 应用于 Transformers 既然我们已经研究了条件计算的早期工作&#xff0c;那么我们就可以看看 MoE 在变换器架构中的一些应用。 如今&#xff0c;基于 MoE 的 LLM 架构&#xff08;如 Mixtral [13] 或 Grok&#xff09;已广受欢迎&#xff0c;但 MoE 在语…

高级主题:接口性能测试与压力测试

在现代软件开发中&#xff0c;确保接口的性能和稳定性是非常重要的。随着用户数量的增加&#xff0c;接口需要能够承受高并发请求&#xff0c;从而保证良好的用户体验。本篇文章将介绍如何使用 Python 工具 Locust 进行接口性能测试和压力测试&#xff0c;分析测试结果&#xf…

深入解析网络通信的四大关键要素:网卡、MAC地址、IP地址、子网掩码与端口

文章目录 深入解析网络通信的四大关键要素&#xff1a;网卡、MAC地址、IP地址、子网掩码与端口**1. 网卡&#xff08;Network Interface Card, NIC&#xff09;**关键知识点&#xff1a;联系与区别&#xff1a; **2. MAC地址 (Media Access Control Address)**关键知识点&#…

AIGC对网络安全的影响

AIGC对网络安全的影响 引言 人工智能生成内容(AIGC)技术的快速发展对网络安全领域产生了深远影响。AIGC不仅在内容创作、媒体生成等方面展现了强大的能力,还可能被恶意使用,带来新的安全威胁。本文将探讨AIGC对网络安全的影响,列举实际案例,并提供相关建议。 AIGC技术…

【Python】数据可视化之点线图

目录 散点图 气泡图 时序图 关系图 ​​​​​​​ 散点图 Scatterplot&#xff08;散点图&#xff09;是一种用于展示两个变量之间关系的图表类型。在散点图中&#xff0c;每个观测值&#xff08;或数据点&#xff09;都被表示为一个点&#xff0c;其中横轴&#xff08;…