2011-02-01 43 views
0

我正在Python中構建一個IRC bot以獲得樂趣。它應該接受以'!'爲前綴的命令並對他們採取行動。以下功能用於解析IRC消息中收到的命令。Python socket.send()在套接字關閉前才發送

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的任何實例()直到給出'!quit'命令後才發送初始連接,然後發送應該早先發送的消息的全部。爲什麼是這樣?我誤解了使用套接字的正確方法嗎?

編輯:我與一個IRC客戶端連接到同一個頻道,並且只有在給出!quit命令後,這些消息纔會出現在頻道中。

+1

你的收件代碼是什麼樣的?問題可能在那裏,而不是在發送代碼中。 – payne 2011-02-01 21:02:54

回答

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

我的一個愚蠢的錯誤,以離開終止。感謝所有幫助過我的人。

0

嘗試:

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

應該幾乎立即刷新緩衝區。

相關問題