当前位置: 首页 > news >正文

Websocket从原理到实战

引言

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,它使得客户端和服务器之间能够进行实时、双向的通信,既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解

发展历史

WebSocket 最初是为了解决 HTTP 协议在实时通信方面的局限性而诞生的。在传统的 HTTP 通信中,客户端与服务器之间的通信是请求 - 响应模式,服务器只能在接收到客户端请求后才能发送数据给客户端,无法主动向客户端推送数据。随着 Web 应用对实时性要求的不断提高,如在线聊天、实时游戏、股票行情实时显示等场景的出现,WebSocket 协议应运而生,它于 2011 年被 IETF 定为标准 RFC 6455,并得到了各大浏览器和服务器的广泛支持。可以说websocket伴随着移动互联网的发展。

websocket的特征

  • 建立在 TCP 协议之上;

  • 与 HTTP 协议有着良好的兼容性:

  • 默认端口也是 80(ws) 和 443(wss,运行在 TLS 之上),并且握手阶段采用 HTTP 协议;

  • 较少的控制开销:连接创建后,ws 客户端、服务端进行数据交换时,协议控制的数据包头部较小,而 HTTP 协议每次通信都需要携带完整的头部;

  • 可以发送文本,也可以发送二进制数据;

  • 没有同源限制,客户端可以与任意服务器通信;

  • 协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL;

  • 支持扩展:ws 协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议(比如支持自定义压缩算法等); 

应用场景

  • 即时聊天通讯

  • 弹幕展示

  • 实时地图位置

        

实战

实现websocket服务器

引入maven依赖

<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.3</version>
</dependency>

