Python socket.send () не отправляется, пока сокет не будет закрыт - PullRequest
0 голосов
/ 01 февраля 2011

Я строю IRC-бот на Python для удовольствия. Предполагается принимать команды с префиксом «!» и действовать на них. Приведенная ниже функция используется для анализа команд, полученных в сообщении 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 ]

1 голос
/ 02 февраля 2011

В своем комментарии на мой вопрос Уинстон Эверт был прав. В файле 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 голосов
/ 02 февраля 2011

Попробуйте:

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

, что должно немедленно очистить буфер

...