Problem bei Chat Server mit TCP.au3 UDF

  • 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
    [autoit]

    ;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

    [/autoit]

    Client:

    Spoiler anzeigen
    [autoit]

    #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()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    Schon mal Vielen Dank im Vorraus

    Liebe Grüße
    Jonas

  • Hallo Jonas Houben,
    ich habe mir mal dein Script angeschaut und getestet, Windows 7 Home Premium 64 Bit - System.
    Beim testen lief alles fehlerfrei, und einen Disconnet habe ich auch nicht bekommen.

    Schon mal versucht beide IP's so zu ändern ? Global $ip = "127.0.0.1"

  • Hallo Jonas Houben,
    ich habe mir mal dein Script angeschaut und getestet, Windows 7 Home Premium 64 Bit - System.
    Beim testen lief alles fehlerfrei, und einen Disconnet habe ich auch nicht bekommen.

    Schon mal versucht beide IP's so zu ändern ? Global $ip = "127.0.0.1"

    Die IPs im Script sind beides die selben: Vom Server und vom Client :rolleyes:
    Die Namensauflösung beim Client ist nur zu Testzwecken damit die IP variieren kann.
    Außerdem Läuft bei mir auch alles fehlerfrei, aber hast du schon mal in die clientnames.txt geschaut? Dadrin sollte eigentlich der Nickname vom Client landen.
    Dies ist bei mir aber nicht so.
    Trotzdem: Vielen Dank für die (schnelle) Antwort.

    MfG

    Jonas Houben

    MfG Jonas