Найти - Пользователи
Полная версия: Не получается прочитать данные с потока iosream в Tornado
Начало » Network » Не получается прочитать данные с потока iosream в Tornado
1
Radist_101
Здравствуйте! Не могу понять почему инструкции метода 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()
o7412369815963
Может там “\n” вместо “\r\n”?
Почему не использовать стандартный класс? свой протокол?
вот пример ехо сервера, его можно взять за основу: https://gist.github.com/phuslu/1231481
Radist_101
Спасибо за ответ и за ссылку!

    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]

Зачем функции self.stream.read_until('\n', self._on_read_line) и stream.write(data, self._on_write_complete) вызывают друг друга. И в чем разница между read_until и read_bytes?

И последний вопрос, какой метод запускает на выполнение инструкция IOLoop.instance().start() в этом примере: https://gist.github.com/phuslu/1231481, на мой взгляд вызывается метод handle_stream или я сильно ошибаюсь?. Вопросы от новичка в Tornado
o7412369815963
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
Вкратце - да, она вызывается при подключении клиента.
Radist_101
ура, получилось наконец прочитать с входного потока данные, поменяв при этом формат данных на клиенте, а именно добавил в конце строки ‘\n’, например “{”id“: 123}\n”, а на сервере self.stream.read_until('\n', self._on_read_line), а нельзя ли обойтись без добаления \n ? А подробнее можно укнать как действуют раделители в read_until. А с помощью метода stream.read_bytes(1024, self.eol_callback) так и не получилось прочитать данные
o7412369815963 спасибо за помощь!

o7412369815963
Radist_101
А с помощью метода stream.read_bytes(1024, self.eol_callback) так и не получилось прочитать данные
потому что он ждет 1024 байт
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB