代码之家  ›  专栏  ›  技术社区  ›  Assad Ginem

如何修复从服务器解包响应的错误属性错误:“tuple”对象没有属性“tag”

  •  0
  • Assad Ginem  · 技术社区  · 5 年前

    我从一个网络服务器接收到一个响应,并试图解包该响应并将其显示在屏幕上,但遇到了错误

     AttributeError: 'tuple' object has no attribute 'tag'
    

    我想这可能与我如何调用上面的变量有关。请不要忘了我对python和socket编程非常陌生。

    无论如何,响应格式有3个部分

           TYPE  OFFSET
     tag   uint32    0
     code  uint32    4
     message string  8
    

    应显示:标记:1(或任意数字) 代码:200(成功) 留言:“嘿”

                import socket
                import struct
                import textwrap
    
                TCP_IP = '127.0.0.1'
                TCP_PORT = 4200
    
                TAB_1 = '\t - '
                TAB_2 = '\t\t - '
                TAB_3 = '\t\t\t - '
                TAB_4 = '\t\t\t\t - '
    
                DATA_TAB_1 = '\t   '
                DATA_TAB_2 = '\t\t   '
                DATA_TAB_3 = '\t\t\t   '
                DATA_TAB_4 = '\t\t\t\t   '
    
                def main():
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    s.connect(("127.0.0.1", 4200))
    
                    packet = struct.pack('ii', 1,4)
    
                    s.send(packet)
    
                    while True:
                        response, addr = s.recvfrom(65535)
                        print(response.__sizeof__())
                        bny = binary_response(response)
                        print(TAB_1 + 'Binary Response Segment:')
                        print(TAB_2 + 'Tag: {}, Code: {}' + bny.tag, bny.code)
                        print(TAB_2 + 'Message: ' + bny.response)
    
    
                # Unpack binary_response
                def binary_response(response):
                    tag, code = struct.unpack('i i', response[:12])
                    return tag, code, response[12:]
    
    
    
    
                main()
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   John Gordon    5 年前

    正如错误信息所说, binary_response() 返回一个元组,但您试图访问返回的标记值,就好像它是一个属性一样。不是这样。

    因为标记是返回元组中的第一个元素,所以使用 bny[0] 而不是 bny.tag .