Python socket.send() 直到套接字关闭才发送
我正在用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"))
我犯了个低级错误,忘记加结束符了。感谢所有帮助过我的人。