Python socket.send() 直到套接字关闭才发送

0 投票
2 回答
4402 浏览
提问于 2025-04-16 11:02

我正在用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作为命令,而self.command也是之前设置好的。接下来的代码是用来设置用户、昵称,并加入一个频道,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

试试这个:

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

这应该会让缓冲区几乎立刻清空。

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"))

我犯了个低级错误,忘记加结束符了。感谢所有帮助过我的人。

撰写回答