Форум сайта python.su
Здравствуйте! Не могу понять почему инструкции метода eol_callback не выполняются. И каким методом читать данные с входящего потока, я использую stream.read_until
class Connection(object): def __init__(self, connection): clients.append(self) self.stream = iostream.IOStream(connection) self.read() def read(self):[s][/s] self.stream.read_until('\r\n', self.eol_callback) def eol_callback(self, data): print data for c in clients:[s][/s] try: c.stream.write(str(len(clients))+'\r\n') except: clients.remove(c) self.read()
Офлайн
Может там “\n” вместо “\r\n”?
Почему не использовать стандартный класс? свой протокол?
вот пример ехо сервера, его можно взять за основу: https://gist.github.com/phuslu/1231481
Офлайн
Спасибо за ответ и за ссылку!
def _on_read_line(self, data): logging.info('read a new line from %s', self.address) for stream in self.stream_set: [b]stream.write(data, self._on_write_complete)[/b] def _on_write_complete(self): logging.info('write a line to %s', self.address) if not self.stream.reading(): [b]self.stream.read_until('\n', self._on_read_line)[/b]
Отредактировано Radist_101 (Сен. 16, 2013 20:55:51)
Офлайн
stream.write(data, self._on_write_complete) - вызвать _on_write_complete когда данные будут отправлены, а там идет чтение, т.е. в итоге получаем последовательную отработку: чтение - отправление - чтение - …
read_until читает до определенного символа
read_bytes читает определенное кол-во байт
Radist_101Вкратце - да, она вызывается при подключении клиента.
И последний вопрос, какой метод запускает на выполнение инструкция IOLoop.instance().start() в этом примере: https://gist.github.com/phuslu/1231481, на мой взгляд вызывается метод handle_stream
Офлайн
ура, получилось наконец прочитать с входного потока данные, поменяв при этом формат данных на клиенте, а именно добавил в конце строки ‘\n’, например “{”id“: 123}\n”, а на сервере self.stream.read_until('\n', self._on_read_line), а нельзя ли обойтись без добаления \n ? А подробнее можно укнать как действуют раделители в read_until. А с помощью метода stream.read_bytes(1024, self.eol_callback) так и не получилось прочитать данные
o7412369815963 спасибо за помощь!
Отредактировано Radist_101 (Сен. 17, 2013 08:08:06)
Офлайн
Radist_101потому что он ждет 1024 байт
А с помощью метода stream.read_bytes(1024, self.eol_callback) так и не получилось прочитать данные
Офлайн