SOCKET编程(1):基本概念

基本概念

socket分类

socket提供了**流(stream)数据报(datagram)**两种通信机制,即流socket和数据报socket

流socket基于TCP协议,是一个有序、可靠、双向字节流的通道,传输数据不会丢失、不会重复、顺序也不会错乱

数据报socket基于UDP协议,不需要建立和维持连接,可能会丢失或错乱。UDP不是一个可靠的协议,对数据的长度有限制,但是它的效率比较高

某些应用层协议,出于历史原因,受当时技术和网络条件限制,选择了基于UDP实现,其选择的理由现在很可能已经不再成立了

实时的音视频聊天可能采用的是UDP,这种业务可以接受数据的丢失且不必重传

简单的socket通信流程

在这里插入图片描述

主机字节序和网络字节序

https://www.cnblogs.com/xingguang1130/p/11643446.html

大端、小端字节序

在这里插入图片描述

网络字节序和主机字节序

网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用big endian排序方式

不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。我们把某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序

由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序

htons(), ntohs(), ntohl(),htonl()函数

ntohs, ntohl, htons,htonl的比较和详解

网络字节序与主机字节序之间的转换函数:**htons(), ntohs(), ntohl(),htonl()**,位于头文件<netinet/in.h>

htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换

htonl()--"Host to Network Long int"     32Bytesntohl()--"Network to Host Long int"     32Byteshtons()--"Host to Network Short int"    16Bytesntohs()--"Network to Host Short int"    16Bytes

在使用little endian的系统中,这些函数会把字节序进行转换

在使用big endian类型的系统中,这些函数会定义成空宏

TCP三次握手与四次挥手

TCP三次握手四次挥手详解

TCP三次握手详解-深入浅出(有图实例演示)

💡 主要是面试时候可能会问,实际编程帮助不大

在这里插入图片描述

TCP报文分包和粘包

分包:发送方发送字符串”helloworld”,接收方却接收到了两个字符串”hello”和”world”

粘包:发送方发送两个字符串”hello”+”wold”,接收方却一次性接收到了"helloworld"

下面的例子中就既有分包也有粘包的情况

服务端:

客户端(127.0.0.1)已连接
接收:这是第1个超级女生,编号001
接收:这是第2个超级女生,编号002这是第3个超级女生,编号003这是第4个超级女生,编号004这是第5个超级女生,编号005这是第6个超级女生,编号006这是第7个超级女生,编号007这是第8个超级女生,编号008这是第9个超级女生,编号009这是第10个超级女生,编号010这是第11个超级女生,编号011这是第12个超级女生,编号012这是第13个超级女生,编号013这是第14个超级女生,编号014这是第15个超级女生,编号015这是第16个超级女生,编号016这是第17个超级女生,编号017这是第18个超级女生,编号018这是第19个超级女生,编号019这是第20个超级女生,编号020这是第21个超级女生,编号021这是第22个超级女生,编号022这是第23个超级女生,编号023这是第24个超级女生,编号024这是第25个超级女生,编号025这是第26个超级女生,编号026这是第27个超级女生,编号027这是第28个超级女生,编号028这是@dq�
接收:第29个超级女生,编号029这是第30个超级女生,编号030这是第31个超级女生,编号031这是第32个超级女生,编号032这是第33个超级女生,编号033这是第34个超级女生,编号034这是第35个超级女生,编号035这是第36个超级女生,编号036这是第37个超级女生,编号037这是第38个超级女生,编号038这是第39个超级女生,编号039这是第40个超级女生,编号040这是第41个超级女生,编号041这是第42个超级女生,编号042这是第43个超级女生,编号043这是第44个超级女生,编号044这是第45个超级女生,编号045这是第46个超级女生,编号046这是第47个超级女生,编号047这是第48个超级女生,编号048这是第49个超级女生,编号049这是第50个超级女生,编号050这是第51个超级女生,编号051这是第52个超级女生,编号052这是第53个超级女生,编号053这是第54个超级女生,编号054这是第55个超级女生,编号055这�@dq�
接收:��第56个超级女生,编号056这是第57个超级女生,编号057这是第58个超级女生,编号058这是第59个超级女生,编号059这是第60个超级女生,编号060这是第61个超级女生,编号061这是第62个超级女生,编号062这是第63个超级女生,编号063这是第64个超级女生,编号064这是第65个超级女生,编号065这是第66个超级女生,编号066这是第67个超级女生,编号067这是第68个超级女生,编号068这是第69个超级女生,编号069这是第70个超级女生,编号070这是第71个超级女生,编号071这是第72个超级女生,编号072这是第73个超级女生,编号073这是第74个超级女生,编号074这是第75个超级女生,编号075这是第76个超级女生,编号076这是第77个超级女生,编号077这是第78个超级女生,编号078这是第79个超级女生,编号079这是第80个超级女生,编号080这是第81个超级女生,编号081这是第82个超级女生,编号082��@dq�

