Haxe/Neko: пример соединения клиент-сервер (чат)

В последнее время я искал примеры реализации соединений "клиент-сервер" для Haxe, но не мог найти ничего стоящего. Через некоторое время все таки удалось узнать что эти вещи реализуются посредством класса sys.net.Socket, и что непосредственно с ним никто не работал. Позже так же было выяснено, что в определенной степени этот класс должен отражать реализацию POSIX сокетов. Конечно это хорошо, но просто чтением man тут обойтись не удалось, так как в отличии от упомянутых, Haxe реализация использует исключения вместо возвращаемых значений. А исключения, в свою очередь, никто документировать не стал.

После некоторого количества экспериментов (так же известно как "метод тыка"), мною был найден полу-простой способ работы с "блокирующими" сокетами.

Поскольку блокирующие сокеты останавливают работу выполняющего потока до возврата значений (кто бы мог подумать), логичным действием является просто добавление нового потока, которому собственно и будут поручены эти "развлечения" с ожиданием ответа сокета. В то время как создание неопределенного количества потоков не является хорошей затеей на большинстве Windows и *nix систем (если вам не нужно быстро избавиться от оперативной памяти, конечно - ведь для каждого потока выделяется отдельный стек размером 1-4МБ), создание потоков в Neko происходит удивительно гладко (видимо, благодаря динамическому выделению памяти) - каждый новый поток добавляет лишь по несколько килобайт памяти, зависимо от того, чем он занимается и сколько локальных переменных создает.
Для клиентской части все довольно просто - нужно лишь два потока, один из которых работает с пользователем (интерфейс), и другой, что будет заниматься обработкой сетевой активности.
С сервером, с другой стороны, все немного сложнее. Тут, помимо (крайне базового) интерфейса, один поток должен быть занят приемом заявок (иначе сервер не будет знать, что к нему вообще кто-то пытается подключится), и по одному дополнительному потоку на каждого подключенного клиента (см. часть про блокирующие заявки).
Как раз когда я почти закончил реализацию сервера на "чистом" sys.net.Socket, неожиданно выяснилось что для Neko есть еще разные классы работы сетью, в том числе и neko.net.ThreadServer, который занимается аналогичными вещами, но использует лишь Neko классы, и имеет немного более развитую обработку исключений. К нему даже кто-то обучение написал. Было это, правда, еще в 2009 году, и никто там так и не сказал, что клиент нужно реализовывать тоже на потоках.

Данный пример является реализацией простого чата с такими функциями как вход, выход (в том числе и тайм-аут), и отсылка сообщений. Так же реализованы простые команды вроде /list (список пользователей), /name (смена имени), /msg (приватное сообщение).
В традициях хорошей серверной части, на stdout сервера отправляется довольно полный журнал активности пользователей.
Так же добавлен довольно причудливый (написанный мной) класс под названием RawEdit, который добавляет поддержку ввода текста (с отображением вводимых данных) на stdin+stdout, второй из которых может в это же время использоваться другими потоками. В общем, текст пишется, сообщения появляются, текст вниз сдвигается.
В общем, это должно быть довольно полезно для тех, кто когда-либо задумывался над созданием многопользовательских приложений на Haxe.
Скачать

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.