python之socket编程(TCP)-服务器端分析客户端发来的数据 作者:马育民 • 2019-01-03 15:38 • 阅读:10166 ##概述 在上篇文章中,能够成功解决TCP粘包、拆包问题,在本篇文章中,我们要在服务器端解析出客户端发来的数据 我们发现,客户端发来的数据,每一段都是由冒号```:```分割,前面是key,后面是value部分,我们根据此规则分析数据 ##服务器端优化 ###先拼装成大文本,然后处理文本 1. 接收所有数据 2. 将数据解码成字符串 3. 根据结束符将整个字符串拆分成每一段 4. 对每一段字符串处理,根据冒号拆分字符串,解析出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数据做处理, 1. 找到冒号,解析出key 2. 找到结束符,解析出value 3. 然后解码成字符串 ``` 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-------------------------') ``` 原文出处:http://www.malaoshi.top/show_1EF2XntugUk7.html