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的套接字方法 粘包问题 丢包问题的更多相关文章

  1. python基础22------python基础之基于tcp和udp的套接字

    一.TCP套接字 1.low版tcp套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就 ...

  2. 网络编程之基于tcp和udp的套接字

    一   udp协议网络编程 DNS:将域名解析成ip地址 SOCK_DGRAM:数据报协议,也是udp协议 udp协议的网络编程的一些用法: recvfrom:接收消息,接收的时一个元组,元组里面的元 ...

  3. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  4. 基于UDP的套接字、粘包问题

    一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...

  5. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  6. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

  7. python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议

    socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...

  8. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  9. 基于TCP和UDP的socket

    为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的 ...

随机推荐

  1. Windows下开启composer镜像服务来安装yii

    网上关于使用composer的安装教程挺多的,但是作为新手的我,觉得好凌乱,不断尝试后,终于安装好了.最后总结出,用开启composer的镜像服务来安装yii是最好的啦,当然,归档文件的做法有利有弊就 ...

  2. modbus 寄存器介绍

    modbus 的查询命令 命令 地址开始(两个地址)     地址长度(两个地址)          检验 01  xx     xx xx                              ...

  3. 329 experience

    截止到现在,给我最大的冲击就是HTML没有像JAVA那样严格 可以随意搭配,换句话说 HTML要的就是效果 没有一个固定的方法 即便是代码有错误 也可以实现效果 今天的东西挺好吃 能吃的消 哈哈 开森 ...

  4. 课程8:《Maven精品教程视频》--视频目录

    2017年3月18日 老师讲的课程 \day01视频\01maven依赖管理.avi; \day01视频\02maven项目构建.avi; \day01视频\03maven程序安装.avi; \day ...

  5. Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock

    一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...

  6. Spring重温(三)--Spring依赖注入(DI)

    前言:在Spring框架中,DI(依赖注入)是用来定义对象彼此间的依赖,主要有set方法注入和构造器注入两种方式.另外,当一个类包含多个构造函数带的参数相同,它总是会造成构造函数注入参数类型歧义的问题 ...

  7. Eclipse安装教程 ——史上最详细安装Java &Python教程说明

    参考链接:https://blog.csdn.net/zichen_ziqi/article/details/73995755

  8. js中创建数组,并往数组里添加元素

    数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长 ...

  9. hadoop-1.2.1集群搭建

    继续上一篇:http://www.cnblogs.com/CoolJayson/p/7430654.html 首先需要安装上台虚拟机, 分别为: master, salve1, slave2 1.复制 ...

  10. 在Linux环境下使用Jexus部署ASP.NET Core

    关于如何在Linux中添加ASP.NET Core运行时环境请参考我的上一篇文章,本文章将不再做赘述. 本文章运行环境如下:  (1) 安装独立版Jexus 本教程安装的是独立版的Jexus,独立版的 ...