Сокеты ActionScript 3.0 не могут подключиться - PullRequest
5 голосов
/ 12 августа 2008

У меня проблемы с подключением (через классы Socket и XMLSocket) к прослушивателю TCP после истечения времени ожидания подключения.

У меня есть флэш-апплет, который должен поддерживать TCP-соединение с сервером. Я реализовал тайм-ауты, используя таймеры, систему пинг-понга и т. Д. Однако есть проблема. При вызове Socket.connect () флэш-плеер (9.0.115 и многие другие стабильные версии до этого) отправляет 3 запроса на соединение посредством пакетов SYN с некоторым промежутком времени. Если никто из них не отвечает (например, потому что сервер не работает), я не могу заставить апплет [попытаться] подключиться к серверу. Когда-либо. То есть в течение жизни апплета.

Для уточнения и / или обобщения:

Для любой пары хост / порт, переданной Socket.connect () или XMLSocket.connect (), в случае сбоя вызова любые последующие вызовы connect () для любых других экземпляров Socket (или XMLSocket) в течение времени жизни апплет Flash к той же паре хост / порт игнорируется. (По крайней мере, насколько я могу судить, используя анализатор пакетов.)

Я пытался вызывать многочисленные методы Socket, уничтожать и воссоздавать объекты, используя пул Sockets, а также различные другие методы, которые я сейчас не могу вспомнить; все безрезультатно.

Мое текущее решение - уведомить родительскую веб-страницу через вызов JavaScript и позволить ей перезагрузить мой апплет. Это не очень хорошее решение, и я не собираюсь реализовывать обходные пути для проблем, которые это вызывает, просто потому, что Flash не может правильно обрабатывать соединения с сокетами.

Должно быть, мне не хватает чего-то очень простого.

Есть идеи?

1: я знаю, что вы не можете уничтожать объекты; Я просто удаляю все ссылки на них и надеюсь на лучшее. Я не пытался явно вызывать GC в этом случае. (Хотя я думаю, что пытался поместить Socket в массив и использовать delete .)


Да, это работает, как и ожидалось, если соединение установлено успешно (даже если соединение будет разорвано позже.)

Единственное событие, которое вызывает это, - это случай, когда сервер вообще не отвечает; это как если бы Flash помечал комбинацию хост / порт как «офлайн» и не беспокоился о том, чтобы посылать ему больше пакетов в течение всего времени жизни апплета.

Я подозреваю, что активный отказ от соединения (например, хост находится в сети, но не прослушивает порт) не вызывает этого.

Я не получаю сообщение об ошибке или какой-либо другой ответ от Socket.

Вы когда-нибудь вызывали connect () более одного раза к одной и той же паре хост / порт, когда первый не удался? Как вы узнали, что первое соединение () не удалось? А до последующих вызовов connect () вы что-нибудь делали для сброса сокета?

1 Ответ

3 голосов
/ 15 октября 2008

Это может быть связано с нерешенной ошибкой FP-269 , которая в свою очередь может иметь ту же основную причину, что и FP-67 .

Эта сборка должна быть исправлена ​​в текущий публичный бета-релиз найден на labs.adobe.com

Эдвин Вонг - [23.09.08 16:49]

Я бы порекомендовал вам сделать последнюю публичную бета-версию 1016 * ...

...