Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Не получается прочитать данные с потока iosream в Tornado [RSS Feed]

#1 Сен. 16, 2013 15:38:19

Radist_101
Зарегистрирован: 2013-07-15
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не получается прочитать данные с потока iosream в Tornado

Здравствуйте! Не могу понять почему инструкции метода 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()

Офлайн

#2 Сен. 16, 2013 20:03:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Не получается прочитать данные с потока iosream в Tornado

Может там “\n” вместо “\r\n”?
Почему не использовать стандартный класс? свой протокол?
вот пример ехо сервера, его можно взять за основу: https://gist.github.com/phuslu/1231481

Офлайн

#3 Сен. 16, 2013 20:52:32

Radist_101
Зарегистрирован: 2013-07-15
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не получается прочитать данные с потока iosream в Tornado

Спасибо за ответ и за ссылку!

    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

Отредактировано Radist_101 (Сен. 16, 2013 20:55:51)

Офлайн

#4 Сен. 17, 2013 00:24:03

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Не получается прочитать данные с потока iosream в Tornado

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
Вкратце - да, она вызывается при подключении клиента.

Офлайн

#5 Сен. 17, 2013 08:06:55

Radist_101
Зарегистрирован: 2013-07-15
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не получается прочитать данные с потока iosream в Tornado

ура, получилось наконец прочитать с входного потока данные, поменяв при этом формат данных на клиенте, а именно добавил в конце строки ‘\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)

Офлайн

#6 Сен. 17, 2013 09:19:42

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Не получается прочитать данные с потока iosream в Tornado

Radist_101
А с помощью метода stream.read_bytes(1024, self.eol_callback) так и не получилось прочитать данные
потому что он ждет 1024 байт

Офлайн

  • Начало
  • » Network
  • » Не получается прочитать данные с потока iosream в Tornado[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version