Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Full duplex HTTP (http://www.flasher.ru/forum/showthread.php?t=120392)

Juriy_84 19.01.2009 18:27

Full duplex HTTP
 
Добрый день.

Сразу прошу прощения, если вопрос простой и очевидный, я не так давно занимаюсь ActionScript.

Как правильно реализовать Full Duplex HTTP подключение средствами ActionScript? Другими словами, нужно добиться, чтобы и клиент и сервер могли передавать сообщения без необходимости каждый раз инициировать подключение.
Я знаю, что такой эффект можно получить, используя Transfer-Encoding=Chunked либо установив 2 постоянных подключения к серваку. И то и другое требует некоторых "танцев с бубном", если кто-то делал подобные решения, подскажите, как лучше решить задачу.

Если интересно, зачем такое счастье надо: некоторые особо злостные прокси режут не-HTTP траффик. Хочу обойти это ограничение, сохранив время реакции как при TCP подключении.

wvxvw 19.01.2009 19:21

Флеш не умеет посылать нужные вам заголовки - так что варианты: вешать сокет на 80-й порт / пользоваться ФМС или аналогами.

7thsky™ 19.01.2009 20:05

Есть реализации Cometа под АС3 - через URLStream

Juriy_84 19.01.2009 21:45

А где на эту реализацию можно посмотреть? Уж очень интересно...

... Кажется, нашел нечто подобное. Нужно было гуглить не по ActionSctipt HTTP Duplex, а по ActionScript Comet. Спасибо!

TimID 19.01.2009 21:49

2J, я только что об этом распрашивал (в теме про постоянный канал подключения). Видимо, нужно писать собственный протокол.

Juriy_84 20.01.2009 00:32

Я бегло прочел эту тему. Там, вроде, решения для моей задачи нет.

В Java-клиенте я делал так: создавал один запрос на сервер и оставлял его подключенным. Сервер заранее не сообщал content-length и посылал сообщения по мере надобности + keep-alive сообщения (чтобы слишком умные прокси не убивали подключение по таймауту). Получается, что сервер шлет "бесконечный" ответ.
Для сообщений от _клиента_ я каждый раз создавал новое подключение, из-за этого счастье от постоянного первого подключения сводилось на нет. Это half-duplex (или simplex, как больше нравится).
Для full duplex по такому принципу нужно по 2 постоянных подключения на каждого пользователя, это довольно дорого. Есть еще альтернативные способы (ломиться на порт 443 с запросом CONNECT) но это тоже танцы с бубном.

Насчет протокола... Поверх HTTP придумать протокол обмена сообщениями не проблема. Если траффик не критичен, я бы использовал JSON (или XML) если критичен, то нужно использовать какую-нибудь бинарную сериализацию. В своем проекте я написал небольшой движок для сериализации, основанный на аннотациях... В принципе, я им полностью доволен.
На крайняк и JSON и XML отлично сжимаются ZIP. Алгоритм сжатия/распаковки не слишком прожорлив, должно сработать.

TimID 20.01.2009 22:12

Это мысль, кстати, послать заголовок http запроса в content-length которого указать заведомо большое число - метр, к примеру. Потом keep-alive и слать по сто байт в секунду. Типа: "У нас медленный коннект" - модем плохой. Сервер - тоже в ту же игру может поиграть.
Это можно на неблокирующих (асинхронных) сокетах провернуть.

Беда в том, что промежуточные сервера могут буферизировать трафик. Равно как и сам flash. Обычно буфер около 8 кб. Как их всех "отучить" от подобной самодеятельности - вопрос.
Можно попробовать слать по 10 кб за раз. Но тогда трафик может быть большим.

BlooDHounD 20.01.2009 22:46

TimID, 90% проксей ваще не держат кип-элив.

TimID 21.01.2009 21:58

Цитата:

Сообщение от BlooDHounD (Сообщение 792407)
TimID, 90% проксей ваще не держат кип-элив.

Значит остается 443 и CONNECT. :(
Или наладить 4-8 сокетов соединяться с сервером в "замедленном режиме" с небольшим перекрытием. Чтобы сеанс длился секунд 10-15 (более длительный waiting определенно режется проксями как зависший).
Скажем:
Два - пытаются соединиться
Третий отправляет заголовок
Четвертый - тело
Пятый - уже завершает
Шестой - "отдыхает" в пуле.
И т.д.

BlooDHounD 22.01.2009 00:58

TimID, удачи! расскажите, что получилось :)


Часовой пояс GMT +4, время: 09:31.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.