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 )
- Max. User Einstellung beim Server (Quellcode)
Getestet wurde der Chat Lokal, sowie auch über das Internet mit Raupi & name22 (danke euch beiden)
Client
;---------------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
Global $Server_ip = @IPAddress1
Global $socket
Global $anmeldung = False
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)
;~ $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 ###
TCPStartup()
Local $Accels[1][2] = [["{enter}", $Senden]]
GUISetAccelerators($Accels, $Gui)
;~ _GUICtrlRichEdit_AutoDetectURL($Chatfenster, True)
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: ")
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)
;~ _GUICtrlRichEdit_AppendText($Chatfenster, $daten_empfangen & @CRLF)
EndIf
EndIf
EndIf
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
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)
Else
$anmeldung = False
EndIf
WEnd
If $anmeldung <> True Then MsgBox(16, "Fehler", "Der Server hat die Verbindung nicht angenommen!")
EndFunc ;==>verbinden
[/autoit] [autoit][/autoit] [autoit]Func senden($zusendenderstring)
TCPSend($socket, $zusendenderstring)
If @error Then fehler(3, False)
GUICtrlSetData($senden_input, "")
EndFunc ;==>senden
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
Server
#RequireAdmin
; Copyright by Jonathan Möwe
;~ Global
Global $ip = @IPAddress1
$maxuser = 100
Global $userliste = ""
Global $User[$maxuser]
Global $Userarraysize = UBound($User) - 1
Global $Username[$maxuser]
Global $Usernamearraysize = UBound($Username) - 1
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)
;~ $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
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
func sendeuserliste()
$userliste = ""
For $iZ = 0 to $Userarraysize
If $user[$iZ] <> -1 then $userliste &= $username[$iZ] & ""
Next
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
Im server script habe ich meine evtl. schwieriger nachzuvollziehenden Gedankengänge mit Kommentaren Versehen