Цитата:
|
У вас есть список подключенных клиентов. Как у вас сервер понимает, что от клиента N пришли данные?
|
(сразу опустим отправку файла политик)
1) Флеш клиент стучится на сервер
2) На сервере ClientManager принимает подключение и создает объект Client.
3) В класс клиента при этом передается объект ServerSocket, который и производит все общение с флеш клиентом.
Все. Клиент создан, и помещен в карту ClientMap<String, Client> // строчный ключ равен ID клиента, он всегда уникален. Его знает и флеш клиент и сервер.
Внутри класса Client есть метод, который занимается мониторингом всех входящих сообщений и парсингом протобафа (его использовал как протокол общения).
Клиент получает сообщение, обрабатывает его, и шлет событие

Код AS3:
ClientEvent event = new ClientEvent(ClientEvent.MESSAGE, this);
event.setMessage(message);
dispatchEvent(event);
У события есть методы preventDefault() и stopPropogation() / stopImmediatePropagation()
Работают так же как во флеше. Если при получении события где-нибудь, например в комнате, в которой находится клиент дернуть метод preventDefault(), то флеш клиентам, подключенным к комнате, это сообщение не разошлется. Если нет, то, соответственно, оно будет отправлено всем клиентам в комнате (с указание ID клиента, который отправил сообщение). У сообщения есть так же свойство scope. По умолчанию это пустая строка. Если в это свойство добавить, например id конкретной комнаты, то сообщение будет распространено только среди клиентов этой комнаты. Если нет, то оно будет разослано во все комнаты, к которым подключен клиент.
Список клиентов так же есть локальный для каждой комнаты. При добавлении клиента в комнату, ему автоматически добавляются слушатели событий DISCONNECTED, LEAVE и еще некоторых. Поэтому при прохождении какого-то из событий, локальный список клиентов автоматически корректируется