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

Unity3D WEBGL WebSocket

#0
16:52, 10 апр 2022

Добрый день!
Игра использует winsocket, в сборке (PC, ANDROID, IOS) обменивается данными с сервером php (socket). Сборка под WEBGL, соединение и обмен c сервером php (socket) не работает. WEBGL версия игры

Ознакомился c решением, https://github.com/jirihybek/unity-websocket-webgl
В этом решение не описано как должен быть настроен сервер, чтобы общаться с клиентом по протоколу ws: или wss: . К примеру, если использую на клиенте Unity3D конструкцию

string link_server = "ws://"+sip+":"+sport;  //пример  ws://32.92.45.32:8012 
WebSocket ws = WebSocketFactory.CreateInstance(link_server);
// Add OnOpen event listener
        ws.OnOpen += () =>
        {
            Debug.Log("WS connected!");
            Debug.Log("WS state: " + ws.GetState().ToString());
        };

        // Add OnMessage event listener
        ws.OnMessage += (byte[] msg) =>
        {
            Debug.Log("WS received message: " + Encoding.UTF8.GetString(msg));
        };

        // Add OnError event listener
        ws.OnError += (string errMsg) =>
        {
            Debug.Log("WS error: " + errMsg);
        };

        // Add OnClose event listener
        ws.OnClose += (WebSocketCloseCode code) =>
        {
            Debug.Log("WS closed with code: " + code.ToString());
        };

        // Connect to the server
        ws.Connect();

Условно сервер по адресу ws://32.92.45.32:8012 - молчит нечего не отвечает. Порт 8012 и сокет на сервере открыт в ожидание общения. Рукопожатие по протоколу ws:// не происходит. Открытый порт динамический, каждая комната с игроками открывает новый порт.

Возможно на сервере как-то по особенному нужно настроить (apache, nignx или что-то еще скачать?). На сервере открыт сокет и порт, что было достаточно для (PC, ANDROID, IOS) для WEBGL уже недостаточно.

Хотел реализовать, чтобы пользователи играя в WEBGL версию, смогли входить в сетевую игру созданную игроками на PC, ANDROID, IOS. 

Как можно сделать, чтобы клиент версии игры WEBGL подключался к открытому порту сокету на сервере ?

Заранее спасибо за ответ.

#1
17:49, 11 апр 2022

bhero
> Игра использует winsocket
> Сборка под WEBGL
А вебсокеты в юньке вообще работают в вебгл сборках?
Раньше нужно было через мост и нативный js общаться по вебсокету. Это было совсем давно во времена плагина браузера:)

bhero
> Ознакомился c решением, https://github.com/jirihybek/unity-websocket-webgl
там репа 4 года не обновлялась, не стоит туда вообще смотреть.

#2
7:08, 12 апр 2022

bhero
Добро пожаловать в веб товарищь!

Вероятнее всего ты наступил на ограничения связанные с CORS https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
У тебя то что описанов  первом пункте ниже, CORS непричем просто твой пример не рабочий в современных браузерах, читай ниже. (ну а CORS станет вторым босом если пройдешь начало, имей в виду)

1. с начала 2021 года вебсокеты неработают больше без HTTPS. (и раз ты упомянул php то вероятнее всего ты используешь какойто "древний" пример для вебсокетов, если твой шаблон/пример сделан раньше 2020 года - он не будет работать с браузером из PHP, вебсокеты сильно ограничивали в браузерах последние годы(в старых примерах пропускают половину "обязательных" данных для отправки и современных браузеры требуют все чтоб было как надо))
(даже у тебя в коде идет ws:/ .... ws не работает в браузерах больше, только wss а конфигурация wss требует множества дополнительных шагов как на клиенте так и на сервере)
2. если ты хоть 1 пиксель из WebGL (экрана текстуры всего что связанно с GPU) хочешь передать/загрузить на/с сервера - CORS тебя отрубит https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
3. ВебСокеты "ненавидят все" даже сами создатели вебсокетов и разработчики браузеров, используй WebRTC. Причин слишком много чтоб об этом говорить. (читай ниже решения)

По факту - ты даже протестировать налокалхосте больше веб приложения не можешь, тебе нужен отдельный сервер с валидным HTTPS настроенным CORS и запущенным там сервером.
И все не так просто - у тебя Веб и ты не можешь встраивать сертификаты в проект, тебе нужно брать сертификат от браузера и им кодировать свой вебсокет соеденение... чего с вероятностью 99.999999999% в Юнити не осилили(без понятия лень гуглить, даже если осилили там адище какоето сделали и никто никогда не тестил это) (они забили на ВебГЛ года 3-4 назад полностью)
И это еще только начало - как сказал выше про ВебСокеты можешь забыть и не вспоминать (в вебсокетах все плохо не только миллион костылей и подпорок нужных, они еще тормозные и теряют трафик постоянно). И как приступишь к интеграции WebRTC то просто будешь плакать от того что там нужно написать чтоб все заработало, а темболее в Юнити где опятьже "не осилили WebRTC" надо будет прикручивать чтото левое кривое которое будет конфликтовать с открученной в браузерах многопоточностью для WASM... кароче ты будешь первым человеком на этой планете который сможет осилить WebRTC в Юнити.

