码迷,mamicode.com
首页 > 其他好文 > 详细

解决粘包问题

时间:2019-09-06 22:48:54      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:port   sub   win   exception   客户端   大小   windows   关闭   通道   

解决粘包问题

#struct模块
import struct
#把一个数字打包成固定长度的4字节
obj=struct.pack('i',1098)
print(obj)
print(len(obj))

l=struct.unpack('i',obj)[0]
print(l)

b'J\x04\x00\x00'
4
1098
#server粘包
import socket
import subprocess
import struct
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.bind(('127.0.0.1',8001))
soc.listen(3)
while True:
    print('等待客户端连接')
    conn,addr=soc.accept()
    print('有个客户端连接上了',addr)
    while True:
        try:
            data=conn.recv(1024)
            if len(data)==0:
                break
            print(data)
            obj = subprocess.Popen(str(data,encoding='utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            #执行正确的结果 b 格式,gbk编码(windows平台)
            msg=obj.stdout.read()
            #发送的时候需要先把长度计算出来
            #头必须是固定长度
            #10
            #100
            #先取出要发送数据长度l

            l=len(msg)
            #head 是固定四个字节
            head=struct.pack('i',l)
            #发了头
            conn.send(head)
            #发了内容
            conn.send(msg)
        except Exception:

            break
    # 关闭通道
    conn.close()


# 关闭套接字
soc.close()
#client粘包
import socket
import struct
soc=socket.socket()

soc.connect(('127.0.0.1',8001))
while True:
    in_s=input('请输入要执行的命令:')
    soc.send(in_s.encode('utf-8'))
    head=soc.recv(4)
    l=struct.unpack('i',head)[0]
    # data=soc.recv(l)
    count=0
    data_total=b''

    while count<l:
        if l<1024: #如果接受的数据小于1024 ,直接接受数据大小
            data=soc.recv(l)
        else:#如果接受的数据大于1024
            if l-count>=1024: #总数据长度-count(目前收到多少,count就是多少) 如果还大于1024  ,在收1024
                data=soc.recv(1024)
            else: #总数据长度-count(目前收到多少,count就是多少) 如果小于1024,只收剩下的部分就可
                data=soc.recv(l-count)

        data_total+=data
        count+=len(data)

    print(str(data_total,encoding='gbk'))

解决粘包问题

标签:port   sub   win   exception   客户端   大小   windows   关闭   通道   

原文地址:https://www.cnblogs.com/aden668/p/11478424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!