struct模块使用原理:
将一组简单数据进行打包,转换为bytes格式进行发送,或者将一组bytes个数数据转换为python数据类型。
2. 接口使用
【1】st = Struct(fmt)
功能: 生成结构化对象
参数: fmt 定制的数据结构
e.g. 要组织的数据 1 b'lisi' 1.75
fmt : 'i4sf'
【2】 st.pack(v1,...)
功能: 将一组数据按照指定格式打包转换
参数: 要打包的数据
返回值: bytes字节串
【3】 st.unpack(bytes_data)
功能: 将bytes字节串按照格式解析
参数: bytes字节串
返回值: 解析后的数据元组
【4】 struct.pack(fmt,v1,...)
struct.unpack(fmt,bytes_data)
说明 : 可以使用struct模块直接调用pack,unpack,第一个参数直接传入fmt
发送端:
from socket import *
import struct
fmt = 'i32sif'
ADDR = ('127.0.0.1',8888)
s = socket(AF_INET,SOCK_DGRAM)
while True:
print("\n*********************")
id = int(input("ID:"))
name = input("Name:")
age = int(input("Age:"))
score = float(input("Score:"))
data = struct.pack(fmt,id,\
name.encode(),age,score)
s.sendto(data,ADDR)
s.close()
接收端:
from socket import *
import struct
import pymysql
# 创建数据库游标对象
db = pymysql.connect('localhost','root',\
'123456','Test')
cursor = db.cursor()
s = socket(AF_INET,SOCK_DGRAM)
s.bind(('0.0.0.0',8888))
# 确定数据格式(1,b'zhangsan',8,90.5)
st = struct.Struct('i32sif')
while True:
data,addr = s.recvfrom(1024)
# 解析数据
data = st.unpack(data)
id = data[0]
name = data[1].decode()
age = data[2]
score = data[3]
print(id,name,age,score)
# 插入输入库
sql = "insert into stu values \
(%d,'%s',%d,%f)"%(id,name,age,score)
try:
cursor.execute(sql)
db.commit()
except Exception as e:
db.rollback()
print(e)
s.close()
db.close()