Технічні питання «Залізо і софт
Як зробити свій сервер для ігор безкоштовно
А якщо 13-річна особистість, сидячи за мамкін ноутбуком, думає як зробити свій сервер для ігор безкоштовно. Що якщо пукає бомбить, а грошей немає?
Чим би дитя не тішилося, аби б безкоштовно! Тому будемо гасити палаючі Пердак за допомогою Ngrok.
Ngrok - засіб проброса портів через NAT (або інші страшні слова), з яким впорається навіть бомблять 13-річний пукає.
Стіна з діркою це завуальоване займання пукає, що за відкриття портів можна не платити бабло провайдеру.
Користуватися досить просто. якщо ганяти термінальні команди для вас просто.
А якщо складно, тоді ось інструкція.
1.) Скачиваем ZIP-архів і розпаковуємо.
2.) Тепер треба відкрити термінал і написати шлях до файлу (якщо лінь писати - перетягнути файл у вікно терміналу).
Ще треба дописати команду запуску (я даю приклад для веб-сервера) дописати після шляху до файлу треба:
Якщо запустити з ключем -subdomain
Виділити все Код: -subdomain k0ttee http 80
Отримаємо свій піддомен, більш зручно-читається: k0ttee.ngrok.com
Тільки для цієї функції потрібно зареєструватись і отримати унікальний токен.
Куди проводиться? На локалку! На 127.0.0.1 в вашому комп'ютері.
Ваш пукає вже горить запив сервер і випендрюватися перед іншими посанамі на районі, але залишилося питання: "А в чому відстій?"
Все просто - додаткова прошарок збільшує пінг і з'єднання може не витягати вимогливі іграшки. Для веб-сервера під говносайти пінг гідний.
А шо головне - безкоштовно. 111
Тепер, якщо сервер гри вже готовий, навіть 13-річна особистість зможе заявити: "Го до мене, моя попа в вогні. Я створив!"
_________________
HyperHost.UA - надійний і недорогий хостинг!
Коротше можливостей цілий вагон, але 99.9% пуканье спалахують саме від ігор. ось в цю сторону і довелося зробити ухил. Фан в інструменті і угарі від написання шапки.
_________________
HyperHost.UA - надійний і недорогий хостинг!
Який саме веб-сервер поставити на свій домашній комп'ютер? - з тієї ж серії, простий, легкий, зрозумілий навіть дебілові.
І щоб він легко дружив з прогой-сервером гри.
Я б поставив NGINX і з'єднав з серверної частиною гри сокетом.
_________________
HyperHost.UA - надійний і недорогий хостинг!
Якщо гра представляє собою сайт, на який заходять з браузерів - годиться будь-denwer на localhost.
_________________
HyperHost.UA - надійний і недорогий хостинг!
21. P.S. (Для Адвансед, вже): якщо при КОДІНГ потрібно установка доп.бібліотек які є у node, робиться це "кошерним" заходом в папку гри (консоллю cmd, пп.10-11), і виконанням там наступної команди: npm install <имя_этой_библиотки> --save
(Без кутових дужок, і з обов'язковою припискою --save, ну і не забути написавши команду натиснути Enter))
P.P.S. Сам рив все це, дня 3
P.P.P.S. Для більш серйозних розробок, звичайно ж світова індустрія юзает всі ці апачі, Денвер, пхп, сі ++, і т.п.
proj \ sr.js (програма сервер гри):
Звичайний веб-сервер (статика) на порту 8080 (видає веб-сторінку клієнтському браузеру)
Виділити все Код: var http = require ( 'http');
var static = require ( 'node-static');
// Create a node-static server instance to serve the './public' folder
// Створюємо веб-сервер (який бере дані клієнтської веб-сторінки з папки "public" і видає цю веб-сторінку клієнтському браузеру)
var file = new static.Server ( './ public',
http.createServer (function (request, response)
request.addListener ( 'end', function ()
file.serve (request, response); // Serve files! - обслуговуємо запити клієнтського браузера ( "request") даючи на них відповідь ( "response")
>). Resume (); // додали лістенер клієнтських запитів - функцію
>). Listen (8080); // веб-сервер "слухає" (лістеніт) на порту 8080
Сервер чистих веб-сокетів на порту 8081 (чисті вебсокети - це штатні вебсокети, без використання бібліотек socket.io)
Виділити все Код: var WebSocketServer = new require ( 'ws');var webSocketServer = new WebSocketServer.Server (); // вебсокет-сервер "слухає" (лістеніт) на порту 8081
var clients = <>; // масив - підключені до вебсокет-сервера клієнти
webSocketServer.on ( 'connection', function (ws) // задаємо функцію обробну подія підключення вебсокет-клієнта
var id = Math.random (); // Рандома згенерували "idшнік нового клієнта"
clients # 91; id # 93; = Ws; // "поклали" дані вебсокет-підключення нового клієнта, в масив клієнтів за індексом id
console.log ( "У нас нове вебсокет-з'єднання:" + ws + "; клієнту призначений id:" + id); // відписалися в серверній консолі
clients # 91; id # 93; .send ( "Вебсокет-сервер повідомляє вам ваш id клієнта:" + id); // відсилаємо нашому новому клієнтові, повідомлення
// обробник події надходження повідомлення від клієнта - задаємо функцію, обробну ця подія
ws.on ( 'message', function (message)
for (var key in clients) // перебираємо наш масив клієнтів
if (clients # 91; key # 93; == ws) // якщо це - наш поточний клієнт
console.log ( 'Від клієнта (' + key + ') отримано повідомлення:' + message); // відписалися в серверній консолі
clients # 91; key # 93; .send ( 'Вебсокет-сервер відповідає на ваше повідомлення, клієнт (' + key + '): від вас отримано повідомлення такого змісту:' + message); // висилаємо повідомлення-відповідь цьому клієнту
>
>
>);
// обробник події коли клієнт відключився - задаємо функцію, обробну ця подія
ws.on ( 'close', function ()
console.log ( 'Закрито з'єднання клієнта (' + id + ')'); // відписалися в серверній консолі
delete clients # 91; id # 93 ;; // видаляємо відключеного клієнта, з масиву клієнтів
>);
>); // кінець функції обробної подія підключення вебсокет-клієнта
Подальший серверний код
Виділити все Код: console.log ( "Сервер запущений на портах 8080 (static через node), 8081 (pure web-sockets)");
proj \ public \ index.html (клієнтська веб-сторінка, яку статики веб-сервер видає клієнтському браузеру):
Виділити все Код:
- створюємо кинувся (а якщо браузер його не підтримує, в браузер пишеться наше повідомлення про це)
- програма клієнт гри, в цій клієнтської веб-сторінці, що змальовує на канвасе
- виклик функції програми клієнт гри
proj \ public \ cl.js (програма клієнт гри, в клієнтської веб-сторінці, що змальовує на канвасе):
Веб-сокети (чисті, без використання бібліотек socket.io)
Виділити все Код: if (! Window.WebSocket) // якщо наш клієнтський браузер не підтримує чисті вебсокети
document.body.innerHTML = 'WebSocket в цьому браузері не підтримується.';
>
// створити вебсокет-підключення
var socket = new WebSocket ( "# 91; color = # FF0000 # 93; ws: //0c4807fc.ngrok.io#91; / color # 93;");
// обробник вхідних повідомлень (від вебсокет-сервера)
socket.onmessage = function (event)
var incomingMessage = event.data;
alert (incomingMessage);
>;
Виділити все Код: window.addEventListener ( 'resize', redrawCanv, false);
window.addEventListener ( 'orientationchange', redrawCanv, false);
Виділити все Код: // перемалювати кинувся
function redrawCanv ()
cnv = document.querySelector ( 'canvas');
cnv.setAttribute ( 'width', okrc (window.innerWidth * 0.98));
cnv.setAttribute ( 'height', okrc (window.innerHeight * 0.98));
ctx = cnv.getContext ( '2d');
fontSize = okrc (cnv.width / 100);
ctx.font = '' + fontSize + 'px calibri';
fontHeight = okrc (fontSize * 0.8);
//. далі, тут код малювання клієнтської картинки гри на канвасе
mo =; // координати курсора миші
cnv.addEventListener ( "mousemove", onMouseMove, false); // створюємо лістенер переміщень миші
cnv.addEventListener ( "click", onClick, false); // створюємо лістенер кліків (лкм або скм) миші
>
Виділити все Код: // округлення в меншу сторону до цілого
function okrc (n)
mr = Math.round (n);
if (mr
>
// лістенер переміщень миші
function onMouseMove (e)
mo.x = e.clientX - cnv.offsetLeft;
mo.y = e.clientY - cnv.offsetTop;
if (mo.x> = gr.plr.hand.x mo.x <= gr.plr.hand.xe && mo.y>= gr.plr.hand.y mo.y <= gr.plr.hand.ye)
var cur = plr.hand.cur;
if (! (mo.x> = plr.hand.cards # 91; cur # 93; .x mo.x <= plr.hand.cards[cur].xe && mo.y>= Plr.hand.cards # 91; cur # 93; .y mo.y <= plr.hand.cards[cur].ye))
var ikol = plr.hand.cards.length - 1;
for (var i = 0; i <= ikol; i++)
if (mo.x> = plr.hand.cards # 91; i # 93; .x mo.x <= plr.hand.cards[i].xe && mo.y>= Plr.hand.cards # 91; i # 93; .y mo.y <= plr.hand.cards[i].ye)
plr.hand.cur = i;
drawCard (plr.hand.cards # 91; i # 93;);
break;
>
>
>
>
>;
// лістенер кліків (лкм або скм) миші
function onClick (e)
outgoingMessage = "клік мишею: # 91; x: "+ mo.x +" | y: "+ mo.y +" # 93; ";
socket.send (outgoingMessage);
8. У коді sr.js, ми використовували роботу з http. Тому, встановимо для Ноди цю бібліотеку, яку ми використовуємо в коді:
9. Відкривається командна консоль (cmd).
10. У ній йде (за допомогою команд cd) всередину татка proj
11. Після того як прийшли в ту течку. набираємо команду:
npm install http --save
(Тиснемо Enter)
- в папці proj, повинна з'явитися підпапка "node_modules"
12. Запуск в небо:
13. Програму ngrok, покладемо в ту ж папочку proj (в її корінь) - гордо здатися нашому новоспеченому серваке гри (і веб-сервера-статікв ньому, і вебсокет-сервера в ньому) на просторах інету, допоможе ця програма.
14. Відкривається командна консоль (cmd).
15. У ній йде (за допомогою команд cd) всередину татка proj
16. Після того як прийшли в ту течку. набираємо команду:
ngrok http 8080
(І тиснемо Enter)
- ура, порт 8080 (статики веб-сервер) проброшен в інтернет!
17. Відкривається ЩЕ ОДНА командна консоль (cmd).
18. У ній йде (за допомогою команд cd) всередину татка proj
19. Після того як прийшли в ту течку. набираємо команду:
ngrok http 8081
(І тиснемо Enter)
- ура, порт 8081 (вебсокет-сервер) проброшен в інтернет!
22. Відкривається ЩЕ ОДНА (вже, третя) командна консоль (cmd).
23. У ній йде (за допомогою команд cd) всередину татка proj
24. Після того як прийшли в ту течку. набираємо команду:
node sr.js
(І тиснемо Enter)
- ура, наш сервер гри запущений (він же, і веб-сервер статики за сумісництвом - він же, і сервер веб-сокетів за сумісництвом)
(А нгрокі які вище, прокинув його порти - порт веб-сервер статики, 8080 - а також порт веб-сокетів, 8081 - в інтернет)
35. P.S. (Для Адвансед, вже): якщо при КОДІНГ потрібно установка доп.бібліотек які є у node, робиться це "кошерним" заходом в папку гри (консоллю cmd, пп.10-11), і виконанням там наступної команди: npm install <имя_этой_библиотки> --save
(Без кутових дужок, і з обов'язковою припискою --save, ну і не забути написавши команду натиснути Enter))
36. P.P.S. Обмежитися замість двох портів (8080 і 8081 в прикладі) всього лише одним портом (повісивши на нього І веб-сервер статики, І вебсокет-сервер) - НЕ МОЖНА!