首先来看一下产生黏包现象的一段代码:
# 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. Rails 异常处理 &amp;&amp; 性能

    Rails 异常处理 的多种处理方法 1.  routes match '*path', via: :all, to: 'controller#action' 2.  application.rb 的 ...

  2. 原型设计模式prototype-构造js自己定义对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Android 源代码解析 之 setContentView

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41894125,本文出自:[张鸿洋的博客] 大家在平时的开发中.对于setCont ...

  4. PL/SQL Developer自己主动补全SQL语句

    快捷输入SQL语句,比如输入s,按下空格,自己主动替换成SELECT;再比如,输入se,按下空格, 自己主动替换成SELECT * FROM,很方便,节省了大量的时间去编写反复的SQL语句. 设置方法 ...

  5. Python查询数据库,中文的结果显示不出来

    表里面的数据: 问题:查询数据库,返回结果不是中文可以,是中文的话就报错UnicodeEncodeError: 'gbk' codec can't encode character '\xd4' in ...

  6. 改你MB需求!

    改你MB需求! 原创 2015-12-08 尖峰视界 尖峰视界 我敏锐的觉察到,产品经理的头像開始闪动了.在0.1秒的时间内,我全身的血液都冲向了大脑.果然.右上角弹出了文件传输窗体. "最 ...

  7. 【NOIP 2004】 虫食算

    [题目链接] https://www.luogu.org/problemnew/show/P1092 [算法] 搜索 + 剪枝 直接搜索显然会超时,考虑剪枝 1 : 优化搜索顺序 2 : 假设我们已经 ...

  8. 【POJ 2044】 Weather Forecast

    [题目链接] http://poj.org/problem?id=2044 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...

  9. 南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询

    加密前:{"time":"1510053168455","username":"GH_DATA_EXCHANGE",&q ...

  10. [codeforces contest 1119 F] Niyaz and Small Degrees 解题报告 (树形DP+堆)

    interlinkage: http://codeforces.com/contest/1119/problem/F description: 有一颗$n$个节点的树,每条边有一个边权 对于一个$x$ ...