(websocket)协议中Ping Pong,Socket通讯ping pong(长连接),心跳包

2023-11-02

-- Socket读写数据:流Socket,数据包Socket。?
   1.流套接字(SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
   2.数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
   3.原始套接字(SOCK_RAW):原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

-- Socket类型,名字/常量 描述
 SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个 socket是使用TCP来进行传输。
 SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
 SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
 SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
 SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序

  socket接收数据长度设置记录:近期在项目中使用原先封装的socket库时发现当长度超过1024时,接收到的字符串会有“烫烫烫”的标志出现,之前有看过大神调侃的“烫烫烫屯屯屯”,直觉地想到应该是数组的长度部分设置有问题。检查代码发现,用于接收的buffer长度为1024,而在使用socket的recv函数中也将最大长度设置为了1024,同时将buffer中的数组拷贝出去的长度也为1024,因此该字符串中没有‘\0’的结束符,打印出来未初始化栈空间的值,也就出现了著名的"手持两把锟斤拷,口中疾呼烫烫烫。脚踏千朵屯屯屯,笑看万物锘锘锘"。将recv函数中最大长度设置为1023或者将buffer的长度改为1025即可解决,这样就也有结束符,也就不会出现上述现象了。
   WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet技术小 了很多。Comet技术又可以分为长轮询和流技术。

  Android使用Socket分包下载字节流数据并生成文件- https://blog.csdn.net/S_Alics/article/details/81558075
任务要求:1、请求需要下载数据的总大小; 2、使用Socket从服务器分段下载字节流数据(byte[]数据); 3、以byte[]的形式追加保存到.txt文件中。

- websocket协议,长连接;Http短连接
WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。
 WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级完成后,后续的数据交换则遵照WebSocket的协议。

 websocket协议是基于tcp的网络协议,实现了浏览器与客户端的全双工通信,与http协议不同的是,它允许服务器主动推送消息给客户端。
 websocket协议分为两部分,一是握手建立连接;二是数据传输。
 建立连接:websocket的连接建立是基于http协议的。数据传输:websocket协议中数据是通过一系列的帧来传输。出于安全性考虑,所有客户端发往服务器的数据帧需要掩码,若服务器收到未掩码的数据帧将会主动断开连接;所有服务器发往客户端的数据帧不能掩码,若客户端收到掩码的数据帧将会主断开连接。

- Android 长连接,怎么处理心跳机制
  维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的
  如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个连接,对服务器来说只要断开这个连接即可。

- (websocket)协议中Ping Pong,长连接

  WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。
  发送方->接收方:ping;
  接收方->发送方:pong;
  ping、pong的操作,对应的是WebSocket的两个控制帧,opcode分别是0x9、0xA。

  websocket ping pong:目前的话,浏览器中没有相关api发送ping给服务器,只能由服务器发ping给浏览器,浏览器返回pong消息;

  WebSocket控制帧有3种:Close(关闭帧)、Ping以及Pong。控制帧的操作码定义了0x08(关闭帧)、0x09(Ping帧)、0x0A(Pong帧)。Close关闭帧很容易理解,客户端如果接受到了就关闭连接,客户端也可以发送关闭帧给服务端。Ping和Pong是websocket里的心跳,用来保证客户端是在线的,一般来说只有服务端给客户端发送Ping,然后客户端发送Pong来回应,表明自己仍然在线。

WebSocket协议深入探究-https://www.sohu.com/a/227600866_472869
OPCODE:4位 , 解释PayloadData,如果接收到未知的opcode,接收端必须关闭连接。
0x0表示附加数据帧
0x1表示文本数据帧
0x2表示二进制数据帧
0x3-7暂时无定义,为以后的非控制帧保留
0x8表示连接关闭
0x9表示ping
0xA表示pong
0xB-F暂时无定义,为以后的控制帧保留

- WebSocket分包,粘包,连包,半包
  网上很多资料都说WebSocket不会粘包,半包。OK,这是正确的,因为上述将数据帧的时候我们已经看到WebSocket会将大的数据,自动分片发送。所以WebSocket会自动分包发送,因为这种分包发送,WebSocket的数据不会溢出接收缓冲区,所以也不会有半包的情况发送。
  但是关于粘包,和连包,我看到一部分资料都说不会。因为WebSocket具有帧头信息,所以不会粘包?这是不完全正确的,要知道Tcp的报文也是具有包头信息的,只不过Socket已经处理了。而且经过我对我们项目服务器实际压力测试,发现WebSocket会粘包,连包。不同的是,WebSocket的数据中拥有包头信息,但Tcp没有(实际开发中,我们自己一定会加个包头来分割封包的,WebSocket只是替我们设计了一个包头而已),但对这个包头分割的处理,还是要我们自己完成,WebSocket不会代劳,如果我们自己不处理,抱歉,妥妥的粘包,连包

Websocket协议原理与实现(一)- https://www.jianshu.com/p/1ee01218097b
A barebones WebSocket client and server implementation written in 100% Java- https://github.com/TooTallNate/Java-WebSocket
WebSocket协议详解及应用- https://blog.csdn.net/u014520745/article/details/52639452
WebSocket的ping与pong的java实现- https://blog.csdn.net/u010770993/article/details/70312279

- Socket通讯ping pong
  做一个socket网络传输的项目,在使用TCP进行传输的时候,接收端有时候会因为写入到文件的时间而造成一定的延时,所以在接收端使用了ping-pong buffer的策略进行优化。

 ping-pong机制- https://blog.csdn.net/chenyu201003/article/details/81449762
 项目用到的Socket通讯ping pong流程图- https://blog.csdn.net/hufei20082008/article/details/53513918?utm_source=blogxgwz2
 Socket默认是长链接,为了知道Client和Server链接是否正常,项目中使用的ClientSocket和ServerSocket都有一个心跳的线程,这个线程主要是为了检测Client和Server是否正常链接,Client和Server是否正常链接主要是用ping pong流程来保证的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(websocket)协议中Ping Pong,Socket通讯ping pong(长连接),心跳包 的相关文章

  • VS编写简单的C\C++程序步骤

    VS编写简单的C C 程序步骤 一共分为两个模块 第一个模块新建项目 具体如图 1 选择文件 gt 已安装 gt Visual C gt 空项目 gt 修改项目名 gt 修改项目存储位置 gt 确定 第2个模块 新建源程序文件 具体流程如下
  • ElementUI按需引入各种组件

    ElementUI按需引入各种组件 一 首先按需引入前奏 安装element ui npm i element ui S 安装按需引入必要插件 npm install babel plugin component D 修改 babelrc
  • linux下如何安装python以及一些注意事项

    linux下如何安装python 事先需找到python的下载路径 自己下载下来或者通过wget下载下来 官网包下载路径 https www python org downloads 1 安装python3 6 13 wget https
  • Spring系列之primary可以解决什么问题?

    存在的问题以及解决方案 直接上案例 通过案例来看技术是如何使用的 package com javacode2018 lesson001 demo8 public class NormalBean public interface IServ
  • Python基础知识之4

    Python基础知识之4 函数与库 所谓函数 就是把具有独立功能的代码块组织为一个小模块 在需要的时候可以反复调用 函数分为编译器自带的函数 内建 和用户自己创建的函数 自定义函数 内建函数是编译器开发者已经定义好的函数 用户可以直接使用
  • Sharding-JDBC(六)5.1.0版本,实现按月分表、自动建表、自动刷新节点

    目录 1 Maven 依赖 2 创建表结构 3 yml 配置 4 TimeShardingAlgorithm java 分片算法类 5 ShardingAlgorithmTool java 分片工具类 6 ShardingTablesLoa
  • Home_istoreOS

    1 重置网络 修改lan口 vi etc config network 修改LAN口为 192 168 10 100 修改root密码 原始密码password2 修改为旁路由模式 只需要修改网关为 192 168 10 1 不需要DHCP
  • 解决安装依赖时报错:npm ERR! code ERESOLVE

    系列文章目录 文章目录 系列文章目录 前言 一 错误原因 二 解决方法 三 注意事项 总结 前言 在使用 npm 安装项目依赖时 有时会遇到错误信息 npm ERR code ERESOLVE 该错误通常发生在依赖版本冲突或者依赖解析问题时
  • git解决 error: you need to resolve your current index first

    问题 执行切换代码分支 git checkout featrue 2019 06 24 报错如下 error you need to resolve your current index first 执行git pull代码时报错 Pull
  • styled-components:一本通

    初体验 styled方法 将React组件包装成Styled组件 的三种情况 tagged template literal interpolations 插值表达式 mixin StyledComponent相关特性 extend 继承
  • 计算机系统实验之datalab

    datalab实验是CSAPP中关于整数和浮点数的位运算的实验 对于我们理解位运算和整数 浮点数的位级表示有着很好的帮助 实验目的 修改bits c的C语言代码 使其通过所有在不违反任何编码准则的情况下 在btest中进行测试 进一步熟悉整
  • Java代码中验证IP地址是否可访问【Linux和windows环境下】

    Java代码中验证IP地址是否可访问 Linux和windows环境下 我的需求场景是尝试连接数据源 数据库地址有不同网络环境下的地址 生产 内网 局域网等 所以在连接数据源之前判断一下url中的ip是否可访问 然后决定是否执行下一步操作
  • 解决Qt项目构建或部署时出现的Error while building/deploying project的问题

    解决Qt项目构建或部署时出现的Error while building deploying project的问题 在使用Qt开发项目时 有时会在构建或部署时遇到一些问题 其中最常见的就是Error while building deploy
  • 使用SimPY进行离散事件仿真

    使用SimPY进行离散事件仿真 SimPY是一个Python下的第三方库 可以方便的进行离散事件的仿真 仿真速度比较快 下面记录一下我的一点心得 不保证完全正确 供参考 安装 pip install U simpy 学习资源 可爱的PYTH
  • mysql检查约束_MySQL数据库通过sql语句添加约束和查看约束

    本文主要向大家介绍了MySQL数据库通过sql语句添加约束和查看约束 通过具体的内容向大家展现 希望对大家学习MySQL数据库有所帮助 一 添加约束 1 添加唯一约束 alter table student add constraint u
  • Docker实操6——配置好的强化学习Dockerfile

    自定义专属的强化环境 环境概述 一 文件内容 1 1 sh文件 1 2 换源的txt文件 1 3 测试环境的py文件 终 完整的Dockerfile 小坑 环境概述 基本信息 具体版本 系统 Ubuntu 18 04 LTS 用户 密码 p
  • Vue响应式数据的原理

    在 vue2 的响应式中 存在着添加属性 删除属性 以及通过下标修改数组 但页面不会自动更新的问题 而这些问题在 vue3 中都得以解决 vue3 采用了 proxy 代理 用于拦截对象中任意属性的变化 包括 属性的读写 属性的添加 属性的
  • C/C++使用strcpy函数报错:“XXX处有未经处理的异常:0xC0000005:写入位置0x00000000时发生访问冲突”

    strcpy是一种C语言的标准库函数 它的作用是把含有 0 结束符的字符串复制到另一个地址空间 返回值的类型为char 其原型声明 char strcpy char dest const char src 但使用strcpy函数时我们得注意
  • mobaxterm免费版使用的一个坑记录

    在没有购买mobaxtem专业版的情况下 最多可以创建14个会话 如果超过14个会话后 你对以前创建的会话进行修改 就会修改无效 还是要仔细阅读红色提示 否则修改后 按OK 是可以正常OK的 没有任何的报错 但是保存的信息依然是以前的 这是

随机推荐

  • three.js TextureLoader(纹理加载附带demo) - 04

    文章目录 一 什么是纹理加载 1 属性介绍 2 代码示例 二 纹理加载demo 注意素材位置 三 demo效果 1 素材 2 代码效果 一 什么是纹理加载 纹理一般是指我们常见的在一些第三方程序中创建的图像 如Photoshop或GIMP
  • Rsa加密算法的实现!

    maven 首先要导入Base64的maven依赖
  • 使用rospy 发送 numpy 数组出现错误 ROSSerializationException

    rospy exceptions ROSSerializationException field data must be float type 发送的数组类型是二维数组 就会出现这个问题 把数组改为一维数组 就不会出现该问题了 也就是把数
  • 【C语言】文件相关函数详解

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 文件和流 1 程序文件 2 数据文件 3 流 二 文件
  • C++面向对象继承与多态(3)

    C 面向对象继承与多态 3 前言 多态 什么是多态 多态的条件 动态绑定的原理 为什么要使用多态 总结 前言 通过前两篇博文 我已经将多态的前提条件总结得七七八八了 这一篇开始正式展开讲多态 以及我们为什么要使用多态 多态 什么是多态 引用
  • QT获取布局器中控件的位置和大小

    在QT中 获取大小和位置有多种方式 有Size Geometry BaseSize pos Geometry rect 等等 但是这些函数都是获取控件没有布局时的位置和大小 如果控件被加入到布局管理器中 那么这些函数就获取不到位置和大小了
  • C语言指针详解(经典,非常详细)

    前言 复杂类型说明 要了解指针 多多少少会出现一些比较复杂的类型 所以我先介绍一下如何完全理解一个复杂类型 要理解复杂类型其实很简单 一个类型里会出现很多运算符 他们也像普通的表达式一样 有优先级 其优先级和运算优先级一样 所以我总结了一下
  • 华为机试:密码强度等级

    一 题目 密码按如下规则进行计分 并根据不同的得分为密码进行安全等级划分 一 密码长度 5 分 小于等于4 个字符 10 分 5 到7 字符 25 分 大于等于8 个字符 二 字母 0 分 没有字母 10 分 全都是小 大 写字 20 分
  • 判断字符串的两半是否相似

    给你一个偶数长度的字符串 s 将其拆分成长度相同的两半 前一半为 a 后一半为 b 两个字符串 相似 的前提是它们都含有相同数目的元音 a e i o u A E I O U 注意 s 可能同时含有大写和小写字母 如果 a 和 b 相似 返
  • 现代处理器性能分析及优化-序

    一直以来 工程师都有一个观念 性能为王 以前是 现在是 以后更是 根据 Data Never Sleeps 5 0 调查研究 世界上每天产生2 5万亿字节的数据 并且保持着每年25 的速度递增 在我们如今的社会生活中 信息产生的来源越来越多
  • pgbench和sysbench初次压测PG集群

    pgbench和sysbench初次压测PG集群 pgbench和sysbench是两个不同的压测工具 前者只适用于pg数据库 后者可以适用于mysql pg sql server等常见关系型数据库 若是关于tps的测试 建议采用sysbe
  • tomcat配置

    1 概念 参数名 描述 maxThreads 每一次HTTP请求到达Web服务 tomcat都会创建一个线程来处理该请求 那么最大线程数决定了Web服务容器可以同时处理多少个请求 maxThreads默认200 肯定建议增加 但是 增加线程
  • A Comprehensive Survey of Dataset Distillation

    本文是蒸馏学习综述系列的第三篇文章 A Comprehensive Survey of Dataset Distillation 的一个翻译 数据集蒸馏综述 摘要 1 引言 2 背景 2 1 形式化数据集蒸馏 3 元学习框架 3 1 通过时
  • 【自然语言处理】关系抽取 —— GDPNet 讲解

    GDPNet 论文信息 标题 GDPNet Refining Latent Multi View Graph for Relation Extraction 作者 Fuzhao Xue Aixin Sun Hao Zhang Eng Sio
  • Elasticsearch插件开发与调试

    背景 elasticsearch version 6 8 5 插件开发类型 elasticsearch 变更数据记录 插件开发 略 完善后开源 插件debug 远程debug 1 准备发行版的ES 下载 解压 2 将开发好的插件 zip包
  • Python基础知识(三):Python错误、警告、异常处理总结

    1 语法错误 Python 的语法错误或者称之为解析错 是初学者经常碰到的 如下实例 gt gt gt while True print Hello world File
  • STM32——理解中断与中断配置

    前言 本文将从 这是什么 为什么需要它 如何配置操作它 三个角度展开讨论分析 目录 中断简介 抢占优先级和子优先级 中断分组 配置要点 EXTI EXTI框图讲解 信号产生过程 编程要点 中断简介 中断 即机器运行过程中出现某些意外情况 需
  • XBOX怎么查保修期限

    网站 Microsoft 帐户 设备https account microsoft com devices fref home drawers devices manage devices refd account microsoft co
  • python实战爬取招聘网站职位数据

    大家都知道金三银四是每年的求职高峰期 是中国招聘市场中最热门的季节之一 这段时间内 许多公司会发布大量的招聘信息 吸引大批求职者前来应聘 同时 也有许多人选择这个时候跳槽 因为这个时候找到新工作的机会相对较大 python 疫情放开后感觉求
  • (websocket)协议中Ping Pong,Socket通讯ping pong(长连接),心跳包

    Socket读写数据 流Socket 数据包Socket 1 流套接字 SOCK STREAM 流套接字用于提供面向连接 可靠的数据传输服务 该服务将保证数据能够实现无差错 无重复发送 并按顺序接收 流套接字之所以能够实现可靠的数据服务 原