- 传输层之TCP与UDP协议
- 应用层
- socket模块简介
- socket模块基本使用
- 代码优化处理
- socket黏包问题
- 黏包问题的解决方案
传输层之TCP与UDP协议


| 三次握手建链接TCP与UDP都是用来规定通信方式的 |
| 通信的时候可以随心所欲的聊 也可以遵循以一些协议符合要求的聊 |
| 随性所欲的聊:文字 图片 视频 小油腻话 你侬我侬 |
| 遵循一些协议:开头带尊陈 首行空两格 只准用官话 不能打情骂俏 |
| ps:不遵循上述协议也可以通信 只不过遵循了更合规合法合理!!! |
| |
| |
| 1.TCP协议(***) |
| 三次握手建链接 |
| 1.TCP协议也称为可靠协议(数据不容易丢失) |
| 造成数据不容易丢失的原因不是因为有双通道 而是因为有反馈机制 |
| 给对方发消息之后会保留一个副本 直到对方回应消息收到了才会删除 |
| 否则会在一定的时间内反复发送 |
| 2.洪水攻击 |
| 同一时间有大量的客户端请求建立连接 会导致服务端一致处于SYN_RCVD状态 |
| 3.服务端如何区分客户端建立连接的请求 |
| 可以对请求做唯一标识 |
| 四次挥手断链接 |
| 1.四次不能合并为三次 |
| 因为中间需要确认消息是否发完 |
| (TIME_WAIT) |
| """ |
| 三次握手和四次挥手也可以看成时小情侣谈恋爱的过程 |
| 三次握手:表白在一起 |
| 四次挥手:决裂要分手 |
| """ |
| |
| 2.UDP协议 |
| 也称之为数据报协议、不可靠协议 |
| 早期的QQ使用的是纯生的(没有加任何额外功能) |
| UDP协议 |
| 现在的QQ自己添加了很多技术和功能 |
| 使用UDP的原因就是因为很简单 快捷 粗暴 只要指定对方的地址就可以发消息了 |
| """ |
| TCP我们可以看成是打电话:双方你侬我侬 |
| UDP我们可以看成是发短信:只要发了就行 不管对方看不看 |
| """ |
应用层
| 应用层相当于是程序员自己写的应用程序 里面的协议非常的多 |
| 常见的有:HTTP、HTTPS、FTP |
| ps:后续框架部分再做介绍 |
socket模块
| 如果我们需要编写基于网络进行数据相互的程序 意味着我们需要自己通过代码来控制我们之前所学习的 |
| OSI七层(很繁琐 很复杂 类似于我们自己编写操作系统) |
| socket类似于操作系统 封装了丑陋复杂的接口提供简单快捷的接口 |
| |
| socket也叫套接字 |
| 基于文件类型的套接字家族(单机) |
| AF_UNIX |
| 基于网络类型的套接字家族(联网) |
| AF_INET |
socket代码简介
| import socket |
| |
| """ |
| 以后要养成查看源码编写代码的思路 |
| """ |
| 1.产生一个对象socket对象并指定采用的通信版本和协议(TCP) |
| server = socket.socket() |
| 2.绑定一个固定的地址(服务端必备的条件) |
| server.blind(('127.0.0.1',8000)) |
| 3.设立半连接池 |
| server.listen(5) |
| 4.等待接客 |
| sock, addr = sever.accept() |
| print(sock,addr) |
| 5.服务客人 |
| data = sock.recv(1024) |
| print(data.decode('utf8')) |
| sock.send('尊敬的客人 您说什么就是什么 一切按照您的要求来'.encode('utf8')) |
| 6.关闭双向通道 |
| sock.close() |
| 7.关闭服务器 |
| server.close() |
| |
| |
| import socket |
| |
| |
| client = socket.socket() |
| |
| client.connect(('127.0.0.1',8080)) |
| |
| client.send('大爷有钱 把你们店金牌最好的技师叫出来'.encode('utf8')) |
| |
| data = client.recv(1024) |
| print(data.decode('utf8')) |
| |
| client.close() |
代码优化
| 1.聊天内容自定义 |
| 针对消息采用input获取 |
| 2.让聊天循环起来 |
| 将聊天的部分用循环包起来 |
| 3.用户输入的信息不能为空 |
| 本质其实是两边不能都是recv或者send 一定是一方收一方发 |
| 4.服务端多次重启可能会报错 |
| Address already in use 主要是mac电脑会报 |
| 方式1:改端口号 |
| 方式2:博客里面代码拷贝即可 |
| 5.当客户端异常断开的情况下 如何让服务端继续服务其他客人 |
| windows服务端会直接报错 |
| mac服务端会有一段时间反复接收空消息延迟报错 |
| 异常处理 空消息判断 |
| |
半连接池的概念
| server.listen(5) |
| |
| 当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题) |
| 假设服务端只有一个人的情况下 |
| |
| 在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构