客户端:

发送:这是第51495个超级女生,编号51495
发送:这是第51496个超级女生,编号51496
发送:这是第51497个超级女生,编号51497
发送:这是第51498个超级女生,编号51498
发送:这是第51499个超级女生,编号51499

但是TCP传输数据能保证几点:

  1. 顺序不变,例如发送方发送hello,接收方也一定顺序接收到hello,这个是TCP协议承诺的,因此这点成为我们解决分包和粘包问题的关键
  2. 分割的包中间不会插入其他数据

在实际开发中,为了解决分包和粘包的问题,就一定要自定义一份协议,最常用的方法是:

  • 报文长度+报文内容,如9999helloworld
  • 报文长度ASCII码/或二进制的整数

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

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

相关文章

通过父类定义日志输出

1、定义基类&#xff1a; public class BaseController {public Class clazz null;public Logger log null;{clazz this.getClass();log LoggerFactory.getLogger(clazz);} } 2、子类统一继承该基类&#xff1a; RestControllerpublic class AAAController extends Base…

Powerdesigner导入mysql8之后注释丢失

目录 一、问题描述及解决思路 二、导入的步骤 1.先按正常步骤建立一个物理数据模型 &#xff08;1&#xff09;点击“文件-新建模型” &#xff08;2&#xff09;选择物理模型和数据库 2.从sql文件导入表 &#xff08;1&#xff09;点击“数据库-Update Model from Data…

【Redis7】10大数据类型之Set类型

文章目录 1.Set类型2.常用命令&#xff1a;3.示例3.1 SADD,SMEMBERS和SISMEMBER3.2 SREM和SCARD3.3 SRANDMEMBER和SPOP3.4 SMOVE 4.集合运算相关命令4.1 集合交集 (SINTER)4.2 集合并集 (SUNION)4.3 集合差集 (SDIFF)4.4 Redis7新命令sintercard 1.Set类型 Redis的Set类型是一…

正则表达式-前瞻和后顾

正则表达式中的前瞻和后顾。 前瞻(Lookahead) 前瞻是一种断言,它会检查在当前位置之后是否存在某种模式,但不会实际匹配该模式。前瞻有两种形式: 正向前瞻 (?pattern) 检查当前位置之后是否存在指定的模式如果存在,则匹配成功,但不会消耗该模式例如 \w(?\d) 将匹配后面跟数…

RAG 场景对Milvus Cloud向量数据库的需求

虽然向量数据库成为了检索的重要方式,但随着 RAG 应用的深入以及人们对高质量回答的需求,检索引擎依旧面临着诸多挑战。这里以一个最基础的 RAG 构建流程为例:检索器的组成包括了语料的预处理如切分、数据清洗、embedding 入库等,然后是索引的构建和管理,最后是通过 vecto…

【Redis7】10大数据类型之Bitmap类型

文章目录 1.Bitmap(位图)2.常用命令3.示例3.1 SETBIT和GETBIT3.2 STRLEN3.3 BITCOUNT3.4 BITOP 1.Bitmap(位图) Redis的Bitmap类型并不是一个独立的数据类型&#xff0c;而是对String类型的一种巧妙使用&#xff0c;允许开发者以位级别操作字符串中的数据。Bitmap可以视为一个…

学习笔记:【QC】Android Q : telephony-phone 模块

一、phone init 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以放大看】 二、phone MO 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以放大看】 三、phone MT 流程图 高清的流程图参考&#xff1a;【高清图&#xff0c;保存后可以…

MySQL慢查询优化【二】

当处理MySQL慢查询优化时&#xff0c;通常需要考虑以下几个方面&#xff1a; 索引优化&#xff1a;确保查询涉及的列上存在适当的索引&#xff0c;以加快数据检索速度。可以通过使用EXPLAIN语句来查看查询执行计划&#xff0c;并评估是否使用了索引。举例来说&#xff0c;如果…

