struct 模块解决 TCP黏包问题
2024-08-27 14:11:42
首先来看一下产生黏包现象的一段代码:
# 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))
最新文章
- WPF下的Richtextbox中实现表格合并,添加删除行列等功能
- MAC Objective-C 开发经典书籍推荐
- SequoiaDB 系列之三 :SequoiaDB的高级功能
- jquery常见问题
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)(转载)
- python基于http协议编程:httplib,urllib和urllib2<;转>;
- vijos p1193 扫雷
- Python多线程的threading Event
- 【jquery、XML】jquery通过按钮使打开select
- linux上部署rmi+memcache服务
- 一个bat病毒分析(part1)
- npm -D -S 的区别
- 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验
- HDFS,MapReduce,Hive,Hbase 等之间的关系
- asp.net通过后台代码给前台设置css样式,下拉列表在js中的取值
- 软件工程 BUAAMOOC项目Postmortem结果
- jsp常见的指令总结
- 怎样修复grub开机引导(grub rescue)
- 【哈希表】Ural Championship April 30, 2017 Problem H. Hamburgers
- poj 1182 食物链 并查集的又一个用法
热门文章
- jQuery中的closest()和parents()的差别
- Android訪问网络,使用HttpURLConnection还是HttpClient?
- 什么是鸭子类型(duck typing)
- cmd执行调用打开文件
- WINDOWS XP 系统显示乱码的解决方法(修改注册表,使用正常字体)
- 【HDU 1847】 Good Luck in CET-4 Everybody!
- [CSharp] C#开源大全
- js 对象方法、类方法、原型方法区别
- SNMP简单概述
- 利用Aspose.Cells导出Datatable数据