Но есть очень простое решение - точнее два простых решения:

1. Зачем тебе вебсокеты когда ты все можешь перевести в pus/get запросы или даже просто по ссылкам?
Как в 1998 <твой сайт>/скрипт.пхп?<параметр>=<значение> (и загружать параметры с сервера в ответе страницы очевидно)
И такие запросы ты можешь слать прямо из веб билда Юнити (через выполнение джавакрипт кода, но редактировать никаких внешних скриптов и страниц не нужно). (если че так сделано в 99% веб билдов игр Юнити(секретная практика предков с Флеш игр))
Да тут тоже CORS но хотяб головной боли с HTTPS нет, и кошмаром конфигурации и поддержания соеденения...

2. Зачем это делать в веб билде Юнити?
Пиши все в джаваскрипте в html странице, всю WebRTC логику в джаваскрипт который будет запускаться со страницы с Юнити проектом и просто передавать в Юнити (через проброс данных в WASM окружение, гугули есть примеры и для Юнити). (так работают оставшейся 1% проектов на Юнити в Вебе, вся сетевая часть снаружи в джаваскрипте и WebRTC)
Это избавит от кучи головной боли - ее реально нереальное количество, боли по реализации WebRTC в WASM окружении, а у тебя еще и юнити с кривущим многопотоком в вебе... один проброс данных из джаваскрипта в WASM уже фиксит все проблемы которые могли возникнуть из за кривого многопотока и синхронизации внутри WASM(оно постоянно падает темболее в сложной синхронизации с WebRTC если интегрировать в WASM).
Но для тестов по прежнему нужен рабочий внешний с валидным HTTPS сервер.

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

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

#3
7:09, 12 апр 2022

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

#4
11:34, 12 апр 2022

1. Зачем тебе вебсокеты когда ты все можешь перевести в pus/get запросы или даже просто по ссылкам?
Как в 1998 <твой сайт>/скрипт.пхп?<параметр>=<значение> (и загружать параметры с сервера в ответе страницы очевидно)

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

Настроил это решение: https://habr.com/ru/post/209864/  Пингуется на сервере в редакторе Unity, в браузере до сервера нечего не доходит.  Следуя логике, это решение уже устарело.

#5
11:39, 12 апр 2022

melvy
> Но для тестов по прежнему нужен рабочий внешний с валидным HTTPS сервер.
с letsencrypt  это сейчас вообще не проблема.

melvy
> ну а CORS станет вторым босом если пройдешь начало
Есть же чит код для прохождения второго босса

Access-Control-Allow-Origin: *

bhero
> в браузере до сервера нечего не доходит.
нажми F12 на странице где у тебя билд игры(появится окошко), там найди вкладку network\сеть
после обнови страницу, там будут видны все коннекты найди тот кто пытается открыть\апгрейднуть до вебсокетов твоих и посмотри что там за ошибка(можно кликнуть по соединению чтобы увидеть детали)

так же ошибка может быть еще на вкладке "консоль"

#6
11:50, 12 апр 2022

>с letsencrypt это сейчас вообще не проблема.

Есть, проблема, как сертификат крепить к IP VPS, к домену он легко крепится. Забыть про обращение по IP к сокету на сервере, изменить на домен?

В .htaccess 
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

есть подозрение, что это конструкция не работает, если идет обращение по ws протоколу.

#7
12:44, 12 апр 2022

bhero
> Есть, проблема, как сертификат крепить к IP VPS
ну если 200-300р в год проблема...то да...

bhero
> есть подозрение, что это конструкция не работает, если идет обращение по ws
> протоколу.
по конфигу апача не подскажу, я nginx юзаю.

посмотри у тебя вообще страничка с игрой пытается соединиться с сервером?

#8
18:31, 12 апр 2022

bhero
> Настроил это решение: https://habr.com/ru/post/209864/
22 января 2014
не будет работать

ищи на гитхабе 2018(минимум)-2020(лучше) примеры для ВебСокетов, может чтото и найдешь
можешь пробовать поискать WebRTC но даже если найдешь примеры рабочие... лучше делай сразу в джаваскрипте

Mephistopheles
> с letsencrypt это сейчас вообще не проблема.
ты видимо не понял - суть не в получении HTTPS сертификата
суть в том что
в WASM нет интернета (нет ипшников нет портов ничего нет)
Юнити это WASM сборка под Веб... и там нетинтернета
Вебсокеты и WebRTC проброшены отдельным WASM-АПИ костылем... и тут самое интересное - тебе нужно "достать" откудадо сертефикать чтоб засунуть в твою либу которая использует ВебСокеты/WebRTC... и то как это делается в WASM это полнейший ад. (будешь дольго и больно долбиться с SSL либами пытаясь это все заставить работать в WASM(в итоге забъешь и перенесешь весь код клиента на джаваскрипт))
В добавок к этому еще синхронизация данных все связанное с Webсокетами/RTC браузер выкидывает в одтельный поток, и тот поток если начнет писать/читать чтото из основного потока "игры" то все рухнет(когда все в WASM), и синзронизация этого кошмара когда ты не знаешь когда данные придут/уйдут когда удалять освобождать память - это та еще головная боль. (и джаваскрипт решает это потому что посылка данных из джаваскрипта в WASM синхнонизируется автоматически и там не может быть крашей данные всегда дойдут когда готовы)
(говорил об этом в своем посте)

