Есть ли способ установить TCP_NODELAY в Socket.flush (), NetConnection.call () или sendToURL ()? - PullRequest
2 голосов
/ 25 июня 2009

Я пишу приложение в реальном времени с использованием клиента 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.

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 июня 2009

В качестве альтернативы вы могли бы взглянуть на что-то вроде Hemlock: http://hemlock -kills.com /

0 голосов
/ 14 апреля 2012

Привет, в сокетах включен алгоритм Nagle. Это удерживает «первую» запись в течение 200 мс, чтобы ее можно было объединить с любыми последующими записями в этом временном окне, что означает, что через сеть выходит меньше пакетов. Для большинства современных приложений и сетевых инженеров это совершенно глупо и неуместно, так как они захотят установить TCP_NODELAY и точно контролировать, когда будет выполнена передача, и вполне способны собирать свои байты в буфер перед записью их в сокет. Причиной этого может быть то, что кто-то в Adobe однажды хотел ограничить эту опцию, чтобы подтолкнуть людей к протоколу RTMP и их коммерческой / дорогой системе LCDS (я думаю , вы можете установить клиент без задержки с сервера сторона соединения RTMP). Ах, Adobe, будь реальным и, пожалуйста, добавь TCP_NODELAY как можно скорее, поскольку ты только вредишь экосистеме Flash и не увеличиваешь прибыль !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...