Пример


Консольное приложение

Скомпилируйте данный пример через AutoIt3 Wrapper и запустите.

Сервер будет открыт на всех IP адресах компьютера на порте 8081. Для завершения работы сервера, нажмите клавишу F1.

 

#Notrayicon
#Region
#AutoIt3Wrapper_OutFile=Console.exe
#AutoIt3Wrapper_UseX64=N
#AutoIt3Wrapper_Compile_both=N
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Change2CUI=Y
#AutoIt3Wrapper_Res_Comment=HTTP SC Console Server (пример)
#AutoIt3Wrapper_Res_Description=HTTP SC Console Server (пример)
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=N
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Res_LegalCopyright=Astel064
#AutoIt3Wrapper_res_requestedExecutionLevel=None
#AutoIt3Wrapper_res_Compatibility=Vista,Windows7
#AutoIt3Wrapper_Res_SaveSource=Y
#EndRegion



#include "Http SC.inc"
#include "Http SC Error.inc"
#include "GelAllIp.au3"


; Объявляем пемеременные
Local $aServer;             Здесь будут храниться данные сервера
Local $aBanList;            Здесь будет храниться информация о блокировке клиентов
Local $vIP;                 Здесь будет размещен массив с IP адесами компьютера
Local $iPort = 8081;        Порт сервера

Local $sLogFile = @ScriptDir&"\Http SC.log";        Лог файл сервера
Local $sContentFolder = @ScriptDir;                 Домашняя папка сервера
Local $sLogin = "User";                                     Логин при авторизации
Local $sPassword = "123";                               Пароль при авторизации
Local $aServerIp, $i, $fWhile, $hTimer, $aAuthenticateData


; Выводим информацию
ConsoleWrite("HTTP SC v1.0 (11/10/2017 17:48)"&@CRLF)
ConsoleWrite("Port: "&$iPort&@CRLF)
ConsoleWrite("Press F1 to Exit..."&@CRLF&@CRLF&@CRLF)
Sleep(2500)


; Получаем список IP адесов компьютер в виде массива
$vIP = _GelAllIp(1)
    If @Error Then $vIP = "127.0.0.1"; Если не получилось получить список IP адесов, то сервер будет принемать подключения только по адресу: 127.0.0.1


; Создаем сервер
ConsoleWrite("Create server..."&@CRLF)
$aServer = _HttpSC_CreateServer($aBanList, $vIP, $iPort, "HTTP SC v1.0", 0, $sLogFile)
    If @Error Then
    MsgBox(0+16, "Http SC", "Не удалось создать сервер!"&@CRLF&_HttpSCError_ConvertError2Text(@Error, @Extended, 1))
    Exit 1
    EndIF


; Настраиваем сервер
ConsoleWrite("Config server..."&@CRLF)
_HttpSC_ConfigServer($aServer, 30, 30, 90)


; Запускаем сервер
ConsoleWrite("Start server..."&@CRLF)
_HttpSC_StartServer($aServer, $aBanList)
    If @Error Then
    MsgBox(0+16, "Http SC", "Не удалось запустить сервер!"&@CRLF&_HttpSCError_ConvertError2Text(@Error, @Extended, 1))
    _HttpSC_DeleteServer($aServer, $aBanList)
    Exit 2
    EndIF


; Вывод информации о открытых сокетах
$aServerIp = _HttpSC_ServerGet_ServerSockets($aServer)
    If NOT @Error Then
    ConsoleWrite("Open sockets:"&@CRLF)
        For $i = 1 To $aServerIp[0][0]
        ConsoleWrite("     "&$aServerIp[$i][1]&" (IP: "&$aServerIp[$i][0]&")"&@CRLF)
        Next
    ConsoleWrite(@CRLF)
    EndIF


; Уведомляет о нажатии на клавишу F1 для выхода и настраивает выход
ConsoleWrite("Press F1 to Exit..."&@CRLF&@CRLF)
$fWhile = 1
HotKeySet("{F1}", "_Exit")
    Func _Exit()
    HotKeySet("{F1}")
    $fWhile = 0
    ConsoleWrite("Wait exit..."&@CRLF)
    EndFunc


; Добавляет IP адрес 127.0.0.1 в белый список (пользователь не будет блокироваться)
_HttpSC_WhileList_Add($aServer, "127.0.0.1")


; Обработчик сервера
$hTimer = TimerInit();  Задает таймер для проверки IP адресов сервера и оптимизации данных сервера
While $fWhile
    _HttpSC_ServerHandler($aServer, $aBanList, "_GetFunc", "_PostFunc", "_OtherFunc", "_UserBanFunc")

    If TimerDiff($hTimer) >= 60000 Then; Проверка каждую минуту
    ConsoleWrite("Optimization: "&_HttpSC_ServerOptimization($aServer, 0)&@CRLF)
    ConsoleWrite("CheckIp: "&_HttpSC_ServerCheckIp($aServer, _GelAllIp(1))&@CRLF)
    $hTimer = TimerInit()
    EndIF
Sleep(10)
Wend


; Останавливаем сервер
ConsoleWrite("Stop server..."&@CRLF)
_HttpSC_StopServer($aServer, $aBanList)


; Удаляем сервер
ConsoleWrite("Delete server..."&@CRLF)
_HttpSC_DeleteServer($aServer, $aBanList)


; Выход через 5 сек
ConsoleWrite("Exit (wait 5 sec)..."&@CRLF)
Sleep(5000)
Exit 0




; Функция, вызываемая в ответ на GET запрос
Func _GetFunc($sUrl, $hUserSocket, $sUserIp, $sHttpVer, $sReqest)
Local $sHost, $sUserAgent
    ; Преобразуем URL (Декодируем и переворачиваем URL слэши ""/" в Windows-подобные "\")
    $sUrl = __HttpSC_Encoding_URIDecode($sUrl)
    $sUrl = StringReplace($sUrl, "/", "\")
   
    ; Получаем хост и используемый клиентом агент (браузер)
    $sHost = _HttpSC_ReqestParse($sReqest, "Host")
    $sUserAgent = _HttpSC_ReqestParse($sReqest, "User-Agent")
    ConsoleWrite("          Client IP: "&$sUserIp&"; Agent: "&$sUserAgent&": GET "&$sHost&" "&$sUrl&@CRLF)
        If $sUrl = "\" Then $sUrl = "\index.htm";       Если клиент запрашивает домашнюю страницу, то отправляем ему страницу index.htm
   
    ; Выход, если запрошен файл exit.php
    If $sUrl = "\exit.php" Then
    _Exit()
    Return ""
    EndIF
   
    If FileExists($sContentFolder&$sUrl) Then
    ; Если запрашиваемый файл существует
        If $sUrl <> "\Authenticate.htm" Then
        ; Если запрошен файл, который не требует авторизации
        Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&$sUrl), "HTTP/1.1", "200 Ok", FileGetTime($sContentFolder&$sUrl), _HttpSC_FileGetMimeType($sUrl), "", "")
        Else
        ; Если запрошен файл, который требует авторизацию
        $aAuthenticateData = _HttpSC_BasicAuthenticate_GetData($sReqest)
            If @Error OR $aAuthenticateData[0] <> $sLogin OR $aAuthenticateData[1] <> $sPassword Then
            ; Если авторизация не пройдена
            Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&"\AuthenticateError.htm"), "HTTP/1.1", "401 Unauthorized", "", "text/html", "", "Authorization required!")
            Else
            ; Если авторизация пройдена
            Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&$sUrl), "HTTP/1.1", "200 Ok", FileGetTime($sContentFolder&$sUrl), _HttpSC_FileGetMimeType($sUrl), "", "")
            EndIF
        EndIF
    Else
    ; Если запрашиваемый файл НЕ существует
    Return _HttpSC_CreateAnswer($aServer, FileRead($sContentFolder&"\404.htm"), "HTTP/1.1", "404 Not Found", "", "text/html", "", "")
    EndIF
EndFunc




; Функция, вызываемая в ответ на POST запрос
Func _PostFunc($sUrl, $hUserSocket, $sUserIp, $sHttpVer, $sReqest)
Local $sAnswer
    ; Преобразуем URL (Декодируем и переворачиваем URL слэши ""/" в Windows-подобные "\")
    $sUrl = __HttpSC_Encoding_URIDecode($sUrl)
    $sUrl = StringReplace($sUrl, "/", "\")
   
    ; Получаем хост и используемый клиентом агент (браузер)
    $sHost = _HttpSC_ReqestParse($sReqest, "Host")
    $sUserAgent = _HttpSC_ReqestParse($sReqest, "User-Agent")
    ConsoleWrite("          Client IP: "&$sUserIp&"; Agent: "&$sUserAgent&": POST "&$sHost&" "&$sUrl&@CRLF)
        If $sUrl = "\" Then $sUrl = "\index.htm";       Если клиент запрашивает домашнюю страницу, то отправляем ему страницу index.htm

$sAnswer =      '<head>'&@CRLF
$sAnswer &=     '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'&@CRLF
$sAnswer &=     '<title>HttpSC</title>'&@CRLF
$sAnswer &=     '</head>'&@CRLF
$sAnswer &=     ''&@CRLF
$sAnswer &=     '<p align="center"><font size="5"><b>HttpSC - POST</b></font></p>'&@CRLF
$sAnswer &=     '<p align="left"><font size="3">Состояние: Успех (POST)</font></p>'&@CRLF
$sAnswer &=     '<p align="left">Данные: '&_HttpSC_PostReqestGetData($sReqest, 0) &'</p>'&@CRLF
$sAnswer &=     '<p align="left"><a href="/">Главная</a></p>'&@CRLF

Return _HttpSC_CreateAnswer($aServer, $sAnswer, "HTTP/1.1", "200 Ok", _HttpSC_ConvertLastModifiedTime(@YEAR&"/"&@MON&"/"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC), "text/html", "", "")
EndFunc




Func _OtherFunc($hUserSocket, $sUserIp, $Reqest)
Return ""
EndFunc

Func _UserBanFunc($sUserIp, $sServerSocket, $sServerIp)
ConsoleWrite("Ban Client IP: "&$sUserIp&@CRLF)
Return ""
EndFunc

 

 

 

См. также

Начало