Mephistopheles
> Есть же чит код для прохождения второго босса
все сложно и не так однозначно, будут подводные камни в этом случае

bhero
> есть подозрение, что это конструкция не работает, если идет обращение по ws
> протоколу.
да только wss можно
1. найди рабочий джаваскрипт пример на вебсокетах который будет работать и писать "хело ворд" из твоего ПХП сервера (не рабочим может быть не только клиент но и сервер)
2. ковыряй Юнити пытаясь настроить... но опятьже имея рабочий Джаваскрипт код клиента - проще из джаваскрипта пробросить данные в Юнити.

П.С. Может я очень категорично высказываюсь о вебсокетах, их по прежнему можно использовать если хочешь, но настройка WebRTC не сложнее wss сокетов, и лучше сразу все на WebRTC перевести. Вебсокеты работают со скоростью push/get запросов 200-500мсек задержка это "норма" в вебсокетах.
(WebRTC это только с ssl сертификатом, как говорил уже с WebRTC нужен внешний валидный https сервер(с настроенным там webrtc очевидно))

#9
20:44, 12 апр 2022

melvy
>да только wss можно
>1. найди рабочий джаваскрипт пример на вебсокетах который будет работать и писать "хело ворд" из >твоего ПХП сервера (не рабочим может быть не только клиент но и сервер)
>2. ковыряй Юнити пытаясь настроить... но опятьже имея рабочий Джаваскрипт код клиента - проще >из джаваскрипта пробросить данные в Юнити.

Как-то сложновато. В итоге получается, игроки php сокета, будут жить в разных мирах с js сокета.

Возможно, кто уже реализовал это решение все проще простого.

#10
12:25, 13 апр 2022

melvy
> ты видимо не понял - суть не в получении HTTPS сертификата
> суть в том что
> в WASM нет интернета (нет ипшников нет портов ничего нет)
там должен быть бридж до js иначе эта вся фигня вообще работать не будет.

Ну да в инете пишут что в юнити есть интерфейс для общения с js, он конечно стремноват но должен работать) А если можно подружить юньку и js то там хоть вебсокеты, хоть WebRTS подключить можно.

Мне даже стало любопытно, есть у меня игрушка на вебсокетах, если будет время сделаю к ней клиент на юньке. Там в протоколе десяток комманд, занять не должно много времени:)

#11
13:22, 13 апр 2022

> Mephistopheles
> Есть, проблема, как сертификат крепить к IP VPS
>ну если 200-300р в год проблема...то да...

Есть бесплатный сертификат LETS Crypt, через fastpanel в два клика коннектится к домену domen.ru на 3 месяца. К IP серверу получить сертификат и как его подключить, сейчас мне неизвестно. По IP обращение заметно быстрее, чем по имени домену на несколько десятков ms. 

Решено, общение с сервером и сокетом по домену с подключенным SSL, ведь суть его, направить на открытый сокет на сервере.

JS прослойка между Unity3D уже есть, эта как-бы она и есть.  https://github.com/jirihybek/unity-websocket-webgl

Проблема в PHP сокете, чтобы он видел подключение по WSS. Следует учитывать SSL сертификат, будет он не ладный, а это куча непонятно, как протестировать прослоек и настроек в PHP сокете, рукопожатие следует делать уже не так просто как сейчас. Так же не забыть, что к этому сокету, могут подключаться игроки без SSL сертификата по IP, это пользователи PC, ANDROID, IOS. 

Если знать как реализовать рукопожатие  сервер сокет PHP с SSL и клиент WEBGL.  Возможно, это не так сложно как кажется, этот урок уже реализован тут https://www.php.net/manual/ru/function.stream-socket-server.php

#12
13:30, 13 апр 2022

bhero
> Так же не забыть, что к этому сокету, могут подключаться игроки без SSL
> сертификата по IP, это пользователи PC, ANDROID, IOS. 
поднимай два сокета, по другому разделить шифрование и без нельзя.

bhero
> Проблема в PHP сокете, чтобы он видел подключение по WSS. Следует учитывать SSL
> сертификат
ВебСокеты работают "через" http протокол, там идет коннект по http(s), а потом проходит upgrade до ws(s) так что с настройкой проблем не должно быть тк это стандартная веб фигня

bhero
> Есть бесплатный сертификат LETS Crypt
Так я говорил про домен, сертификат ставится на домен, на ИП его не поставить по http протоколу.

#13
14:00, 13 апр 2022

Судя по всему, тут https://www.php.net/manual/ru/function.stream-socket-server.php уже есть рабочий пример работы сокета и ssl сертификата, wss коннект.

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

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