Я пишу приложение в реальном времени с использованием клиента Flex / Flash и моего собственного сервера, работающего в Linux.
Я бы хотел иметь возможность отправлять данные из клиента Flex в режиме реального времени (в ответ на действия пользователя). Я пробовал следующие методы:
- flash.net.NetConnection.call ()
- flash.net.sendToURL ()
- flash.net.Socket.write (), за которым следует flash.net.Socket.flush ()
В каждом случае эти вызовы всегда ждут, пока сервер отправит ACK, прежде чем они смогут снова отправлять данные. Другими словами, если вы делаете:
var nc:NetConnection;
// Setup code left out
nc.call("foo", someData);
// Some more code left out
nc.call("foo", moreData);
Второй nc.call () выше не будет отправлять данные на сервер до тех пор, пока не будет получен ACK для первого вызова. Я хотел бы иметь возможность отправлять данные немедленно, не дожидаясь этого подтверждения.
Если время приема-передачи на сервер велико (например, 300 мс), я могу отправлять данные на сервер только 3 раза в секунду. В идеале я хотел бы иметь возможность отправлять данные до 30 раз в секунду, но это возможно только при RTT около 30 мс в данный момент.
Неважно, если сам сервер получит данные с задержкой в 300 мс - я понимаю, что не могу справиться со скоростью света.
Есть ли способ заставить Flash Player отправлять данные, не ожидая подтверждения? В других средах это делается путем установки флага TCP_NODELAY на сокете, но, похоже, у меня нет такого уровня контроля во Flash / Flex.
Обновление : Я думаю, что я наткнулся на обходной путь для этого. Я думаю, что Flash Player пытается заставить хост-браузер назначить ему отдельное TCP-соединение для каждого объекта NetConnection с учетом ограничения на количество соединений для каждого браузера, например, 2 для IE. Предел соединения можно обойти с помощью поддоменов (еще не пробовал), так что, надеюсь, можно будет приблизиться к поведению в реальном времени, используя пул NetConnections.
Спасибо.