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等等,我可以在程序中获取到另一个文件的 ...
随机推荐
- 洛谷 P1032 【字串变换】
感觉这个题用一些常用的stl和string函数会非常简单..(难道就是考这两个的吗? vector<pair<string,string>>pos//用于变化 map<s ...
- python后端从数据库请求数据给到前端的具体实现
先来贴一窜代码让大家理解前端/后端/数据库的工作原理, 首先简要说明:前端向后端请求数据,后端根据前端请求数据的类别分析其需求,并连接到数据库获取相应数据: 来一段简单的实例代码模拟淘宝商城: 前端代 ...
- Eclipse 各版本号
查看Eclipse版本号的方法:1.找到eclipse安装目录.2.进入readme文件夹,打开readme_eclipse.html.3.readme_eclipse.html呈现的第二行即数字版本 ...
- Java开发环境配置(2)--jdk配置和 多个JDK问题处理
==2018-8-15 16:41:06 更新 服务器 jdk1.6升级为1.8,没有卸载原来的1.6,直接安装1.8. 更改环境变量的 JAVA_HOME所指路径后, cmd 输入 java -ve ...
- Django学习手册 - reverse()反转URL
前端: <h1>测试</h1> <a href="/ce_test/?id=1">1按键</a> <a href=" ...
- Django学习手册 - ORM 单表数据获取
Django 单表数据的获取: 先建立数据表格 from django.db import models # Create your models here. class userinfo(model ...
- Android SpannableString实现TextView的点击事件
最近项目中遇到一个问题,就是一段文字中股票可点击并跳到股票详情,只记得SpannableString可以实现富文本功能,但并不知道可实现的富文本有点击功能,就开始借助万能搜索引擎,结果不出意料,的确有 ...
- Memcache的安装和使用【转】
转自:https://www.cnblogs.com/caoxiaojian/p/5715573.html Memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问 ...
- logging模块--日志文件
初级的使用配置模式类似与print 默认打印waring等级及以上--通过更改等级来测试代码 logging.debug("debug no china") #调试模式 loggi ...
- Apollo 代码的编译演示
Apollo 代码的编译演示 官方的文档 -- 运行线下演示 如果你没有车辆及车载硬件, Apollo还提供了一个计算机模拟环境,可用于演示和代码调试. 线下演示需要设置docker的release环 ...