Клиент-серверное приложение на Faucet Networking. ч.1
Faucet Networking - сетевое расширение, предназначенное для создания многопользовательских приложений. Достоинства Faucetnet:
*Fn предоставляет поддержку протоколов IPv4 и IPv6 *Детальная документация всех функций *Работа в отдельном потоке *Отсутствие багов в сравнении с 39dll *Либеральная лицензия *Также есть версии для мобильных устройств *Поддержка прямого и обратного порядка байт *Простой в изучении и использовании *Также поддерживает udp *Работает в несколько раз быстрее 39dll
Недостатки:
*Отсутствие русского сообщества *Не так известен как 39dll
От себя добавлю, что Faucetnet действительно прост. Например, первое впечатление я получил от работы функции проверки на подключенность клиента к серверу. И она действительно работает, в отличии от известного всем 39dll. Поэтому всем тем кто делает мультиплеерные игры это расширение стоит изучить
Итак, перейдем к изучению более детально на примере основы приложения построенное по простой схеме клиента - сервера.
Алгоритм работы клиента: 1.Клиент подключается к серверу 2.Посылает сообщение в зависимости от его действий 3.Получает результат
Алгоритм работы сервера: 1.Сервер слушает порт на подключения 2.Если подключается новый клиент, то заносим его в лист или массив 3.Проверяем действия подключенного клиента 4.Отвечаем клиенту по его действию
И так, реализация по порядку описанному выше. 1.Создадим проект с названием ClientFaucetnet (или как хотите) 2.Добавляем расширение Faucet Networking в проект 3.Создаем объект control 4.Добавляем событии Create 5.Пишем код:
Код
port = 8888; ip = "127.0.0.1"; server = tcp_connect(ip, port)
if (socket_has_error(server) ) { show_message("Error: "+string(socket_error(server))); exit; }
6.Тут будем пилить регистрацию
Переходим к серверу. 1.Создадим проект Server 2.Также добавляем расширение 3.Создаем объект control 4.Как уже догадались в событии Create:
Код
port = 8888; listen = tcp_listen(port); if (socket_has_error(listen)) { show_message("Error: "+string(socket_error(server))); exit; }
list_client = ds_list_create();
5. В Step'e:
Код
var new_client; new_client = socket_accept(listen); if (new_client) { ds_list_add(list_client, new_client); }
var c_client; for(f = 0; f != ds_list_size(list_client); f += 1) { c_client = ds_list_find_value(list_client, f) if (tcp_eof(c_client)) { ds_list_delete(list_client, f); if (ds_list_empty(list_client)) break; } }
Все можете скопировать, всавить и запсутить. Все работает. Теперь объясняю код:
В клиенте, в событии создания, мы использовали функцию tcp_connect чтобы подключиться к серверу, используя порт сервера и его айпи адрес. Если происходит какая то ошибка, мы ее выводим и выодим из скрипта, используя функции socket_has_error для проверки ошибка и socket_error для возврата текста ошибки. Заметим, что если произошла ошибка мы подключиться заново к серверу не можем т.к. мы вышли из скрипта создания. Функция tcp_connect возвращает индентификатор сокета к которому мы пытаемся подключиться. Его мы используем для принятия и отправки сообщений серверу.
В сервере, мы слушаем порт на проверку подключений функцией tcp_listen. Также если произошла ошибка мы ее показываем и выходим из скрипта. Чтобы заново попытаться прослушать порт придется перезапустить приложение. И создаем структуру данных, в данном случае список, для хранения подключенных клиентов. Он нам пригодится. Я мог бы использовать и массивы, но списки будут удобнее и немножко быстрее. Step, как всем известно или я вам открою правду, обновляется со скоростью рума. В нем мы проверяем со скоростью рума на подключения клиентов. Точнее скажу так: если клиент "стучится" к нам, то используя функцию socket_accept мы принимаем его и добавляем в список подключенных клиентов. Здесь вы заметите разницу между socket_accept и tcp_listen. Вторая ичпользуется чисто для прослушки порта, если есть подключение она передает сообщение функции socket_accept что есть новое подключение. Итак, с этим мы разобрались. В цикле, мы проходимся по всем пк(покдлюченным клиентам) и проверяем отключился ли текущий клиент. Если да, то удаляем его из списка. И конечно, проверяем если список пустой то выходим из цикла. Т.к. если вы не выйдете то программа может сильно зависнуть. В событии рисования мы просто отрисовываем кол-во подключенных клиентов. Все, ничего сложного здесь нет. Все очень легко и просто. Теперь вы знаете что то за зверь такой, этот Faucet Networking. В следующей статье я напишу, как прикрутить сюда регистрацию клиента, а также вход и перемещение игрока, а также отправку координат, ну и отображение ника во время игры другим игрокам
Ссылка на расширение, примеры, справку и перевод: Faucetnet Оффициальный источник: YoYo
Категория: Разное | Добавил: krap (12 Ноября 2013)
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Клиент-серверное приложение на Faucet Networking. ч.1», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.