Xpoint
   [напомнить пароль]

Можно ли организовать TCP/IP-сервер во Flash-ролике?

Метки: [без меток]
2006-03-17 13:46:07 [обр] Даниэль Алиевский(0/125)[досье]

Я прошу прощения, что задаю вопрос раньше, чем проверил, "а что нам показывает эксперимент". К сожалению, во Flash я даже не чайник - ноль. И - на данный момент - единственным стимулом начать осваивать Flash может послужить возможность реализовать этот самый сервер. Так что буду очень признателен, если опытные Flash-программисты подскажут, допустим: "нет, ты что, это невозможно, не стоит и пытаться" или "а может и сработает".

Уточняю. Мне нужно, чтобы в Web-страницу был встроен некий компонент, исполняемый на клиентском компьютере, внутри которого "крутится" некий сервер, реализованный, допустим, на уровне сокетов. Сервер должен слушать какой-либо порт и реагировать на запросы из Internet. Вернее, даже не на всякие запросы, а на запросы, идущие с конкретного компьютера - сервера webwarper.net. Т.е. я должен иметь возможность, располагая IP-адресом клиентского компьютера (предположим, что таковой имеется), послать из некоего скрипта, расположенного на webwarper.net (в моем случае Perl-скрипта), TCP/IP-запрос и услышать ответ. Предполагая, разумеется, что FireWall этому не помешал. (Стандартный FireWall из XP SP 2, насколько я знаю, просто спросит у пользователя, хочет он этого или нет.)

Независимая от броузера утилита обеспечивает это с легкостью. Например, создаем серверный сокет, делаем bind на желаемый порт и вызываем в цикле accept.

В Java-апплете я ситуацию проверил (Java-то я знаю хорошо). Все средства организовать TCP/IP-сервер имеются: класс ServerSocket и возможность организовать бесконечный цикл accept. Более того, при локальном обращении (с того же самого компьютера) к этому серверу, работающему внутри апплета, удается обратиться и получить ответ. Но "песочница" (система безопасности Java) блокирует любые обращения к TCP/IP-серверу извне, в частности, с компьютера webwarper.net. Т.е. доходить-то до апплета они доходят, но вот отреагировать на них - вернуть данные в том же сокете - "песочница" не позволяет. Именно, возникает SecurityException.

Теоретически, отреагировать все-таки можно. Можно перехватить исключение SecurityException и затем отослать компьютеру webwarper.net (уже отдельным сокетом или даже http-протоколом) информацию общего характера: мол, "ко мне, похоже, только что постучались". Можно даже идентифицировать себя с помощью уникальной куки. Это уже неплохо. Но Java-машина, увы, есть далеко не у всех, очень объемна (6-12 MB - в отличие от Flash), а MS JVM 1.1.4, часто имеющаяся в MSIE, вовсе не разрешает создавать ServerSocket.

Мой вопрос: какова ситуация с Flash? Каковы правила этой песочницы? Может кто-нибудь сходу ответить? Так, я слышал, что последние версии позволяют обращаться через сокеты во внешний мир (если номер порта выше 1024). А наоборот можно? Создать TCP/IP-сервер внутри Flash-ролика и начать реагировать на запросы из внешнего мира? Точнее, тут даже два вопроса: 1) можно ли в принципе организовать сервер, пусть даже попытки обращения извне будут порождать исключение; 2) можно ли все-таки отвечать на полученные данные, возвращая ответ через тот же серверный сокет?

Буду очень благодарен ответам.

спустя 1 час 12 минут [обр] Алексей В. Иванов(276/2861)[досье]
  1. Кажется, нет;
  2. Что имеется в виду? Послать запрос на сервер? -Да.
спустя 46 минут [обр] Даниэль Алиевский(0/125)[досье]
2 - имеет в виду наоборот: во flash-ролике крутится сервер, выполняет метод accept(), получает сокет, читает его и пишет в него обратно. (Или любая эквивалентная техника.) Java-апплет это позволяет, но только если обратный адрес локальный (не из Internet).
спустя 1 час 28 минут [обр] Алексей В. Иванов(276/2861)[досье]
Тогда не пойму, чем вопрос #2 отличается от #1?
спустя 2 дня [обр] Даниэль Алиевский(0/125)[досье]

Еще раз уточняю. В Java 1.1.4 (от Microsoft) в принципе нельзя организовать в апплете TCP/IP-сервер. Уже попытка создать серверный сокет порождает исключение. Однако, в Java 1.3-1.5 можно создать серверный сокет и запустить бесконечный цикл вызовов accept(). Более того, эти вызовы при локальном обращении (с того же компьютера) к TCP/IP-серверу, "крутящемуся" в апплете, нормально отрабатывают - после accept() можно из полученного клиентского сокета успешно прочитать данные. Однако, если обращение происходит с другого компьтютера, то вызов accept() порождает исключение. При этом, в информации об исключении присутствует IP-адрес компьютера, который попытался обратиться к TCP/IP-серверу.

Вопрос: что в случае Flash? Если ответ на вопрос 1) отрицателен - TCP/IP-сервер создать нельзя, скажем, потому что возникает исключение при попытке создания серверного сокета (или сразу при вызове метода, аналогичного accept()) - то все плохо, Flash мне помочь не может. Если ответ положителен, то важен вопрос 2) - можно ли нормально общаться с таким сервером? Читать данные из полученного клиентского сокета? Если да, то это замечательно, так как Java позволяет лишь единственную форму "общения" - генерацию исключения. Если нет, то важно, будет ли метод accept() (или что его заменяет в Flash?) порождать исключение и какая информация будет доступна при перехвате этого исключения. Если доступен хотя бы IP обратившегося компьютера (и это документировано) - то это уже неплохо.

спустя 14 минут [обр] Алексей В. Иванов(276/2861)[досье]
Мой ответ — нет.
спустя 45 минут [обр] Даниэль Алиевский(0/125)[досье]
Т.е. нет даже на первый вопрос? TCP/IP-сервер в ролике создать невозможно? В отличие от Java 1.3+?
Powered by POEM™ Engine Copyright © 2002-2005