【问题标题】:Python socket.send() is not sent until socket is closedPython socket.send() 在套接字关闭之前不会发送
【发布时间】:2011-02-01 20:54:29
【问题描述】:

为了好玩,我正在用 Python 构建一个 IRC 机器人。它应该接受以“!”为前缀的命令并对它们采取行动。下面的函数用于解析 IRC 消息中接收到的命令。

def parse_cmd(self, sender):
    #Admin Commands
    if sender == self.owner:
        if self.command == 'quit':
            send_bufr = "QUIT %s\r\n" %(self.channel)
            self.sock.send(bytearray(send_bufr, "utf-8"))
            self.sock.close()
            sys.exit(1)
        if self.command == 'hi':
            print("Run: Hi")
            send_bufr = "PRIVMSG %s :Hello %s" %(self.channel, sender)
            print(send_bufr)
            self.sock.send(bytearray(send_bufr, "utf-8"))
            return
        else:
            return
    else:
        return

感叹号被提前解析,函数使用 self.command 作为命令,该命令也被提前设置。以下代码用于设置 USER、NICK 并加入频道,self.sock.send 在这里可以正常工作:

    #Send NICK self.nick to set NICK
    send_bufr = ("NICK %s \r\n") %(self.nick)
    self.sock.send(bytearray(send_bufr, "utf-8"))
    print("Set Nick to %s" %(self.nick))

    #Send USER to set USER
    send_bufr = ("USER %s 8 * :S0lder \r\n") %(self.nick)
    self.sock.send(bytearray(send_bufr, "utf-8"))
    print("Set USER to %s 8 :S0lder" %(self.nick))

    #JOIN self.channel
    send_bufr = ("JOIN %s \r\n") %(self.channel)
    self.sock.send(bytearray(send_bufr, "utf-8"))
    print("Joined %s" %(self.channel))
    time.sleep(5)

然而,在前面的函数中,在初始连接之后的任何 self.sock.send() 实例都不会发送,直到给出 '!quit' 命令,此时 所有 消息应该更早发送的被发送。为什么是这样?我是否误解了使用套接字的正确方法?

编辑:我使用 IRC 客户端连接到同一个频道,并且消息仅在我发出 !quit 命令后才会出现在频道中。

【问题讨论】:

  • 您的接收代码是什么样的?问题可能在那里,而不是在发送代码中。
  • 我不知道 IRC,但是您对 hi 命令的响应似乎有问题。它不应该包括一个终止符,例如\r\n吗?
  • 我的接收代码工作正常,因为我在 socket.send() 打印之前添加的调试 print() 函数指示已收到命令。
  • 非常感谢 Winston Ewert,因为这是问题所在。我犯了一个愚蠢的错误。
  • 题外话:你应该使用socket.sendall

标签: python sockets irc


【解决方案1】:

在他对我的问题的评论中,Winston Ewert 是正确的。 socket.send 应该是这样的:

send_bufr = "PRIVMSG %s :Hello %s\r\n" %(self.channel, sender)
print(send_bufr)
self.sock.send(bytearray(send_bufr, "utf-8"))

省略终结符是我的一个愚蠢错误。感谢所有提供帮助的人。

【讨论】:

    【解决方案2】:

    试试:

    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    

    应该立即刷新缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多