Hallo liebe Community,
Ich habe ein Problem und zwar mit der TCP.au3 UDF aus dem englischem Forum http://www.autoitscript.com/forum/topic/74…f-event-driven/
Ich habe ein kleinen Chatserver und einen Clienten geschrieben, ich habe mir ein bisschen Code aus dem AutoIT Chat von Protex herausgeschrieben(wenn auch nur den Recieve Befehl)
Leider funktioniert der Server nicht wie ich ihn mir vorgestellt habe.
Der Netzwerkverkehr wird aus irgendeinem Grund abgebrochen.
(Funktionsweise steht als Kommentar in den Au3 Dateien)
Server:
Spoiler anzeigen
;Includes
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <TCP.au3>
#include <Inet.au3>
;Includes END
;Cleanup
OnAutoItExitRegister("_End")
;Cleanup END
;Variablen und Arrays
Global $BanList[1] ;Ban Liste
Global $NameArray[1] ;Namens Liste
Global $ClientArray[5] ;Socket/Client Liste
Global $ip = @IPAddress1 ;IP
Global $port = 3333 ;Port
Global $state = False ;Erfolgreich?
Global $block = False ;5 User erreicht?
$hServer = _TCP_Server_Create($port, $ip) ;Server erstellen
_TCP_RegisterEvent($hServer, $TCP_RECEIVE, "Receive") ;Funktion wenn empfangen
_TCP_RegisterEvent($hServer, $TCP_NEWCLIENT, "NewClient") ;Neuer Client
_TCP_RegisterEvent($hServer, $TCP_DISCONNECT, "Disconnect") ;Client Disconnected
;GUI
Opt("GUIOnEventMode", 1)
#region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 615, 438, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $List1 = GUICtrlCreateList("", 24, 72, 201, 253)
Global $Button1 = GUICtrlCreateButton("Ban", 232, 72, 75, 25)
GUICtrlSetOnEvent(-1, "Button1Click")
Global $Button2 = GUICtrlCreateButton("Unban", 232, 104, 75, 25)
GUICtrlSetOnEvent(-1, "Button2Click")
Global $Button3 = GUICtrlCreateButton("Senden", 232, 136, 75, 25)
GUICtrlSetOnEvent(-1, "Button3Click")
Global $Input1 = GUICtrlCreateInput("...", 232, 168, 121, 21)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
;Main While Schleife
While 1
Sleep(100)
WEnd
;GUI END
Func NewClient($hSocket, $iError) ;Neuer Client
;MsgBox(0, "SERVER", "NewClient") MSGBOX für Debug
Global $hClient = $hSocket ;Eigentlich sinnlos...
Global $hClientIP = _TCP_Server_ClientIP($hClient) ;IP des Clienten
Global $hClientName = _TCPIpToName($hClientIP) ;Netzwerkname
;Bann Abfrage
If _ArraySearch($BanList, $hClientIP) <> -1 Then ;Wenn die IP in der Banliste steht dann schicke zum Client:
_TCP_Send($hClient, "##banned~1") ;##banned~1
Else ;Wenn nicht dann:
_TCP_Send($hClient, "##banned~0") ;##banned~0
EndIf
;END
;Clienten Abfrage
If $block = True Then ;Wenn 5 Clienten verbunden sind und ein neuer kommt dann:
_TCP_Send($hClient, "##block~1") ;##block~1
EndIf
;END
Select ;Clienten Freie Array Plätze zuweisen
Case $ClientArray[0] = "" And $state = False And $block = False
$ClientArray[0] = $hClient & "|" & $hClientName
Global $state = True
Case $ClientArray[1] = "" And $state = False And $block = False
$ClientArray[1] = $hClient & "|" & $hClientName
Global $state = True
Case $ClientArray[2] = "" And $state = False And $block = False
$ClientArray[2] = $hClient & "|" & $hClientName
Global $state = True
Case $ClientArray[3] = "" And $state = False And $block = False
$ClientArray[3] = $hClient & "|" & $hClientName
Global $state = True
Case $ClientArray[4] = "" And $state = False And $block = False
$ClientArray[4] = $hClient & "|" & $hClientName
Global $state = True
Global $block = True
EndSelect
;END
If $state = True Then ;Wenn alles erfolgreich war dann:
_TCP_Send($hClient, "##accepted~" & $hClient) ;##accepted~($hclient)
Call("Chat", "Client: " & $hClientName & " has joined!") ;Schreibe in den Chat: "Client: " & $hClientName & " has joined!"
EndIf
;END
Global $state = False ;Abschluss
FileDelete("client.txt") ;Dateien löschen
FileDelete("ban.txt")
FileDelete("clientnames.txt")
;END
_FileWriteFromArray("clientnames.txt", $NameArray) ;Arrays in Dateien schreiben
_FileWriteFromArray("client.txt", $ClientArray)
_FileWriteFromArray("ban.txt", $BanList)
;END
_TCP_Server_Broadcast("##name~" & $hClientIP) ;Nickname Abfrage
;END
EndFunc ;==>NewClient
Func Disconnect($hSocket, $iError) ;WEnn jemand disconnectet dann:
$search = _ArraySearch($NameArray, $hSocket) ;Suche in Nickname Array nach dem Socket
_ArrayDelete($NameArray, $search) ;Lösche den Eintrag
$search = _ArraySearch($ClientArray, $hSocket) ;Suche in Clienten Liste nach dem Socket
_ArrayDelete($ClientArray, $search) ;Lösche den Eintrag
;END
FileDelete("client.txt") ;Lösche Dateien
FileDelete("ban.txt")
FileDelete("clientnames.txt")
;END
_FileWriteFromArray("clientnames.txt", $NameArray) ;Array neuschreiben
_FileWriteFromArray("client.txt", $ClientArray)
_FileWriteFromArray("ban.txt", $BanList)
;END
ToolTip("SERVER:Client disconnected:" & $hSocket) ;Tooltip
EndFunc ;==>Disconnect
Func Received($hSocket, $sReceived, $iError) ;Wenn etwas empfangen wurde:
$split = StringSplit($sReceived, "~") ;Teile auf: vor und nach "~"
Select
Case $split[0] = "##useradd"
If _ArraySearch($NameArray, $split[1]) <> -1 Then ;Wenn der Name schon gefunden wurde
_TCP_Send($hSocket, "##userblock") ;Sende ##userblock
Else ;Wenn nicht:
_ArrayAdd($NameArray, $hSocket & "|" & $split[1]) ;Den Socket und den Namen dem Array hinzufügen
_TCP_Server_Broadcast("##usersuc~" & $split[1]) ;Allen Clienten das schicken ##usersuc~&$split[1]
EndIf
EndSelect
;END
EndFunc ;==>Received
Func Kick($ClientName) ;Funktion KICK
_TCP_Server_Broadcast("##kick~" & $ClientName) ;An Alle Clienten: ##kick~$ClientName
EndFunc ;==>Kick
Func Chat($hMessage) ;Funktion Chat
_TCP_Server_Broadcast("##chat~" & $hMessage) ;Sende ##chat~$hMessage
EndFunc ;==>Chat
Func Ban($hSocket) ;Bann Funktion
$hIP = _TCP_Server_ClientIP($hSocket) ;IP herausfinden
_ArrayAdd($BanList, $hIP) ;Füge dem Array die IP hinzu
ToolTip("IP:" & $hIP & " banned.") ;ToolTip
;Array neu schreiben
FileDelete("client.txt")
FileDelete("ban.txt")
FileDelete("clientnames.txt")
_FileWriteFromArray("clientnames.txt", $NameArray)
_FileWriteFromArray("client.txt", $ClientArray)
_FileWriteFromArray("ban.txt", $BanList)
EndFunc ;==>Ban
Func UnBan($hSocket) ;Funktion UnBan
$search = _ArraySearch($BanList, $hSocket)
_ArrayDelete($BanList, $search)
ToolTip("IP:" & $hSocket & " unbanned.") ;ToolTip
FileDelete("client.txt") ;Array neuschreiben
FileDelete("ban.txt")
FileDelete("clientnames.txt")
_FileWriteFromArray("clientnames.txt", $NameArray)
_FileWriteFromArray("client.txt", $ClientArray)
_FileWriteFromArray("ban.txt", $BanList)
EndFunc ;==>UnBan
Func _End() ;Ende
_TCP_Server_Stop()
FileDelete("client.txt")
FileDelete("ban.txt")
FileDelete("clientnames.txt")
EndFunc ;==>_End ;###GUI
Func Button1Click()
$input = GUICtrlRead($Input1)
Call("Ban", $input)
EndFunc ;==>Button1Click
Func Button2Click()
$input = GUICtrlRead($Input1)
Call("UnBan", $input)
EndFunc ;==>Button2Click
Func Button3Click()
$input = GUICtrlRead($Input1)
Call("Chat", $input)
EndFunc ;==>Button3Click
Func Form1Close()
Exit
EndFunc ;==>Form1Close
;###GUI END
Client:
Spoiler anzeigen
#include <TCP.au3>
Global $ip = TCPNameToIP("jonas-laptop") ;IP
Global Const $port = 3333 ;Port
Global $accepted = False ;Angenommen?
Global $blocked = False ;Blocked?
Global $nick = InputBox("Bitte Nicknamen eingeben...", "") ;Nickname?
Global $ClientName = $nick ;ClientNAme
$socket = _TCP_Client_Create($ip, $port) ;Client erstellen
_TCP_RegisterEvent($socket, $TCP_RECEIVE, "Receive")
_TCP_RegisterEvent($socket, $TCP_DISCONNECT, "Disconnect")
_TCP_RegisterEvent($socket, $TCP_CONNECT, "Connected")
While 1 ;Mainwhile
Sleep(100)
WEnd
Func Receive($hSocket, $sReceived, $iError)
$split = StringSplit( $sReceived , "~" , 2)
Select
Case $split[0] = "##accepted"
ToolTip("CLIENT:Connected")
Global $accepted = True
Global $blocked = False
Case $split[0] = "##kick"
If $split[1] = $ClientName Then
MsgBox(0, "CLIENT", "KICKED")
Exit
Else
MsgBox(0 , "CLIENT", "USER: "&$split[1]&" was kicked" )
EndIf
Case $split[0] = "##block"
MsgBox(0, "CLIENT", "BLOCKED")
Global $accepted = False
Global $blocked = True
Case $split[0] = "##chat"
MsgBox(0, "Chat", $split[1])
Case $split[0] = "##banned"
If $split[1] = 1 Then
MsgBox(0, "Banned", "You are banned from this Server")
Exit
EndIf
Case $split[0] = "##usersuc"
If $split[1] = $ClientName Then
MsgBox( 0 , "CLIENT" , "Name accepted" )
EndIf
Case $split[0] = "##userblock"
MsgBox( 0 ,"", "Name already online" )
Exit
Case $split[0] = "##name"
If $split[1] = @IPAddress1 Then
Sleep(100)
_TCP_Send($socket,"##useradd~"&$ClientName )
EndIf
EndSelect
EndFunc ;==>Receive
Func Disconnect($hSocket, $iError)
MsgBox(0, "CLIENT", "Disconnected.")
Exit
EndFunc ;==>Disconnect
Func _Connected()
EndFunc
[/autoit]Schon mal Vielen Dank im Vorraus
Liebe Grüße
Jonas