当前位置:
首页 > temp > 简明python教程 >
-
python基础(30):黏包、socket的其他方法(4)
#1T数据,文件路径和md5值
#为了该报头能传送,需要序列化并且转为bytes
head_bytes=bytes(json.dumps(header),encoding='utf-8') #序列化并转成bytes,用于传输
#为了让客户端知道报头的长度,用struck将报头长度这个数字转成固定长度:4个字节
head_len_bytes=struct.pack('i',len(head_bytes)) #这4个字节里只包含了一个数字,该数字是报头的长度
#客户端开始发送
conn.send(head_len_bytes) #先发报头的长度,4个bytes
conn.send(head_bytes) #再发报头的字节格式
conn.sendall(文件内容) #然后发真实内容的字节格式
#服务端开始接收
head_len_bytes=s.recv(4) #先收报头4个bytes,得到报头长度的字节格式
x=struct.unpack('i',head_len_bytes)[0] #提取报头的长度
head_bytes=s.recv(x) #按照报头长度x,收取报头的bytes格式
header=json.loads(json.dumps(header)) #提取报头
#最后根据报头的内容提取真实的数据,比如
real_data_len=s.recv(header['file_size'])
s.recv(real_data_len)
struct的详细用法:
- #_*_coding:utf-8_*_
- #http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html
- __author__ = 'Linhaifeng'
- import struct
- import binascii
- import ctypes
- values1 = (1, 'abc'.encode('utf-8'), 2.7)
- values2 = ('defg'.encode('utf-8'),101)
- s1 = struct.Struct('I3sf')
- s2 = struct.Struct('4sI')
- print(s1.size,s2.size)
- prebuffer=ctypes.create_string_buffer(s1.size+s2.size)
- print('Before : ',binascii.hexlify(prebuffer))
- # t=binascii.hexlify('asdfaf'.encode('utf-8'))
- # print(t)
- s1.pack_into(prebuffer,0,*values1)
- s2.pack_into(prebuffer,s1.size,*values2)
- print('After pack',binascii.hexlify(prebuffer))
- print(s1.unpack_from(prebuffer,0))
- print(s2.unpack_from(prebuffer,s1.size))
- s3=struct.Struct('ii')
- s3.pack_into(prebuffer,0,123,123)
- print('After pack',binascii.hexlify(prebuffer))
- print(s3.unpack_from(prebuffer,0))
(2) 使用struct解决黏包
借助struct模块,我们知道长度数字可以被转换成一个标准大小的4字节数字。因此可以利用这个特点来预先发送数据长度。
server:
- import socket,struct,json
- import subprocess
- phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
- phone.bind(('127.0.0.1',8080))
- phone.listen(5)
- while True:
- conn,addr=phone.accept()
- while True:
- cmd=conn.recv(1024)
- if not cmd:break
- print('cmd: %s' %cmd)
- res=subprocess.Popen(cmd.decode
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数