ПрограммированиеФорумОбщее

Связать сервер и клиент мобильной игры

#0
13:57, 12 апр 2022

Здравствуйте Господа, скажу сразу что уровень знаний по теме не дотягивает до любительского,  посему прошу быть чуть более поверхностными в Ваших ответах, дабы всем все было понятно.
К сути дела.. У меня есть клиент и серверные файлы (весь сервер находится на
виртуалке и ее дисках, но вытащить его и запустить на домашней системе у меня пока не получилось)  игры под андроид, все хорошо работает  если запускать сервер на виртуалке и играть через эмулятор.
Но проблема при попытках как либо запустить игру на телефоне(даже в домашней сети через одну WiFi имея статический ip) данные с сервера не подгружаются.
Или тут будет принципиально важно иметь выделенный сервер со моим  IP?
Что открыть и где поковырять приложение чтобы законтактить сервер на виртуалке и клиент в телефоне (в одной сети с сервером или не имея общей сети)
Или надо вскрывать файлы  сервера с виртуалки и копаться там?
Заранее спасибо всем желающим помочь!

#1
19:39, 14 апр 2022

Если знаешь IP игрока, это не значит, что через шлюз WIFI роутера, сможешь наладить связь без посредников. В 90% случаев РОУТЕР, не разрешит наладить прямой обмен. Поэтому, этот вариант можно исключить, так как мало кто сможет поиграть в мультиплеер. Следует иметь внешний сервер с открытым IP и доступом в Интернет. Сервер, станет прокси, для обмена данными и синхронизацией между игроками.

Сперва программируешь лобби как распределитель созданных игр и серверов с открытым сокетом. На будущее, если вдруг открытых игр будет много, подкупишь VDS. Через Лобби новые игроки узнают о доступных играх, каждая игра, это IP и PORT сервера или имя домена. Для Лобби, можно использовать POST, GET. Сервер лобби не сложная задача, у меня на PHP, 200 строк, Лобби отправляет и хранит списки открытых игр и игроков в комнате (порт).  Через POST или GET узнаешь о доступных играх и IP серверах.

Затем юзаешь для С## using System.Net.Sockets; пару функции и коннектишься к сокету клиента узнав через ЛОББИ IP и PORT игры.  Затем 3 функции - Получить данные, Отправит данные, закрыть соединение.

//Создать соединение
private Socket _Socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
_Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, myOpts);
_Socket.Connect( IP ,PORT_SOCKET);


//Получаем данные в буфер если они есть
  _Socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,newAsyncCallback(ReceiveCallback),null); 


//Отправить данные
 sendAsync.SetBuffer(data,0,data.Length);
        _Socket.SendAsync(sendAsync);

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


Важно иметь виртуальный сервер, достойная цена тут: https://timeweb.com/ - 150р в месяц, за 1 ядро, 1ГБ память, SDD 10ГБ, этого достаточно, если открыть пару сокетов, для игры в реальном времени, нормально. Тестировал 8 игроков из интернета, одновременно синхронизация пинг 0.3, открытый сокет не нагружает сервер.

Сперва прочитал много готовых решений для Unity3D и ознакомился с другой информации c умными названиями, платными ассетами и услугами. Чужие варианты и готовые решения для юнити показались сложнее, чем взять и сделать все самому с 0, используя только винсокеты и php сокеты для сервера. На все это потратил 2 недели. Ссылка Игра,где реализовал Лобби, Cервер, Клиент с 0. В итоге код клиента C## (500 строк), код сервера PHP (300 строк).  Реализация работает, на Android, IOS, PC,  linux, проблема в сборке WEBGL, клиент не коннектится к серверу. Протокол wss, это не винсокеты, С## using System.Net.Sockets; не работает.  Как оказалось, для протокола wss WEBGL и сервер нужен особенный.

ПрограммированиеФорумОбщее

Тема в архиве.