在socket关闭之前,不会发送Python socket.send()

时间:2011-02-01 20:54:29

标签: python sockets irc

我正在使用Python构建一个IRC bot以获得乐趣。它应该接受以'!'为前缀的命令并采取行动。下面的函数用于解析在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命令后才会在频道中显示消息。

2 个答案:

答案 0 :(得分: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"))

我的一个愚蠢的错误就是遗漏终结者。感谢所有帮助过的人。

答案 1 :(得分:0)

尝试:

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

应该立即刷新缓冲区。