Чтение фиксированного количества байтов из сокета с асинхронным Python - PullRequest
1 голос
/ 15 августа 2010

Я использую asyncore для связи с удаленными серверами по протоколу типа «длина: сообщение». Может кто-нибудь порекомендовать мне способ прочитать точное количество байтов из сокета? Я пытался использовать handle_read для заполнения внутреннего буфера и каждый раз вызывать мою функцию, проверяя размер буфера, но это выглядело слишком уродливо (Проверьте, достаточно ли длинен буфер для чтения длины, проверьте, больше ли длина буфера, чем длина сообщения, прочитайте сообщение и т.д ...). Возможно ли иметь что-то вроде «socket.read (bytes)», которое будет спать, пока буфер не будет достаточно заполнен и не вернет значение?

1 Ответ

1 голос
/ 15 августа 2010

Нет. Сон победил бы всю цель асинхронного ввода-вывода.

Однако это удивительно просто сделать с витой .

from twisted.protocols.basic import Int32StringReceiver

class YourProtocol(Int32StringReceiver):
    def connectionMade(self):
        self.sendString('This string will automatically have its length '
            'prepended before it\'s sent over the wire!')

    def stringReceived(self, string):
        print ('Received %r, which came in with a prefixed length, but which '
            'has been stripped off for convenience.' % (string,))
...