概述
在上篇文章中,能够成功解决TCP粘包、拆包问题,在本篇文章中,我们要在服务器端解析出客户端发来的数据
我们发现,客户端发来的数据,每一段都是由冒号:分割,前面是key,后面是value部分,我们根据此规则分析数据
服务器端优化
先拼装成大文本,然后处理文本
- 接收所有数据
- 将数据解码成字符串
- 根据结束符将整个字符串拆分成每一段
- 对每一段字符串处理,根据冒号拆分字符串,解析出key和value
import socket
s = socket.socket()
s.bind(('0.0.0.0', 9999))
s.listen(5)
print('开始监听')
#在这里写一个死循环,永远接收客户端请求
while True:
conn, address = s.accept()
print('接收到客户端请求')
print('conn类型',type(conn))
print('address类型',type(address),address)
conn.sendall('server is ok!'.encode('utf-8'))
last_data=bytes()
while True:
data=conn.recv(1024)
#当接收数据长度为0时,表示发送完毕
data_len=len(data)
print('接收数据长度:%d'%data_len)
last_data+=data
if len(data)==0:
break
print("来自%s:%s的消息:"%(address[0],address[1]))
d={}
text=last_data.decode('utf-8')
lines=text.split('\n')
for item in lines:
pos=item.find(':')
if pos>=0:
d[item[:pos]]=item[pos+1:]
print(d)
conn.close()
print('\n\n-------------------------')
接收bytes类型数据后直接处理
这个版本是接收bytes类型数据后,直接对bytes数据做处理,
- 找到冒号,解析出key
- 找到结束符,解析出value
- 然后解码成字符串
import socket
s = socket.socket()
s.bind(('0.0.0.0', 9999))
s.listen(5)
print('开始监听')
#在这里写一个死循环,永远接收客户端请求
while True:
conn, address = s.accept()
print('接收到客户端请求')
print('conn类型',type(conn))
print('address类型',type(address),address)
conn.sendall('server is ok!'.encode('utf-8'))
last_data=bytes()
d={}
while True:
data=conn.recv(1024)
#当接收数据长度为0时,表示发送完毕
data_len=len(data)
print('接收数据长度:%d'%data_len)
if data_len==0:
break
last_data+=data
startpos=0
for index,item in enumerate(last_data):
# 将数字转换成字符
if chr(item)==':':
key=last_data[startpos:index].decode('utf-8')
startpos=index+1
elif chr(item)=='\n':
value=last_data[startpos:index].decode('utf-8')
startpos=index+1
d[key]=value
key=''
value=''
#如果最后一个不是结束符
if last_data[:-1] != '\n':
last_data=last_data[startpos:]
print(d)
conn.close()
print('\n\n-------------------------')