Бинарные сокеты в AS3. Часть 1
Часть 2. Часть 3.
Любой начинающий флешер, конечно же, просто обязан желать написать сразу же самую крутую онлайн (или мультиплеерную) игру со всеми примочками в короткие сроки. Если человек целеустремленный, он будет тратить часы, а то и целые дни, изучая всякие протоколы и прочее, в конечном итоге поймет, что игра с игроками больше одного — это не только клиент на флеше, но и наличие соответствующего сервера с записью (ну или без нее) в базу данных.
Именно через них в игрушках-приложениях идет обмен всеми данными. Итак, давайте разберемся, что это такое и как это готовить и под каким соусом подавать.
Штука очень привлекательная и не стоит ее бояться. Если глянуть на википедии, то там не так уж много вменяемой понятной непосвященному информации. Посему осмелюсь сказать своими словами: сокет — это просто непрерывный канал, по которому передаются то в одном, то в другом направлении (от сервера к клиенту и наоборот), а то и одновременно в двух (полнодуплексный сокет) сплошные сырые байты. Передаются они по определенному протоколу: UDP или TCP. Первый хорош тем, что сообщения летят сразу раздельными такими пакетами. Но он совершенно не гарантирует, что пакет дойдет до адресата. Кроме того, в UDP нужно следить за последовательностью отправки сообщений, так как они могут вообще перемешаться, контрольные суммы для проверки целостности нужны… Честно, я не вдавался в подробности. В отличие от TCP, где гарантия есть, а битость отдельных частей восстанавливается. Однако в TCP пакеты могут приходить частями (если не влезают в значение MTU), быть склеенными (несколько мелких сообщений в одном или одна большая часть сообщения (1 пакет) и концовка + маленькое сообщение (2 пакет)).
Так вот. Самое простое, что можно придумать: это считывать данные, пока не встретится какой-то определенный символ. Таким символом, как правило, выступает нулевой байт «\0». Естественно, этот нулевой байт нужно вшивать в пакет в конце каждого сообщения. Нулевой байт в шестнадцатеричном представлении — 0x00. Убогость этого способа в том, что можно передавать только строки в UTF-8 и все. Нельзя вшивать (именно вшивать, не помещать в строку) в сообщение, например, дробные числа типа float, так как они содержат в себе несколько нулевых байтов (если я не прав, обязательно сообщите мне, я тут же исправлюсь) Но, не исключаю, это самый наипростейший вариант: читаем, пока не встретился нулевой байт. Встретили, записали в буфер полученные данные, пустили на парсинг байты снова. И так каждый раз.
Когда я только-то задался вопросом обмена данными между клиентом и сервером через сокеты, ребята-флешеры отговорили меня (вру, не отговаривали, они мне сразу начали объяснять другое), рассказали про другие «методы». Впоследствии уже, с опытом, я понял, что они были правы и этот способ не только удобнее, но и симпатичнее (хотя реализация его достаточно трудна с непривычки). Я им всем достаточно компостировал мозги, пока не познал, хех, дао и не научился вменяемо ловить от сервера и отправлять туда же свои сообщения.
Кроме обычного бинарного сокета в AS3 есть XMLSocket. Он примечателен тем, что все сообщения представляют собой обычные UTF-8 строки с кучей XML мусора вокруг и нулевым байтом в конце. Он, по идее, проще. Так как не нужно задумываться о всяких байтиках, пакетиках и прочей приблуде. Но все сообщения возрастают в размерах за счет XML-оберток и, как следствие, возрастает трафик. Неудобно, по моему скромному мнению. К делу!
Так как тут есть какие-то ограничения по количеству символов в статье, я разобью ее на несколько частей.
Часть 2. Часть 3.
Всего комментариев 22
Комментарии
14.07.2012 01:50 | |
сиськи где?
|
14.07.2012 02:02 | |
Они в теме про MVC у Тигры =)
Тут просто всякая фигня про сокеты и очень полезные комментарии )) |
14.07.2012 21:12 | |
Корд.... символ НОЛЬ в float и собссно НУЛЕВОЙ байт - это разве не разные вещи?
Кодировка символа ноль как бы несколько иная, вообще-то. |
14.07.2012 21:20 | |
Про float не в курсе. De же говорил про нулевые байты в вещественных числах.
Про символ "0" в UTF-8 ничего не говорю (а хотел написать). У нуля код 0x30 =) |
15.07.2012 11:55 | |
Хм. Странно. Кстати, чем бинарник лучше ХМЛ-сокета?
|
30.07.2012 06:25 | |
Ок, хорошо, убедили, никакой разницы между символьным и бинарным протоколом нет. Особенно если использовать протоколы типа AMf или Protobuf
|
30.07.2012 22:36 | |
порой координально [x]
Кстати, AMF3 вполне себе хорошая, годная штука. Только в длине алиаса и названий полей не переусердствуйте. Он не позиционный. |
01.08.2012 13:56 | |
Кстати, каксательно BSON, он тоже слегка избыточен. Мне лично больше всего нравится msgPack
|
Последние записи от КорДум
- Basic authentication и GET/POST запросы (20.03.2013)
- SOAP и Flash (19.12.2012)
- Бинарные сокеты в AS3. Часть 3 (13.07.2012)
- Бинарные сокеты в AS3. Часть 2 (13.07.2012)
- Бинарные сокеты в AS3. Часть 1 (13.07.2012)