提升工作效率,用ONLYOFFICE打造高效团队协作环境

作为一名深耕技术领域已有六七年的开发者&#xff0c;同时又是断断续续进行技术创作将近六年的一个小小作者&#xff0c;我在工作和日常生活中&#xff0c;使用过各色各样的软件。 而在最近几年&#xff0c;一款名为ONLYOFFICE的开源办公套件逐渐走进并融入我的工作与生活&…

paraview 处理 fluent 计算结果

paraview 处理 fluent 计算结果 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/598032490 希望先生的主页也很有价值&#xff1a;https://www.cnblogs.com/Xiwang-Sun/p/14943429.html

Edge浏览器的前端开发体验与深度探索

Edge浏览器作为一款备受关注的现代浏览器&#xff0c;在前端开发领域扮演着重要的角色。在这篇博文中&#xff0c;我将分享我对Edge浏览器的使用心得与深度探索&#xff0c;探讨其在前端开发中的优势和特点。 1. Edge浏览器的优势 a. 兼容性 Edge浏览器注重兼容性&#xff0c…

String是最基本的数据类型吗?

在Java编程语言的语境中&#xff0c;探讨“String是否是最基本的数据类型”是一个深入且富有意义的话题。首先&#xff0c;我们需要明确“基本数据类型”的定义&#xff0c;并在此基础上探讨String的特性及其在编程中的角色。 一、基本数据类型的定义 基本数据类型&#xff0…

如何在适用于 Linux 的 Visual Studio Code 中使用 .NET 8 上的 FastReport Avalonia

我们将继续撰写有关在各种操作系统上的 Visual Studio Code 中使用 FastReport Avalonia 的系列文章。在本文中&#xff0c;我们将详细分析如何使用 Visual Studio Code IDE 在 Linux 操作系统上运行 FastReport Avalonia。 Avalonia UI 是一个积极用于开发跨平台用户界面的 .…

Hyper-V 管理器安装的ubutun扩容磁盘空间说明

一、删除检查点 首先把这个想要扩容的虚拟机停止掉&#xff0c;然后找到检查点&#xff0c;全删除掉&#xff0c;否则没法编辑这个虚拟磁盘。 二、编辑虚拟磁盘 下面截图中下一步不能点击的&#xff0c;只要删除检查点之后就可以点击了。点击下一步然后选择扩容&#xff0c;然后…

组合模式(结构型)

目录 一、前言 二、透明组合模式 三、安全组合模式 四、总结 一、前言 组合模式(Composite Pattern)是一种结构型设计模式&#xff0c;将对象组合成树形结构以表示“部分-整体”得层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式由以下角色组成…

AI助手,为生活和工作增添新体验

在当今科技飞速发展的时代,人工智能(AI)已经渗透到我们生活和工作的方方面面。无论是传统的大型语言模型,还是专注于搜索领域的AI助手,都为我们带来了前所未有的便利和效率。让我们一起来探索这些AI产品的魅力所在。 大型语言模型凭借强大的自然语言处理能力,可以为我们提供多…

SpringSecurity源码分析(RemeberMe)

RememberMeServices RememberMeServices 记住我的服务的接口 可以重写实现自己的记住我 public interface RememberMeServices { //建议 org. springframework. security. authentication. RememberMeAuthenticationToken 在大多数情况下使用它&#xff0c;因为它具有相应的身份…

C++初识及概述

C概述 c简介 “ c ”中的来自于c语言中的递增运算符&#xff0c;该运算符将变量加1。c起初也叫 ” c with clsss ”.通过名称表明&#xff0c;c是对C的扩展&#xff0c;因此c是c语言的超集&#xff0c;这意味着任何有效的c程序都是有效的c程序。c程序可以使用已有的c程序库。…

词袋法TFIDF

Tf-idf⽂本特征提取 TF-IDF的主要思想是&#xff1a;如果某个词或短语在⼀篇⽂章中出现的概率⾼&#xff0c;并且在其他⽂章中很少出现&#xff0c;则认为此词或者短语具有很好的类别区分能⼒&#xff0c;适合⽤来分类。TF-IDF作⽤&#xff1a;⽤以评估⼀字词对于⼀个⽂件集或…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具&#xff0c;用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成&#xff0c;准确率高达 98.8%。 不过该公司表示&#xff0c;这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…