首先来看一下产生黏包现象的一段代码:
# 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))
 
 

最新文章

  1. WPF下的Richtextbox中实现表格合并,添加删除行列等功能
  2. MAC Objective-C 开发经典书籍推荐
  3. SequoiaDB 系列之三 :SequoiaDB的高级功能
  4. jquery常见问题
  5. IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)(转载)
  6. python基于http协议编程:httplib,urllib和urllib2&lt;转&gt;
  7. vijos p1193 扫雷
  8. Python多线程的threading Event
  9. 【jquery、XML】jquery通过按钮使打开select
  10. linux上部署rmi+memcache服务
  11. 一个bat病毒分析(part1)
  12. npm -D -S 的区别
  13. 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验
  14. HDFS,MapReduce,Hive,Hbase 等之间的关系
  15. asp.net通过后台代码给前台设置css样式,下拉列表在js中的取值
  16. 软件工程 BUAAMOOC项目Postmortem结果
  17. jsp常见的指令总结
  18. 怎样修复grub开机引导(grub rescue)
  19. 【哈希表】Ural Championship April 30, 2017 Problem H. Hamburgers
  20. poj 1182 食物链 并查集的又一个用法

热门文章

  1. jQuery中的closest()和parents()的差别
  2. Android訪问网络,使用HttpURLConnection还是HttpClient?
  3. 什么是鸭子类型(duck typing)
  4. cmd执行调用打开文件
  5. WINDOWS XP 系统显示乱码的解决方法(修改注册表,使用正常字体)
  6. 【HDU 1847】 Good Luck in CET-4 Everybody!
  7. [CSharp] C#开源大全
  8. js 对象方法、类方法、原型方法区别
  9. SNMP简单概述
  10. 利用Aspose.Cells导出Datatable数据