Сети

Пущино, 2012 г.

Уважаемые коллеги!(просто решил добавить немного официальности)

Прошу сразу меня извинить и не пинать ногами за мой русский.

Перед нами была поставлена задача - сделать сетевую игру. Что вообще такое сетевая игра? Если читатель это знает, то прошу не ставить facepalm, потому что это краткий ввод в наш проект. Итак, сетевая игра - это своеобразный диалог программы-клиента и программы-сервера. Т.е. пользователь на своем ПК запускает клиент, который передает все данные на сервер, тот в свою очередь всем остальным пользователям. Обработка данных(в нашем случае это физика игры и рисование картинки) может происходить как на сервере, так и на клиенте (зависит от договоренности).

Осуществляется отправка данных с помощью сетевого протокола tcp(протокола надежной передачи данных с гарантированной доставкой). Т.е. когда клиент посылает пакет данных на сервер, тот в случае, если получил пакет, пишет об этом клиенту. В противном случае клиент посылает пакет еще раз и т.д. У нас подключение шло по локальной сети, которую каждый может создать на компьютере с wi-fi. В принципе, это можно делать и через Интернет. Также, мы использовали такую вещь, как socket. Socket - связка IP-адреса и port (виртуальный провод, к которому можно присоединиться).

В процессе делания чата (его мы писали ради тренировки), выяснилось, что линейная программа нам не подходит (потому, что клиент не может одновременно отправлять и принимать сообщения от сервера). Поэтому было решено использовать треды. Тред - это модуль для многопоточного программирования, позволяющий писать программы, выполняющиеся одновременно.

Теперь немного о работе сервера. Сначала мы запускаем его и ждем подключения клиентов. Для каждого из них заводим отдельный тред, чтобы всем пользователям сообщения могли приходить одновременно. В каждом из тредов мы прописываем отправку и прием данных.

В процессе работы с чатом появилась одна важная проблема, а именно - как различать между собой сообщения, чтобы они не сливались в одну кучу. Мы условились после каждого сообщения вставлять 16-ый символ из таблицы ASCII, потому что вероятность встретить этот символ в сообщении обычного клиента крайне мала. Серверу можно посылать различный команды, например, смена логина или выход пользователя из чата. Их как-то надо отличать от обычного сообщения. Для смены логина мы решили использовать знак вопроса в начале сообщения.

Теперь речь пойдет о проекте. Его цель - написать сетевую игру. Я писал программу для игры в аэрохоккей. Для рисования, физики и прослушивания сокетов я использовал отдельные треды(для поля, каждого из игроков, "наблюдатель"(он передает данные о поле клиентам)). Отрисовка картинки и передача данных о ракетке пользователя шла на каждом из клиентов. Чтобы различать координаты ракеток и мяча, я перед ними(координатами) ставил b, r1 и r2.

На последнем этапе проекта возникли непредвиденные трудности в виде тормознутости картинки на разных клиентах. Это происходило потому, что координаты мяча передавались сервером раз в 0.1 секунды. Получалось, что мяч скакал из одной точки в другую. Уменьшить передаваемый интервал было нельзя, чтобы не засорять траффик. Поэтому я решил(читай - меня заставили) перенести расчет физики движения мяча и собственной ракетки на клиента. Сервер только проводит синхронизацию данных и отправку данных о ракетке противника.

Мою программу нужно запускать с бубном, т.к. я писал на Python2.7. Т.к. питон является некомпилируемым языком, то для ее запуска нужно установить среду разработки с соответвующей версией и дополнительный модуль Pygame. Адрес сервера и порт прописывается внутри программы индивидуально. Т.к. программа несколько сыровата, то сервер придется вырубать вручную.

Приятной игры!

Даня


Исходники