Python socket.send()在套接字关闭之前不会被发送

Python socket.send()在套接字关闭之前不会被发送,python,sockets,irc,Python,Sockets,Irc,为了好玩,我正在用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

为了好玩,我正在用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作为命令,该命令也在前面设置。以下代码用于设置用户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()的任何实例都不会被发送,直到“!发出“退出”命令,此时将发送所有本应提前发送的消息。为什么会这样?我是否误解了使用插座的正确方法

编辑:我用IRC客户端连接到同一个频道,只有在我给出提示后,消息才会显示在该频道中!退出命令。

尝试:

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

这应该会立即刷新缓冲区。

在他对我的问题的评论中,温斯顿·埃维特是正确的。socket.send应已读取:

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

我犯了一个愚蠢的错误,漏掉了《终结者》。感谢所有帮助过你的人。

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