Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Websockets - передача данных в реальном времени между клиентом и сервером (Реализация в SA:MP)

oxygenium

Изучающий
Professional
Пользователь
Регистрация
5 Ноя 2013
Сообщения
957
Лучшие ответы
18
Репутация
445
Награды
3
Автор:

Не так давно наткнулся на эту разработку и честно говоря был в шоке. Чувак реализовал клиент и сервер вебсокетов в сампе, причем еще 2 года назад. Что это значит для разработчиков? У Вас открываются практически безграничные возможности, т.к. передача данных происходит в реальном времени. При этом сервер сампа может быть как сервером, так и клиентом. Как пример - моментальное пополнение доната. Сайт отправляет данные на websocket сервер, а самп сервер его слушает. Вызывается коллбэк onMessage, и тут уже манипулируем данными как хотим. Хоть и сам код предельно понятен, документации на Github нет, поэтому распишу немного тут.

Клиент:

Чтобы создать клиента, используем функцию CreateWSClient

C++:
new ws_client:id = CreateWSClient("onConnect", "onFail", "onDisconnect", "onMessage");
Функция вернет ID клиента. Клиентов может быть неограниченное количество. Далее нам необходимо подключиться к websocket серверу, который мы будем слушать.

C++:
WSClientConnect(id, "ws://echo.websocket.org/");
Чтобы отправить сообщение используем функцию WSClientSend

C++:
WSClientSend(ws, "hello");
Далее про вспомогательные коллбэки

C++:
public onConnect(ws_client:ws)
Вызывается при успешном подключении.

C++:
public onFail(ws_client:ws)
Вызывается, если подключение установить не удалось

C++:
public onDisconnect(ws_client:ws)
Вызывается если сервер, либо клиент отключился

Ну и самое главное

C++:
public onMessage(ws_client:ws, message[])
Вызывается при новом сообщении. На этом с клиентом все.
Теперь перейдем к серверу. Чтобы создать сервер, используем функцию WSCreateServer, а затем укажем адрес сервера.

C++:
new ws_server:mainWS = CreateWSServer("onWSClientConnect", "onWSClientDisconnect", "onWSClientMessage");
WSServerStartListen(mainWS, "127.0.0.1", "7777");
Чтобы сервер был доступен извне, у вас должны быть открыты порты 443 и 80, помимо стандартных портов сампа. На локалке работает без открытия портов.

C++:
public onWSClientConnect(ws_server:ws, ws_connection:con)
Вызывается при входящем подключении от клиента. Тут мы можем узнать IP клиента, помимо ID

C++:
new ip[16];
WSServerGetIP(ws, con, ip, sizeof(ip));
Код:
public onWSClientDisconnect(ws_server:ws, ws_connection:con)
Вызывается при дисконнекте клиента

C++:
public onWSClientMessage(ws_server:ws, ws_connection:con, message[])
Самая главная часть, вызывается при новом сообщении.

C++:
WSServerSend(ws, con, message);
Отправляет сообщение от имени сервера

C++:
WSServerStopListen(ws);
Отключает сервер

C++:
WSServerKick(ws, con, 1000, "Bye ;)");
Кикает клиента

Впринципе на этом все. Более подробно Вы можете изучить непосредственно в исходниках.
Так же кто будет запускать на винде, в server.cfg прописан плагин для линукса, удалите .so
Так же обновите все инклуды в папке pawno, не знаю почему, но они там старые

Скачать:
Исходники (не исходный код плагина, просто сервер):
 
Сверху Снизу