【问题标题】:socket.recvfrom function returning a tuple (python)socket.recvfrom 函数返回一个元组(python)
【发布时间】:2015-05-27 18:56:09
【问题描述】:

我是 python noobie,我必须创建一个连接 4 台机器的 Truco(巴西游戏,如果你不知道的话)游戏。我正在使用课程,使用泡菜将其传输到套接字。根据我在网上可以找到的内容,这应该可以,但是我的 recv 是一个元组,我不能使用来自元组的负载。我尝试将其转换为列表,然后转换为字符串,但没有任何效果!

def recv(self, machine):
    PORT = 5054
    HOST = ''
    orig = (socket.gethostbyname(HOST), PORT)
    machine._socketrcv.bind(orig)
    recv = machine._socketrcv.recvfrom(1024)
    return pickle.loads(recv)

这是我的发送方法:

def sent(self, m, machine):
    PORT = 5054
    dest = (machine._host, PORT)
    self._socketsnd.sendto(m._dados,dest)

其中 m._dados 是 self.dados = pickle.dumps(dados, 2)

谁能帮忙?

【问题讨论】:

    标签: python sockets pickle


    【解决方案1】:

    您可能想通读socket,然后执行recv = machine._socketrcv.recvfrom(1024)[0] 之类的操作

    socket.recvfrom(bufsize[, flags])

    从套接字接收数据。返回值是一对(字符串,地址),其中字符串是表示接收到的数据的字符串,地址是发送数据的套接字的地址。有关可选参数标志的含义,请参见 Unix 手册页 recv(2);它默认为零。 (地址的格式取决于地址族——见上文。)

    【讨论】:

      【解决方案2】:

      recvfrom 返回一个包含数据和地址的元组(更多信息可以在socket documentation 中找到)。与其他一些语言不同,Python 允许你在赋值的左侧放置一个元组,所以如果你这样做:

      data, (address, port) = machine._socketrcv.recvfrom(1024)
      

      您可以在单独的命名变量中访问您需要的所有信息。在您的情况下,您只需要数据:

      pickle.loads(data)
      

      【讨论】:

      • recvfrom 返回的第二个元素是一个 2 元素元组,它本身包含 IP 地址和建立连接的端口。据我所知,这段代码运行良好。
      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2019-05-09
      • 2023-01-18
      相关资源
      最近更新 更多