Chat

  • Hi Leute,
    ich bräuchte mal eure Hilfe. Ich habe mir den Chat vom AutoIt-Wiki kopiert und bearbeitet. Erstmal der Quelltext:

    Spoiler anzeigen


    SERVER:

    [autoit]

    #include <date.au3>
    TCPStartup()

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

    $serverIP = '127.0.0.1'
    $serverport = 80

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

    $srvSocket = TCPListen($serverIP,$serverport)

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

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Server Kontrolle", 625, 443, 700, 50)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 593, 417)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $con = TCPAccept($srvSocket)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If $con >=0 Then
    $rev = ''
    $clientIP = SocketToIP($con)
    ConsoleWrite($clientIP)
    While True
    $rev &= TCPRecv($con,4096)
    If @error Then ExitLoop
    WEnd

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

    If StringLeft($rev,8) = 'MSGPORT#' Then
    $sp = StringSplit($rev,'#')

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

    $cltSocket = TCPConnect($clientIP,$sp[UBound($sp) - 1])
    If $clientIP <> -1 Then
    TCPSend($cltSocket,GUICtrlRead($Edit1))
    TCPCloseSocket($cltSocket)
    EndIf
    ElseIf $rev <> '' Then
    $str = GUICtrlRead($Edit1)
    $str &= @TAB & $rev & @CRLF
    GUICtrlSetData($Edit1,$str)
    EndIf
    EndIf
    WEnd

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

    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf

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

    $sockaddr = 0

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

    Return $aRet
    EndFunc

    [/autoit]

    CLIENT 1:

    [autoit]

    $ip = '127.0.0.1' ; normalerweise @IPAddress1
    $port = 7663
    $serverIP = "127.0.0.1" ; normalerweise die IP des Servers
    $serverport = 80
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    While $Name = ""
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    WEnd
    $Textspeicher = ""
    HotKeySet("{enter}", "senden")

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

    TCPStartup()

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

    AdlibRegister('empfang',5000)
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate($Name & ' - Chatclient', 625, 336, 700, 360)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 601, 281, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    $Button1 = GUICtrlCreateButton("Senden", 528, 304, 89, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $mySocket = TCPListen($ip,$port)

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

    While 1
    sleep(50)
    empfang()
    $con = TCPAccept($mySocket)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    $Ende = MsgBox(4, "Beenden?", "Wollen Sie wirklich den Chat beenden?")
    If $Ende = 6 Then
    Exit
    EndIf
    Case $Button1
    senden()
    EndSwitch
    If $con >=0 Then
    $rev = ''

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

    While True
    $rev &= TCPRecv($con,2048)
    If @error Then ExitLoop
    WEnd
    If $rev <> '' Then
    $str = $rev
    GUICtrlSetData($Edit1,$str)
    EndIf
    EndIf

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

    WEnd

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

    Func senden()
    If GUICtrlRead($Input1) = "!name" Then
    $srvSocket = TCPConnect($serverIP, $serverport)
    $EXNAME = $Name
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    While $Name = ""
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    WEnd
    GUICtrlDelete($Input1)
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    TCPSend($srvSocket, $EXNAME & " hat seinen Namen in " & $Name & " geändert.")
    ControlFocus($Name & ' - Chatclient', "", $Input1)
    TCPCloseSocket($srvSocket)
    Elseif GUICtrlRead($Input1) <> "" Then
    $Textspeicher = GUICtrlRead($Input1)
    GUICtrlDelete($Input1)
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    ControlFocus($Name & ' - Chatclient', "", $Input1)
    $srvSocket = TCPConnect($serverIP, $serverport)
    If $srvSocket = -1 Then Exit
    TCPSend($srvSocket, $Name & " : " & $Textspeicher)
    TCPCloseSocket($srvSocket)
    Else
    MsgBox(0, "Error", "Bitte einen Text eingeben", 5)
    EndIf
    EndFunc
    Func empfang()
    AdlibUnRegister()
    $srvSocket = TCPConnect($serverIP, $serverport)
    If $srvSocket = -1 Then
    Exit
    EndIf
    TCPSend($srvSocket, 'MSGPORT#' & $port)
    TCPCloseSocket($srvSocket)
    AdlibRegister('empfang',5000)
    EndFunc
    TCPShutdown()

    [/autoit]


    und der CLIENT 2:

    [autoit]

    $ip = '127.0.0.1' ; normalerweise @IPAddress1
    $port = 7662
    $serverIP = "127.0.0.1" ; normalerweise die IP des Servers
    $serverport = 80
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    While $Name = ""
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    WEnd
    $Textspeicher = ""
    HotKeySet("{enter}", "senden")

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

    TCPStartup()

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

    AdlibRegister('empfang',5000)
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate($Name & ' - Chatclient', 625, 336, 700, 360)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 601, 281, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    $Button1 = GUICtrlCreateButton("Senden", 528, 304, 89, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $mySocket = TCPListen($ip,$port)

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

    While 1
    sleep(50)
    empfang()
    $con = TCPAccept($mySocket)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    $Ende = MsgBox(4, "Beenden?", "Wollen Sie wirklich den Chat beenden?")
    If $Ende = 6 Then
    Exit
    EndIf
    Case $Button1
    senden()
    EndSwitch
    If $con >=0 Then
    $rev = ''

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

    While True
    $rev &= TCPRecv($con,2048)
    If @error Then ExitLoop
    WEnd
    If $rev <> '' Then
    $str = $rev
    GUICtrlSetData($Edit1,$str)
    EndIf
    EndIf

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

    WEnd

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

    Func senden()
    If GUICtrlRead($Input1) = "!name" Then
    $srvSocket = TCPConnect($serverIP, $serverport)
    $EXNAME = $Name
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    While $Name = ""
    $Name = InputBox("Name?", "Bitte geben Sie Ihren gewünschten Nickname an.")
    WEnd
    GUICtrlDelete($Input1)
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    TCPSend($srvSocket, $EXNAME & " hat seinen Namen in " & $Name & " geändert.")
    ControlFocus($Name & ' - Chatclient', "", $Input1)
    TCPCloseSocket($srvSocket)
    Elseif GUICtrlRead($Input1) <> "" Then
    $Textspeicher = GUICtrlRead($Input1)
    GUICtrlDelete($Input1)
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)
    ControlFocus($Name & ' - Chatclient', "", $Input1)
    $srvSocket = TCPConnect($serverIP, $serverport)
    If $srvSocket = -1 Then Exit
    TCPSend($srvSocket, $Name & " : " & $Textspeicher)
    TCPCloseSocket($srvSocket)
    Else
    MsgBox(0, "Error", "Bitte einen Text eingeben", 5)
    EndIf
    EndFunc
    Func empfang()
    AdlibUnRegister()
    $srvSocket = TCPConnect($serverIP, $serverport)
    If $srvSocket = -1 Then
    Exit
    EndIf
    TCPSend($srvSocket, 'MSGPORT#' & $port)
    TCPCloseSocket($srvSocket)
    AdlibRegister('empfang',5000)
    EndFunc
    TCPShutdown()

    [/autoit]

    so... wenn ich jetzt den Server&die beiden Clients starte, kann ich chatten. Soweit, sogut. Jetzt habe ich eine Funktion (aufrufbar, indem man "!name" in den Chat eintippt) eingefügt, mit der man seinen Namen ändern kann. Nach dem ändern soll eine Mitteilung ("X hat einen Namen in Y geändert.") erscheinen. Das klappt auch - allerdings laggt daraufhin der andere Client und kurze Zeit später stürzt der Server ab. Der Server stürzt allerdings auch ohne Namensändern nach ca 2 Minuten ab.

    Auserdem habe ich noch eine Frage: kann man den Titel der GUI bzw den Text von Input-Boxen mit einem Befehl ändern? Ich musste mich leider der n00bmethode

    [autoit]


    GUICtrlDelete($Input1)
    $Input1 = GUICtrlCreateInput("", 24, 304, 497, 21)

    [/autoit]


    bedienen.

    Danke schonmal

  • Zum zweitem Problem:

    [autoit]

    GUICtrlSetData($Input1,"")

    [/autoit]


    Zum ersten:
    Schließ mal den Socket wieder nach der Übertragung.
    &Ich würde als Anfänger noch keinen Server programmieren! Lerne erst mal die GUI-Befehle fertig ^^ .

    Nur keine Hektik - das Leben ist stressig genug

  • why not? TCP hat wenig mit GUI zu tun, und wenn ich mir das zutraue, lass mich doch :thumbup:
    welche Übertragung meinst du genau? Soweit ich sehe, sind doch alle Sockets geclosed ?(

    EDIT: aber danke für
    GUICtrlSetData($Input1,"")