![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
shootnix |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Привет всем.
У меня возникла довольно глупая проблема, не могу понять, где порылась собака. ![]() Задача простая: подключиться к серверу через AnyEvent::Socket, чтобы понадежнее держать соединения + всякие плюшки из коробки, выбрал AnyEvent::Handler. Такой код в итоге получается пока:
На экране наблюдаю такое:
скрипт висит и явно чего-то еще ждет, чего — не могу понять. То ли коннект теряется, то ли еще какая лажа, в общем, плиз, хелп! UPD: Кое-что еще о поведении программы. 1. Сервер получает нужную строку, пытается ее отдать обратно. 2. Скрипт строку в ответ не получает, просто висит и чего-то ждет. 3. Если при зависшем скрипте остановить сервер, ничего не изменится, скрипт продолжит висеть. Я делаю вывод, что происходит какая-то блокировка, мб, сокета? Пробую push_write много раз подряд — все гуд, на чтении — такой глюк. Это сообщение отредактировал(а) shootnix - 21.11.2011, 14:23 |
||||
|
|||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
У AnyEvent::Handle есть опция poll?
Уверены что сервер отдает валидный json? Может начать с простого и попытаться прочитать просто строку? |
|||
|
||||
shootnix |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Валиный/невалидный — не имеет значения, не работает и все тут.
Пробую:
Та же песня… |
|||
|
||||
shootnix |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Вообще, сдается мне, не срабатывает событие чтения. Как запустить?
|
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Вы не сохраняете ссылку на $handle, объект попросту уничтожается.
Замените например shift->destroy на $handle->destroy |
|||
|
||||
shootnix |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Спасибо, конечно, но в документации именно что написано:
Думаю, это не случайно. |
||||
|
|||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Проблема то решена или в верю-неверю поупражняемся? Могу лишь посоветовать перечитать документацию еще раз.
|
|||
|
||||
shootnix |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Проблема не решена. На текущий момент код такой (не весь):
Вот эту строчку «say 'Got line: ' . $line;» я не вижу, замирает на «say 'Try to read';». Обработчики on_error и on_eof отрабатывают корректно, дело явно не в шифтах. |
|||
|
||||
Pfailed |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
server.pl
client.pl
УМВР. ЧЯДНТ? Заметьте, с shift не работает. |
||||
|
|||||
shootnix |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Хм, кстати да, работает отменно, если сервер однопоточный. У меня — мультиплексный, вероятно, тут есть свои тонкости… Пошел искать, спасибо за помощь.
|
|||
|
||||
shootnix |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Почти разобрался =)
Скорее всего, ответ от сервера шлется не туда, т.е., код навроде этого не работает (на стороне сервера):
Кто знает, как писать ответы сервера в случае с AnyEvent? AnyEvent::Handle? Помогите, пожалуйста, у меня пока опыта маловато с этим… |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Код сервера покажите.
|
|||
|
||||
shootnix |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
У меня, на самом деле, несколько имплементаций, но цель моя — сделать на том и на другом конце AnyEvent-решения, используя AnyEvent::Handle — не достигнута. Пытаюсь сделать по образу и подобию того, что есть в интернетах:
Подключаюсь телнетом, все гуд, скриптом — данные не ходят ни туда, ни обратно. К слову, предыдущий сервер на основе IO::Select работал норм, данные принимал, но клиент не мог их поймать. Вот примерный код его:
Это сообщение отредактировал(а) shootnix - 22.11.2011, 09:57 |
||||
|
|||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Вы так и не привели в одном посте код клиента и сервера) Но проблема в том, что читаете вы через push_read в line-mode что клиентом, что сервером. А этот режим отбрасывает разделитель строк, и возвращает вам строчку без него. Потом вы её (не добавляя разделитель!) пишете обратно через push_write сервером ...и клиент её получает, но разделителя то нет - push_read для эхо-ответа вызван не будет. Вообще, через telnet для кода сервера из последнего поста это очень хорошо видно)
|
|||
|
||||
shootnix |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Огромное спасибо за совет, действительно, такой момент я упустил. Исправил, все работает, еще раз спасибо! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |