zoukankan      html  css  js  c++  java
  • 解决粘包问题

    解决粘包问题

    #struct模块
    import struct
    #把一个数字打包成固定长度的4字节
    obj=struct.pack('i',1098)
    print(obj)
    print(len(obj))
    
    l=struct.unpack('i',obj)[0]
    print(l)
    
    b'Jx04x00x00'
    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'))
    
    
  • 相关阅读:
    八款常用的 Python GUI 开发框架推荐
    scrapy + mogoDB 网站爬虫
    tkinter界面卡死的解决办法
    通过核心API启动单个或多个scrapy爬虫
    爬虫怎样绕过验证码?
    Python爬虫入门教程 33-100 电影评论数据抓取 scrapy
    Python开发 之 Websocket 的使用示例
    StringBuffer详解
    其实python正则表达式就这样简单明了
    ABAP和Java里的单例模式攻击
  • 原文地址:https://www.cnblogs.com/aden668/p/11478424.html
Copyright © 2011-2022 走看看