首先来看一下产生黏包现象的一段代码:
# server.py 服务端
import socket
​
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
​
conn,addr = sk.accept()
conn.send('hello,'.encode('utf-8'))
conn.send('world'.encode('utf-8'))
conn.recv(1024)
conn.close()
​
sk.close()
# client.py 客户端
import time
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
​
time.sleep(0.1)
print(sk.recv(12))      # 'hello,worl' 'hello,world'
print(sk.recv(10))      # 'd'         '一直等待接收'
sk.send(b'hahaha')
​
sk.close()
 
 
上述代码中。客户端连接了服务端后。服务端连续send了两条数据。客户端随后接收。但是第一次接收 sk.recv(12)  就己经把所有的数据取走了。导致 后面的 recv 一直接收不到数据
下面通过 struct 模块来解决黏包问题:
# server.py 服务端
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
​
conn,addr = sk.accept()
​
msg = '你好'.encode('utf-8')*100
int_num = len(msg)
byte_num = struct.pack('i',int_num)      # 通过 struct.pack方法 转换 int_num 变成4个字节的 bytes
conn.send(byte_num)
conn.send(msg)
conn.send(b'world')

<wiz_code_mirror>

import time,struct
import socket
sk = socket.socket()
​
sk.connect(('127.0.0.1',9000))
time.sleep(0.5)
​
num = struct.unpack('i',sk.recv(4))           # 接收并用 struct.unpack 转换回来 num 是个元祖
print(sk.recv(num[0]).decode('utf-8'))
print(sk.recv(1024))
 
 

struct 模块解决 TCP黏包问题的更多相关文章

  1. 用struct模块解决tcp的粘包问题

    服务器端程序 import struct import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn ...

  2. netty]--最通用TCP黏包解决方案

    netty]--最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender 2017年02月19日 15:02:11 惜暮 阅读数:1 ...

  3. Python网络编程基础 struct模块 解决黏包问题 FTP

    struct模块 解决黏包问题 FTP

  4. 铁乐学Python_Day34_Socket模块2和黏包现象

    铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必 ...

  5. socketserver tcp黏包

    socket (套接字) tcp(黏包现象原因) 传输中由于内核区缓冲机制(等待时间,文件大小),会在 发送端 缓冲区合并连续send的数据,也会出现在 接收端 缓冲区合并recv的数据给指定port ...

  6. python套接字解决tcp粘包问题

    python套接字解决tcp粘包问题 目录 什么是粘包 演示粘包现象 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数 ...

  7. TCP黏包问题

    什么是黏包?什么情况下会出现黏包的情况?该如何避免黏包的情况? 首先来看一个例子 #服务端 import time from socket import * server = socket(AF_IN ...

  8. tcp黏包

    转载https://www.cnblogs.com/wade-luffy/p/6165671.html 无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. 回 ...

  9. Netty使用LineBasedFrameDecoder解决TCP粘包/拆包

    TCP粘包/拆包 TCP是个”流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TC ...

随机推荐

  1. GIS+=地理信息+容器技术(1)——容器技术概述

    -------------------------------------------------------------------------------------- Blog:    http ...

  2. _DataStructure_C_Impl:链串

    //_DataStructure_C_Impl:链串 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  3. 【Cocos2dx】资源目录,播放背景音乐,导入外部库

    在Cocos2dx中播放背景音乐是一件非常easy的事情,就一行代码,可是首先要导入Cocos2dx的音频引擎cocosDenshion. cocosDenshion对cocos2dproject提供 ...

  4. Palindrome Linked List 234

    推断是否为回文链栈 时间复杂度为O(n) 空间复杂度为O(1) : 运用递归 保证空间复杂度为O(1): 时间复杂度为O(n): 注意定义了一个全局变量 flag = true 用此标记来标记是否在推 ...

  5. 2016.04.06,英语,《Vocabulary Builder》Unit 10

    put, from the Latin verb putare, meaning 'to think, consider, or believe'. reputation: [ˌrepju'teɪʃn ...

  6. Node.js:Web 模块

    ylbtech-Node.js:Web 模块 1.返回顶部 1. Node.js Web 模块 什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服 ...

  7. ClassLoader.getResourceAsStream(name);获取配置文件的方法

    ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+" ...

  8. Juniper交换机维护

    Juniper交换机维护操作之一: 1.1   交换机启动和关闭 1.1.1   重新启动 1.   使用具有足够权限的用户名和密码登陆CLI命令行界面. 2.   在提示符下输入下面的命令: use ...

  9. Kettle 版本及使用问题

    kettle 简介 Kettle也叫PDI (Pentaho Data Intergration) Kettle 版本及下载 7.1及更早版本: https://sourceforge.net/pro ...

  10. CSS3伪元素、伪类选择器

    伪元素选择器: ::first-letter:为某个元素中的文字的首字母或第一个字使用样式. ::first-line:为某个元素的第一行文字使用样式. ::before:在某个元素之前插入一些内容. ...