实战代码

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;public class MyWebSocketServer extends WebSocketServer {public MyWebSocketServer(int port) {super(new InetSocketAddress(port));}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {System.out.println("新的连接: " + conn.getRemoteSocketAddress());conn.send("欢迎连接到 WebSocket 服务器!");}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {System.out.println("连接关闭: " + conn.getRemoteSocketAddress());}@Overridepublic void onMessage(WebSocket conn, String message) {System.out.println("收到消息: " + message + " 来自: " + conn.getRemoteSocketAddress());conn.send("服务器收到消息: " + message);}@Overridepublic void onError(WebSocket conn, Exception ex) {ex.printStackTrace();if (conn != null) {// 处理错误}}@Overridepublic void onStart() {System.out.println("WebSocket 服务器已启动,监听端口: " + getPort());}public static void main(String[] args) {int port = 8887;MyWebSocketServer server = new MyWebSocketServer(port);server.start();}
}

相关文章:

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数

声明 就在 main函数所在的 nginx.c 中&#xff1a; static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...

判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…...

Centos执行yum命令报错

错误描述 错误&#xff1a;为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release8&archx86_64&repoAppStream&infrastock [Could not resolve h…...

订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能

如何使用redis实现订单超时实时关闭功能 准备工作实现步骤解释注意事项&#xff08;重点&#xff09; 使用Redis实现订单超时实时关闭功能&#xff0c;可以利用Redis的延时队列&#xff08;使用Sorted Set实现&#xff09;和过期键&#xff08;使用TTL和Keyspace Notifications…...

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品&#xff1a; || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A&#xff08;TX&#xff09;连接RX B&#xff08;RX&#xff09;连接TX 打开1个网络调试助手&#xff0c;模拟用户的UDP客户端设…...

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…...

4种架构的定义和关联

文章目录 **1. 各架构的定义****业务架构&#xff08;Business Architecture&#xff09;****应用架构&#xff08;Application Architecture&#xff09;****数据架构&#xff08;Data Architecture&#xff09;****技术架构&#xff08;Technology Architecture&#xff09;*…...

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数&#xff0c;同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法&#xff0c;错误的方法 filename./check.php 还是一样的回显 傻了&#xff0c;题目名称是文件包含&#xff0c;需要用到…...

leetcode90 子集II

1. 题意 给一个可能含有重复元素的数组&#xff0c;求这个数组的所有子集。 2. 题解 跟leetcode 72 子集的差别在于&#xff0c;我们需要将重复的元素给去掉。那如何去重呢&#xff0c;实际上我们可以先排序将重复的元素给放在一起。然后在回溯后&#xff0c;找到下一个不与…...

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

PyTorch torch.unbind、torch.split 和 torch.chunk函数介绍

pytorch中 torch.unbind、torch.split 和 torch.chunk等函数可用于张量的拆分操作。 1. torch.unbind 功能说明&#xff1a; torch.unbind 沿指定的维度将张量“解包”为多个张量&#xff0c;返回一个元组。解包后被操作的那个维度会消失&#xff0c;每个输出张量的维度数会比…...

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》061-Vue Router的动态路由

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...

杭州某小厂面试

问的都是基础知识&#xff0c;主要是三个部分&#xff1a;计网&#xff0c;数据库&#xff0c;java。计网答得挺好&#xff0c;数据答得一般&#xff0c;Java答得一坨。 目录 1.TCP/IP协议的5层模型 2.3次握手和4次挥手 3.操作系统中的进程和线程的区别 4.lunix top 命令看…...

C基础寒假练习(8)

一、终端输入10个学生成绩&#xff0c;使用冒泡排序对学生成绩从低到高排序 #include <stdio.h> int main(int argc, const char *argv[]) {int arr[10]; // 定义一个长度为10的整型数组&#xff0c;用于存储学生成绩int len sizeof(arr) / sizeof(arr[0]); // 计算数组…...

设计模式 ->模板方法模式(Template Method Pattern)

模板方法模式 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义一个操作的算法骨架&#xff0c;而将一些步骤延迟到子类中实现。它允许子类在不改变算法结构的情况下重新定义算法中的某些步骤 特点 算法骨架&#xff1a; 在基类中定义算法的框架延迟实现&…...

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...

MySQL开窗函数种类和使用总结

在 MySQL 中&#xff0c;开窗函数&#xff08;Window Functions&#xff09; 是一种强大的功能&#xff0c;能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入&#xff0c;可以基于数据的某个分组&#xff08;窗口&#xff09;来执行计算&#xf…...

DeepSeek——DeepSeek模型部署实战

摘要 文章主要介绍了DeepSeek大模型的本地部署方法、使用方式以及API接入相关内容。首先指出可通过下载Ollama来部署DeepSeek-R1模型&#xff0c;并给出了模型不同参数版本及存储信息。接着说明了如何通过Chatbox官网下载并接入DeepSeek API&#xff0c;以及如何接入本地部署模…...

zsh: command not found: pip

当你在终端输入 pip install ipykernel 时出现 zsh: command not found: pip 错误&#xff0c;这表明系统无法找到 pip 命令&#xff0c;下面为你详细分析可能的原因以及对应的解决办法。 可能的原因 Python 未安装&#xff1a;pip 是 Python 的包管理工具&#xff0c;若你的…...

UMAP降维技术:拓扑数据分析驱动的高效可视化方案

UMAP降维技术&#xff1a;拓扑数据分析驱动的高效可视化方案 【免费下载链接】umap Uniform Manifold Approximation and Projection 项目地址: https://gitcode.com/gh_mirrors/um/umap 在高维数据可视化领域&#xff0c;研究者长期面临"鱼和熊掌不可兼得"的…...

AIO PathProb 时序概率路径系统

本文由&#xff08;拓世网络技术开发工作室&#xff09;技术支持&#xff0c;欢迎共同开发第一部分&#xff1a;伪代码 / 算法描述&#xff08;给算法/工程侧&#xff09;1. 全局定义&#xff08;状态与概率&#xff09;import numpy as npfrom dataclasses import dataclass# …...

AtlasOS系统Xbox控制器驱动问题:三步解决方案与预防指南

AtlasOS系统Xbox控制器驱动问题&#xff1a;三步解决方案与预防指南 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atl…...

51单片机红外避障循迹小车实战:从接线到代码调试全流程(附避坑指南)

51单片机红外避障循迹小车实战&#xff1a;从硬件搭建到算法优化全解析 在电子制作领域&#xff0c;红外避障循迹小车堪称"入门必修课"。这个看似简单的项目&#xff0c;实则融合了传感器技术、电机控制、逻辑编程等多个核心知识点。不同于市面上大多数教程只停留在基…...

别再只盯着model.score()了!Python机器学习模型评估的5种实用方法对比

超越model.score()&#xff1a;Python机器学习模型评估的五大实战工具 当你的机器学习模型在测试集上表现不佳时&#xff0c;model.score()给出的单一数值往往无法揭示问题的全貌。就像医生不能仅凭体温判断病情一样&#xff0c;数据科学家也需要更丰富的诊断工具来全面评估模型…...

RV1106平台下基于设备树的GPIO驱动开发实战

1. RV1106平台GPIO驱动开发入门指南 刚拿到RV1106开发板的时候&#xff0c;我最头疼的就是怎么控制那些GPIO引脚。作为嵌入式Linux开发者&#xff0c;GPIO控制可以说是最基础也最常用的功能。不同于单片机直接操作寄存器的方式&#xff0c;Linux系统下需要通过设备树和驱动框架…...

Excel 修改单元格值的内核操作原理

你现在直接看穿了 Excel 的底层本质&#xff01;你说的 100% 正确&#xff01;而且是最底层、最硬核、最真实的原理&#xff01;我给你用最直白、最硬核、程序员视角完整还原一遍&#xff0c;你马上彻底通透&#xff1a;&#x1f525; 终极结论&#xff08;你说的完全对&#x…...

COMSOL能源开采仿真:基质中瓦斯扩散、裂隙中瓦斯渗流,分析不同工况条件下渗透率演化、有效抽...

COMSOL能源开采仿真&#xff1a;基质中瓦斯扩散、裂隙中瓦斯渗流&#xff0c;分析不同工况条件下渗透率演化、有效抽采半径、抽采产量。 使用模块&#xff1a;PDE&#xff08;基质瓦斯扩散&#xff09;&#xff0c;达西定律/PDE&#xff08;裂隙瓦斯渗流&#xff09;&#xff0…...

一键部署体验:圣女司幼幽-造相Z-Turbo文生图模型效果实测

一键部署体验&#xff1a;圣女司幼幽-造相Z-Turbo文生图模型效果实测 1. 模型简介与部署准备 圣女司幼幽-造相Z-Turbo是一款基于Z-Image-Turbo模型的LoRA微调版本&#xff0c;专门用于生成《牧神记》中角色"圣女司幼幽"的高质量图像。该模型通过Xinference框架部署…...

想入门脑机接口?这5个免费EEG数据集帮你从理论到实战(含Python处理示例)

想入门脑机接口&#xff1f;这5个免费EEG数据集帮你从理论到实战&#xff08;含Python处理示例&#xff09; 当你第一次听说脑机接口&#xff08;BCI&#xff09;时&#xff0c;脑海中浮现的可能是科幻电影中那些炫酷的场景——用意念控制机械臂、通过思维与计算机交互。但现实…...