Тема: AHK: Обмен данными между скриптами с помощью сервера XAMPP
Понадобилось для одного проекта решить вопрос с обменом данными между 10 компьютерами глобальной сети.
Через соккеты сервер->клиент делать это было заморочно, так как каждый компьютер должен был являться как сервером, так и клиентом, к тому же айпи у них время от времени менются.
Поэтому решил установить на винду веб-сервер - XAMPP.
https://www.apachefriends.org/index.html
При установке можно убрать все галочки - достаточно Apache и PHP.
Изначально он устанавливается без доступа с глобальной сети.
Для разрешения подключения к нему с интернета, нужно заменить в файле httpd-xampp.conf в блоке Alias /phpmyadmin
Require local
на
Require all granted
После чего подсоединяться к нему через своё айпи (возможно понадобится перенаправить порты).
Если же айпи меняется, то можно использовать какой-нибудь динамический DNS сервис, например:
https://www.dynu.com/DynamicDNS/IPUpdat … dowsClient
После установки клиента, он будет следить за всеми изменениями через заданный промежуток времени.
В директории xampp\htdocs создаем новую папку, например, test.
И туда пишем простейшую серверную часть index.php, типа:
<?php
$databaseFile = 'database.txt';
$data = file_get_contents($databaseFile);
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case ($method == 'GET'):
header('Content-Type: text/html; charset=utf-8');
echo $data;
break;
case ($method == 'POST'):
header('Content-Type: text/html; charset=utf-8');
$requestBody = file_get_contents('php://input');
$data .= $requestBody;
file_put_contents($databaseFile, $data);
echo "post";
break;
default:
http_response_code(404);
echo "404 error";
break;
}
Создаем там же файл database.txt.
При методе GET сервер возвращает текст из database.txt.
При методе POST сервер добавляет данные из запроса в database.txt.
При необходимости можно использовать json - в php с этим без проблем.
Интересный момент, что при посылании POST запроса на сервер с ссылкой типа: "htpp://123.45.67.89:8081/test", где 8081 - это порт, который я перенаправил в роутере, то сервер получает не POST, а GET.
Проблема решается добавлением слеша в конец ссылки: "htpp://123.45.67.89:8081/test/".
Меня устраивало получение данных от сервера через polling, но при необходимости можно прикрутить и websockets api.
Пример GET запроса:
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "htpp://123.45.67.89:8081/test/", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText
Пример POST запроса:
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "htpp://123.45.67.89:8081/test/", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP..SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.Send("some data")
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText