У меня проблемы с подключением (через классы 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 () вы что-нибудь делали для сброса сокета?