python之socket编程(TCP)-服务器端分析客户端发来的数据

概述

在上篇文章中,能够成功解决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-------------------------')

原文出处:/show_1EF2XntugUk7.html