• Eigentlich sollte das ein kleiner Wettbewerb mit Djblume werden, wer in möglichst kurzer Zeit einen vernünftigen Chat hinbekommt... Aber die Blume hat Kapituliert. Deswegen ist er auch nicht ganz Fertig (Einstellungsdialog ist nicht da & die Smilys werden im Chatfenster nicht angezeigt) Aber ich dachte mir, wenn jemand mal in das Thema TCP & Chat einsteigen will, ist das ja ein tolles Beispiel.
    Extras:

    • Login nötig
    • Userliste
    • Logins werden in einer .ini beim Server gespeichert
    • Logdateien werden ersetllt
    • Übersichtliche Fehlercodeliste (nur beim Client :D )
    • Max. User Einstellung beim Server (Quellcode)


    Getestet wurde der Chat Lokal, sowie auch über das Internet mit Raupi & name22 (danke euch beiden)

    Client
    [autoit]

    ;---------------FehlerCodes----------------
    ; 1 - Server nicht erreichbar
    ; 2 - Fehler beim Verbinden mit dem Server
    ; 3 - Fehler beim senden des Strings
    ; 4 - Fehler beim empfangen der Rückmeldung über LoginDaten
    ; 5 - Fehler beim empfangen der Chatnachrischten
    ; -----------------------------------------
    ;Copyright by Jonathan Möwe
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <GuiStatusBar.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiEdit.au3>
    ;~ #include <ScrollBarConstants.au3>
    ;~ #include <GuiRichEdit.au3>
    #RequireAdmin

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

    Global $Server_ip = @IPAddress1
    Global $socket
    Global $anmeldung = False

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

    If Not Ping($Server_ip) Then fehler(1, True)

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

    #Region ### START Koda GUI section ### Form=
    $Gui = GUICreate("TCPChat by Möwe", 693, 467, 192, 124)
    $Username_label = GUICtrlCreateLabel("Username:", 16, 20)
    $Passwort_label = GUICtrlCreateLabel("Passwort:", 224, 20)
    $Verbinden_button = GUICtrlCreateButton("Verbinden", 424, 16, 75, 25, $WS_GROUP)
    ;~ $StatusBar1 = _GUICtrlStatusBar_Create($Gui) ;kommt vllt. später mal...
    $username_input = GUICtrlCreateInput("user", 80, 16, 121, 21)
    $passwort_input = GUICtrlCreateInput("passwort", 280, 16, 121, 21, $ES_PASSWORD)
    $onlineuser_liste = GUICtrlCreateEdit("", 496, 64, 185, 297,$ES_READONLY)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Trennen_button = GUICtrlCreateButton("Trennen", 512, 16, 75, 25, $WS_GROUP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Einstellungen_button = GUICtrlCreateButton("Einstellungen", 600, 16, 75, 25, $WS_GROUP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Chatfenster = GUICtrlCreateEdit("", 24, 64, 441, 297) ;$ES_AUTOVSCROLL + $ES_READONLY <-- geht nciht
    ;~ GUICtrlSetState(-1,$GUI_Hide)

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

    ;~ $Chatfenster = _GUICtrlRichEdit_Create($Gui, "", 24, 64, 441, 297, BitOR($ES_MULTILINE, $ES_READONLY))

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

    $senden_input = GUICtrlCreateInput("", 24, 376, 441, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Senden = GUICtrlCreateButton("Senden", 24, 408, 75, 25, $WS_GROUP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $smili_lol_button = GUICtrlCreateButton("", 112, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "lol.ico", "", 0)
    $smili_angel_button = GUICtrlCreateButton("", 144, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "angel.ico", "", 0)
    $smili_angry_button = GUICtrlCreateButton("", 176, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "angry.ico", "", 0)
    $smili_cool_button = GUICtrlCreateButton("", 208, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "cool.ico", "", 0)
    $smili_happy_button = GUICtrlCreateButton("", 240, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "happy.ico", "", 0)
    $smili_hmm_button = GUICtrlCreateButton("", 304, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "hmm.ico", "", 0)
    $smili_sad_button = GUICtrlCreateButton("", 272, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "sad.ico", "", 0)
    $smili_shame_button = GUICtrlCreateButton("", 368, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "shame.ico", "", 0)
    $smili_surprise_button = GUICtrlCreateButton("", 336, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "surprise.ico", "", 0)
    $smili_weepy_button = GUICtrlCreateButton("", 432, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "weepy.ico", "", 0)
    $smili_winky_button = GUICtrlCreateButton("", 400, 408, 27, 25, $BS_ICON)
    GUICtrlSetImage(-1, "winky.ico", "", 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    TCPStartup()
    Local $Accels[1][2] = [["{enter}", $Senden]]
    GUISetAccelerators($Accels, $Gui)
    ;~ _GUICtrlRichEdit_AutoDetectURL($Chatfenster, True)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    disconnect()
    TCPShutdown()
    Exit
    Case $Verbinden_button
    verbinden(GUICtrlRead($username_input), GUICtrlRead($passwort_input))
    Case $Senden
    If GUICtrlRead($senden_input) <> "" Then senden(GUICtrlRead($senden_input))
    Case $Trennen_button
    disconnect()
    Case $smili_angel_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :angel: ")
    Case $smili_angry_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :angry: ")
    Case $smili_cool_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :cool: ")
    Case $smili_happy_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :happy: ")
    Case $smili_hmm_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :hmm: ")
    Case $smili_lol_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :lol: ")
    Case $smili_sad_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :sad: ")
    Case $smili_shame_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :shame: ")
    Case $smili_surprise_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :suprise: ")
    Case $smili_weepy_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :weepy: ")
    Case $smili_winky_button
    GUICtrlSetData($senden_input, GUICtrlRead($senden_input) & " :winky: ")

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

    EndSwitch
    If $anmeldung = True Then
    $daten_empfangen = TCPRecv($socket, 550)
    If @error Then fehler(5, False)
    If $daten_empfangen <> "" Then
    ;~ $daten_empfangen = "liste user1|user2"
    $userliste = StringSplit($daten_empfangen, "")
    If $userliste[0] = 2 And $userliste[1] = "liste " Then
    GUICtrlSetData($onlineuser_liste,"")
    GUICtrlSetData($onlineuser_liste,StringReplace($userliste[2],"",@CRLF))
    ElseIf $userliste[0] <> 2 And $userliste[1] <> "liste" Then
    GUICtrlSetData($Chatfenster,GUICtrlRead($Chatfenster) & $daten_empfangen & @CRLF)
    TrayTip("","Neue Chatmitteilung",5,1)
    _GUICtrlEdit_Scroll($Chatfenster,3)

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

    ;~ _GUICtrlRichEdit_AppendText($Chatfenster, $daten_empfangen & @CRLF)
    EndIf
    EndIf
    EndIf

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

    WEnd

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

    ;Funktionen -----------------------------------------------------------------------

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

    Func fehler($code, $exit)
    MsgBox(48, "Fehler", "FehlerCode: " & $code)
    If $exit = True Then Exit
    EndFunc ;==>fehler

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

    Func verbinden($username, $passwort)
    $socket = TCPConnect($Server_ip, 2412)
    If @error Then fehler(2, True)
    senden($username & ":" & $passwort)
    $waittimer = TimerInit()
    While TimerDiff($waittimer) < 1000
    If TCPRecv($socket, 100) = "okay" Then
    If @error Then fehler(4, False)
    MsgBox(64, "Anmeldung erfolgreich", "Sie wurden erfolgreich angemeldet", 1)
    $anmeldung = True
    GUICtrlSetState($Verbinden_button, $GUI_DISABLE)
    GUICtrlSetState($Trennen_button, $GUI_Enable)
    GUICtrlSetState($senden_input, $GUI_Enable)
    GUICtrlSetState($Senden, $GUI_Enable)
    GUICtrlSetState($username_input, $GUI_DISABLE)
    GUICtrlSetState($passwort_input, $GUI_DISABLE)
    ;~ _GUICtrlRichEdit_AppendText($Chatfenster, "--- Mit dem Server Verbunden ---" & @CRLF)
    GUICtrlSetData($Chatfenster,GUICtrlRead($Chatfenster) & "--- Mit Server Verbunden ---" & @CRLF)

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

    Else
    $anmeldung = False
    EndIf
    WEnd
    If $anmeldung <> True Then MsgBox(16, "Fehler", "Der Server hat die Verbindung nicht angenommen!")

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

    EndFunc ;==>verbinden

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

    Func senden($zusendenderstring)
    TCPSend($socket, $zusendenderstring)
    If @error Then fehler(3, False)
    GUICtrlSetData($senden_input, "")
    EndFunc ;==>senden

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

    Func disconnect()
    TCPCloseSocket($socket)
    GUICtrlSetData($Chatfenster,GUICtrlRead($Chatfenster) & "--- Verbindung getrennt ---" & @CRLF)
    GUICtrlSetState($senden_input, $GUI_DISABLE)
    GUICtrlSetState($Senden, $GUI_DISABLE)
    GUICtrlSetState($Verbinden_button, $GUI_Enable)
    GUICtrlSetState($Trennen_button, $GUI_DISABLE)
    GUICtrlSetState($username_input, $GUI_Enable)
    GUICtrlSetState($passwort_input, $GUI_Enable)
    $anmeldung = False
    EndFunc ;==>disconnect

    [/autoit]
    Server
    [autoit]

    #RequireAdmin
    ; Copyright by Jonathan Möwe
    ;~ Global
    Global $ip = @IPAddress1
    $maxuser = 100

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

    Global $userliste = ""
    Global $User[$maxuser]
    Global $Userarraysize = UBound($User) - 1
    Global $Username[$maxuser]
    Global $Usernamearraysize = UBound($Username) - 1

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

    TCPStartup()
    $socket = TCPListen($ip, 2412)
    $logfile = FileOpen(@ScriptDir & "\logs\" & @MDAY & "-" & @MON & "-" & @YEAR & ".log", 1)
    FileWrite($logfile,"[" & @HOUR & ":" & @MIN & "] Server Gestartet!" & @CRLF)
    AdlibRegister("sendeuserliste",5000)
    While 1
    For $i = 0 To $Userarraysize
    If $User[$i] = -1 Then
    $User[$i] = TCPAccept($socket)

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

    ;~ $userwaittimer = TimerInit()
    ;~ while TimerDiff($userwaittimer) <
    $userdaten = TCPRecv($User[$i], 500)
    If $userdaten = "" Then
    TCPSend($User[$i], "0")
    TCPCloseSocket($User[$i])
    $User[$i] = -1
    ElseIf $userdaten <> "" Then
    $user_anmeldedaten = StringSplit($userdaten, ":")
    If $user_anmeldedaten[2] = IniRead("user.ini", "user", $user_anmeldedaten[1], "error") Then
    $Username[$i] = $user_anmeldedaten[1]
    TCPSend($User[$i], "okay")
    FileWrite($logfile, "[" & @HOUR & ":" & @MIN & "] Angemeldet - " & $user_anmeldedaten[1] & @CRLF)
    Else
    TCPSend($User[$i], "0")
    FileWrite($logfile, "[" & @HOUR & ":" & @MIN & "] Anmeldeversuch - FALSCHES PASSWORT - " & $user_anmeldedaten[1] & @CRLF)
    EndIf
    EndIf
    ;~ WEnd

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

    EndIf

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

    If $User[$i] <> -1 Then
    $sRecvied = TCPRecv($User[$i], 700); Daten empfangen
    If @error Then
    TCPCloseSocket($User[$i]) ;Verbindung trennen
    $User[$i] = -1 ;Und wieder verfügbar machen
    EndIf
    If $sRecvied <> "" Then
    ;~ MsgBox(0,"Daten empfangen",$sRecvied)
    FileWrite($logfile, "[" & @HOUR & ":" & @MIN & "] Chat: " & $username[$i] & " - " & $sRecvied & @CRLF)
    For $iY = 0 To $Userarraysize
    If $User[$iY] <> -1 Then TCPSend($User[$iY], "[" & @HOUR & ":" & @MIN & "] " & $Username[$i] & ": " & $sRecvied) ; empfangende Daten weiterleiten
    Next
    $sRecvied = ""
    EndIf
    EndIf
    Next
    WEnd

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

    func sendeuserliste()
    $userliste = ""
    For $iZ = 0 to $Userarraysize
    If $user[$iZ] <> -1 then $userliste &= $username[$iZ] & ""
    Next

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

    For $iY = 0 To $Userarraysize
    If $User[$iY] <> -1 Then TCPSend($User[$iY], "liste " & $userliste) ; empfangende Daten weiterleiten
    Next
    FileWrite($logfile, "[" & @HOUR & ":" & @MIN & "] Userliste aktualisiert... : " & $userliste & @CRLF)
    EndFunc

    [/autoit]

    Im server script habe ich meine evtl. schwieriger nachzuvollziehenden Gedankengänge mit Kommentaren Versehen :rolleyes:

  • wow! sehr nettes programm!

    Füg aber vl noch beim Clienten ein

    [autoit]

    #NoTrayIcon

    [/autoit]

    und beim server

    [autoit]

    Opt ('TrayAutoPause' , 0)

    [/autoit]

    da ich es hasse wenn ich auf das symbol klicke, dass sich der script paussiert. Ist vl meinungssache.. aber naja überlegs dir ;)

    die Chat funktion funktioniert supper :D

    • Offizieller Beitrag
    Zitat

    Ich bin gerade dabei einen TCP-Chat zu Coden, Und da gehen sogar Smiley :P

    @DjBlume, ich frage mich warum ihr beiden nicht daran arbeitet? Ist irgendwie sinnlos das 2 Leute das Rad neu erfinden wollen.

  • geht bei mir irgendwie nicht.....

    also wie registriere ich mich....


    is das dann dein oder mein chat???

    wiso kommt immer nicht angenommen?

  • Du musst eigentlich den namen User bei jeden Chat Partner angeben um beitreten zu können.Und natürlich das Passwort ;) .Wenn du nicht den Namen User willst(für alle Chatpartner),dann änder einfach in der user ini datei den eintrag user.Nicht den in Klammern sondern den vor dem Gleichzeichen.

    Zitat

    Ich bin gerade dabei einen TCP-Chat zu Coden, Und da gehen sogar Smiley

    Kannst du den Code ev online stellen oder per pm schicken?

  • Hallo,


    auch wenn der letzte Eintrag schon fast 1 Jahr her ist, vielleicht kann mir doch jemand helfen.


    das Programm funktioniert soweit, allerdings kommt es manchmal zur Übertragung von "komischen" Zeichen im Chatfenster bzgl. der Userliste, die aktualisiert wird dauernd.

    Im Server-Script gibt es folgenden Satz, der die Userliste aktualisiert...( da sind die "komischen" Zeichen drin ) :D

    Spoiler anzeigen
    [autoit]


    func sendeuserliste()
    $userliste = ""
    For $iZ = 0 to $Userarraysize
    If $user[$iZ] <> -1 then $userliste &= $username[$iZ] & ""
    Next

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

    For $iY = 0 To $Userarraysize
    If $User[$iY] <> -1 Then TCPSend($User[$iY], "liste " & $userliste) ; empfangende Daten weiterleiten
    Next
    ;FileWrite($logfile, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Userliste aktualisiert... : " & $userliste & @CRLF)

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

    EndFunc

    [/autoit]


    wofür werden die Zeichen gebraucht: Zeile 4 und Zeile 8 im Quellcode

    Gruß
    digitalworks

  • @DjBlume, ich frage mich warum ihr beiden nicht daran arbeitet? Ist irgendwie sinnlos das 2 Leute das Rad neu erfinden wollen.


    Warum sinnlos finde ich sehr sinnvoll, ich ahb schon 4 TCP Server geschreiben.
    Und die dan eben von mal zu mal verbessert, verschnellert und mit mehr funcs ausgestattet.
    Was ist daran Sinnlos?