day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题
TCP 基于流的协议
又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低
正因为是基于流的协议 所以会出现粘包问题
粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有一个缓冲池 ,操作系统并不会马上把数据发送给服务器端的缓冲池,而是在自己的缓冲池中,
操作系统会将数据小,发送间隔短的数据进行底层优化,然后一起发送出去就造成了数据的混合,以至于到了服务器哪里的缓冲池也区分不出来,造成的粘包
原因二,数据发到服务器的缓冲池中,服务器没有及时发送给应用软件接收,造成了在服务器缓冲池中的粘包
根本原因:是因为接收方在接收数据的时候不知道数据的长度是多少,故在服务器的操作系统缓冲池中取不到正确长度的数据,造成了数据取多,或者取少,导致的粘包问题
解决的方法 导入struct模块
客户端:
import socket
import struct
"""
解决粘包的核心思路就是
先通知接收方 要发送的数据的长度
在发送真实数据
问题在于 数据长度 也是不确定的
对方也不清楚 长度信息 到底是几个字节
要想办法 将长度信息所占的字节数 固定下来
"""
c = socket.socket()
c.connect(("127.0.0.1",8888))
# 要发送的数据
data = "{'name':'jerry'}".encode("utf-8")
# 给接收方发送数据的长度
length = len(data)
# 将整型的长度 转为固定长度的字节
len_data = struct.pack("q",length)
# 发送长度信息
c.send(len_data)
# 发送真实数据
c.send(data)
服务器:
import socket
import struct
"""
TCP 的粘包问题
TCP 流式协议
基于数据流的协议 """
s = socket.socket()
s.bind(("127.0.0.1",8888))
s.listen()
c,addr = s.accept() # 先接收长度
# 有可能 长度信息和真实数据也黏在一起 无法取出长度信息 # 解决方案是 把长度信息 转换为一个固定字节数的二进制数据
# 1 4个字节的bytes
# 2 4个字节的bytes
# 20000 4个字节的bytes
# 接收数据的长度信息
length = struct.unpack("q",c.recv(8))[0]
print("长度为:%s" % length)
data = c.recv(length).decode("utf-8")
print(data)
UDP 基于数据报的传输协议
传输效率高,但不关心对方是否收到数据 可以放在语音通话 和视频通话上
udp是放在数据帧里面传输的 数据帧最多放1500个字节,除去udp的报头 一个数据帧最多发送1472个字节的udp,如果udp过大
就会被拆分成多个数据帧发送到网络,即会造成丢包的现象
day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题的更多相关文章
- python基础22------python基础之基于tcp和udp的套接字
一.TCP套接字 1.low版tcp套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就 ...
- 网络编程之基于tcp和udp的套接字
一 udp协议网络编程 DNS:将域名解析成ip地址 SOCK_DGRAM:数据报协议,也是udp协议 udp协议的网络编程的一些用法: recvfrom:接收消息,接收的时一个元组,元组里面的元 ...
- Learning-Python【28】:基于TCP协议通信的套接字
什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...
- 基于UDP的套接字、粘包问题
一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...
- 基于TCP协议的socket套接字编程
目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...
- 基于TCP连接的socket套接字编程
基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- 基于TCP和UDP的socket
为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的 ...
随机推荐
- 5.22 HTML 列表标签和表单标签
1,ul无序列表 标签 ul:unordered list ,就是无序列表的意思. li: listitem 列表项的意思.无序列表的每一项都是<li>. <!DOCTYPE h ...
- ES6走一波 Iterator
Iterator---> for ... of 循环 Generator函数原生具有 Iterator接口,所以可采用数组的形式解构赋值
- 分页插件通用处理,以asp.net mvc为例
Model: public class PaggerModel { public PaggerModel() { BarSize = ; } public PaggerModel(int total, ...
- 虚拟节点操作——DocumentFragment
文章中转站: DocumentFragment对象 createDocumentFragment()用法总结 深入理解DOM节点类型第四篇——文档片段节点DocumentFragment
- mysql 原理 ~ kill session解析
一 简介:kill session为什么需要很久 二 kill语句分为三类 1 DML语句 2 select语句 3 DDL语句 三 kill都要做什么操作 1 kill对sessio ...
- Android Studio buildGrade文件注解
apply plugin: 'com.android.application' //指定用的那个插件,android App插件打包得到.apk文件 //com ...
- Java基础4-面向对象概述;super();this()
昨日内容回顾 java基本数据类型: byte : 一个字节,-128 ~ 127 = 256 short : 两个字节, -32768 ~ 32767 int : 四个字节, long : 八个字节 ...
- 国产 WEB UI 框架 (收费)-- Quick UI,Mini UI
国产 WEB UI 框架 (收费)-- Quick UI,Mini UI : http://www.uileader.com/ http://www.miniui.com/
- Python3学习笔记33-正则表达式
学习文章传送门 正则表达式是用来匹配字符串的.只要符合规则的字符串.就可以认为匹配了.否则,这个字符串不合法. \d:可以匹配一个数字 ‘00\d’可以匹配001不能匹配00A \w:可以匹配 ...
- C#实现邮件发送的功能
Ø 发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮 ...