Hi zusammen,
ich habe mal eine - vielleicht etwas ungewöhnliche - Frage: ich möchte eine Zustandsinformation (offen, geschlossen, unbekannt) im Netzwerk verteilen. Diverse Clients sollen diese Information immer ziemlich aktuell (Minimum: 10sek, Maximum: 1min) zur Verfügung haben. Gespeichert wird die Information zentral (auf dem Server) in einer Text-Datei. Geschrieben wird die Information ca. 5 mal am Tag, und zwar von beliebigen Clients.
Bisher habe ich es so gelöst, dass die Clients sich die Information über ein FileRead() aus dem freigegebenen Verzeichnis vom Server holen (und auch dort schreiben). D.h. die Datei wird also z.B. bei 3 Clients / 30s-Taktung insgesamt 6 mal pro Minute gelesen. Bei 1440min am Tag sind das 8640 lesenden Dateizugriffe auf dem Server pro Tag.
Nun habe ich mir überlegt, dass ich das vielleicht über einen TCP-Server geschickter lösen könnte. Einen Programm, welches die Information unter der Lokalen IP-Adresse (Port 80) des Servers bereitstellt und die Information auch entgegen nehmen /schreiben kann, habe ich bereits programmiert (besser: umgeschrieben, gezeigt wie es geht wurde es hier im Forum):
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=
#AutoIt3Wrapper_outfile=
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;========================================== Includes und Optionen =============================================================================================
#include-once
#include <Misc.au3>
If _Singleton("share_status_server", 1) = 0 Then
Msgbox(0,"Warnung","Eine Instanz des Skripts wird bereits ausgeführt!")
Exit
EndIf
;Funktion welche beim Beenden ausgeführt wird
OnAutoItExitRegister("OnAutoItExit")
;-----------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit];Zum Start den zulezt gespeicherten Zustand aus der Datei lesen
Global $status = FileRead(@ScriptDir & "\status.txt")
If $status = "" Then $status = "unbekannt"
TCPStartup()
$MainSocket = TCPListen(@IPAddress1, 80)
While 1
[/autoit] [autoit][/autoit] [autoit];Lauschen
Do
$socket = TCPAccept($MainSocket)
Sleep(100)
Until $socket <> -1
;Empfangen
$sRecv = ""
Do
$sRecv &= TCPRecv($socket, 1)
Until StringInStr($sRecv, @CRLF & @CRLF)
;Auswerten
ConsoleWrite($sRecv & @CRLF)
If StringInStr($sRecv, "GET /get_status") Then
HTTPSend($socket, $status)
ElseIf StringInStr($sRecv, "GET /set_status=offen") Then
HTTPSend($socket, "ok")
$status="offen"
ElseIf StringInStr($sRecv, "GET /set_status=geschlossen") Then
HTTPSend($socket, "ok")
$status="geschlossen"
ElseIf StringInStr($sRecv, "GET /set_status=unbekannt") Then
HTTPSend($socket, "ok")
$status="unbekannt"
EndIf
[/autoit] [autoit][/autoit] [autoit];Verbindung schließen
TCPCloseSocket($socket)
$socket = -1
WEnd
[/autoit] [autoit][/autoit] [autoit]TCPShutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];-------------------------------------------------------------------------
Func HTTPSend($socket, $sData)
$sHeader = "HTTP/1.1 200 OK" & @CRLF & _
"Server: Autoit" & @CRLF & _
"Cache-Control: max-age=0, public" & @CRLF & _
"Connection: close" & @CRLF & _
"Content-Length: " & StringLen($sData) & @CRLF & _
"Content-Type: text/html; charset=UTF-8" & @CRLF & @CRLF
Return TCPSend($socket, $sHeader & $sData)
EndFunc
;-------------------------------------------------------------------------
Func OnAutoItExit()
;Zustand speichern
FileDelete(@ScriptDir & "\status.txt")
FileWrite(@ScriptDir & "\status.txt", $status)
EndFunc
[/autoit]Den auslesenden Teil für die Clients will ich über die IE.au3 machen: _IENavigate() bzw. _IEBodyReadHTML().
Spoiler anzeigen
#include-once
#include "IE.au3"
#include <Misc.au3>
If _Singleton("share_status_client", 1) = 0 Then
Msgbox(0,"Warnung","Eine Instanz des Skripts wird bereits ausgeführt!")
Exit
EndIf
;Internet-Explorer starten (unsichtbar)
_IEErrorHandlerRegister ()
$oIE = _IECreate("about:blank", 0, 0, 1, 0)
;Zyklisch die Information abrufen
While 1
_IENavigate($oIE, "http://IP-ADRESSE-DES-SERVERS/get_status", 1) ; --> Beim Testen wohl auch einfach @IPAddress1
$status = _IEBodyReadHTML($oIE)
MsgBox("", "", $status, 3)
Sleep (5000)
WEnd
Nun also endlich die Frage(n).
1. Haltet ihr es generell für sinvoll den Weg über einen TCP-Server zu gehen, oder sagt ihr: "Pfeif auf die paar Plattenzugriffe..." ?
2. Wenn das Server-Programm einmal gestartet ist, finden dann eigentlich trotzdem noch irgendwelche Plattenzugriffe statt die ich zwar nicht programmiert habe, die aber Autoit/Windows für den Serverbetrieb benötigt?
3. Wie sieht das beim den Clients aus? Erzeugt das Plattenlast (ich habe den Eindruck, ich höre meine Platte bei jedem Loopdurchlauf, also alle 5sek rattern) ...
Danke für eure Meinungen
Gruß Trainer