Tcp Chat mit diversen Funktionen (GLobal-, Privatchat...)

  • Ich hab kein Plan wie oft das Thema hier schon existiert aber egal :D
    Ist mein erster Post in dem Forum, glaube xD

    . geschrieben habe ich einen Chat ( Server und CLient ) mit dem man , ja, wie der Name schon sagt, chatten kann :D
    Dabei sieht man allerdings sowohl im Serverbereich als auch im Chatbereich in einer Gui wie viel und welche User online sind und man kann dann privat mit ihnen chatten... aber auch öffentlich, global, allgemein.. etc. kp.

    Der Quelltext ist relativ gering, gut dafür sind die Funktionen auch übersichtlich, um nicht das Wort "spartanisch" verwenden zu müssen.. xD

    "Screen´s"

    Spoiler anzeigen


    (Oben links = Server )
    (Oben rechts, Unten Links, Unten Rechts = Client (für den User vorgesehenen Chat))
    [Blockierte Grafik: http://file1.npage.de/003952/94/bilder/all.png]

    Server only:
    [Blockierte Grafik: http://file1.npage.de/003952/94/bilder/server.png]

    Client only:
    [Blockierte Grafik: http://file1.npage.de/003952/94/bilder/client.png]

    Quellcode Server:

    Spoiler anzeigen
    [autoit]

    ;SERVER

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

    #include
    #include
    #include
    #Include
    #Include
    #include
    #include

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

    $win = GUICreate("SERVER BY SUPERCOPRA",600,500)
    GUISetBkColor(0x606060)

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

    Global $EDIT = GUICtrlCreateEdit("",0,0,450,400,$es_readonly)
    GUICtrlSetColor(-1,0x00ff00)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlSetFont(-1,9,1000)
    ;Global $lv = _GUICtrlListView_Create($win,"User Online",450,0,150,400)
    Global $LV = GUICtrlCreateListView("USER",450,0,150,400)
    _GUICtrlListView_SetColumnWidth($lv,0,140)
    ;_GUICtrlListView_SetBkColor($LV, 0x000000)
    ;_GUICtrlListView_SetTextBkColor($LV, 0x000000)
    ;_GUICtrlListView_SetTextColor($LV, 0x00ffff)
    GUICtrlSetColor($lv,0xffff00)
    GUICtrlSetBkColor($lv,0x000000)
    GUICtrlSetFont($lv,9,1000)
    Global $b_start = GUICtrlCreateButton("Starte Server",450,400,150,25)
    GUICtrlSetFont(-1,9,1000)
    GUICtrlSetCursor(-1,0)
    Global $graph = GUICtrlCreateGraphic(450,425,150,50)
    GUICtrlSetBkColor(-1,0xff0000)
    Global $b_close = GUICtrlCreateButton("Schließe Server",450,475,150,25)
    GUICtrlSetFont(-1,9,1000)
    GUICtrlSetState(-1,$gui_disable)
    GUICtrlSetCursor(-1,0)
    Global $input = GUICtrlCreateInput("",0,400,400,25)
    Global $b_send = GUICtrlCreateButton("Senden",400,400,50,25)
    GUICtrlSetCursor(-1,0)

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

    Global $label_loop = GUICtrlCreateLabel("000000 RPS",1,485)
    GUICtrlSetColor(-1,0x00ff00)
    GUICtrlSetFont(-1,9,1000)

    GUICtrlCreateGroup("User-Control",5,430,440,50)
    Global $label_user = GUICtrlCreateLabel("User:",15,450,200)
    GUICtrlSetFont(-1,9,1000)

    Global $b_user_kick = GUICtrlCreateButton("Kicken",230,445,100,25)
    GUICtrlSetCursor(-1,0)
    GUICtrlSetState($b_user_kick,$gui_disable)
    Global $b_user_send = GUICtrlCreateButton("Senden",340,445,100,25)
    GUICtrlSetCursor(-1,0)
    GUICtrlSetState($b_user_send,$gui_disable)
    Global $b_user_array = GUICtrlCreateButton("show User-Array (ACHTUNG: Verbindung in WArteschleife)",140,482,305,15)
    GUICtrlSetCursor(-1,0)

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

    Global $loop1 = TimerInit()
    Global $loop2 = TimerInit()
    Global $loop3 = TimerInit()
    Global $STAT = -1
    Global $IP = @IPAddress1
    Global $Port = 12345 ;TEST port :D
    Global $verbindung
    Global $MAX = 100
    Global $USER[$MAX+1][10]
    ;0 Socket
    ;1 Ip-Adresse
    ;2 IDentifikation
    ;3 Name
    ;4 Status (4=bereit)
    ;8 TEmp-Speicher
    ;9 temp-timer
    Global $USER_N[$MAX+1]
    Global $KEY = "Venzol123!?"
    Global $VALUE = "Siegbert Schnoesel"
    Global $LEVEL = 5
    Global $SECURE = _StringEncrypt(1,$value,$key,$level)
    Global $select[3]

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

    GUISetState(@sw_show)
    While 1
    $a = GUIGetMsg()

    Switch $a
    case -3
    Exit
    case $b_start
    _Server_start()
    case $b_close
    _Server_close()
    Case $b_send
    _send_server_msg()
    Case $b_user_send
    _send_user()
    Case $b_user_kick
    _kick_user()
    Case $b_user_array
    _ArrayDisplay($user)
    EndSwitch

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

    if $stat = 1 Then
    ;Receives pro Sekunde PRO ALLE SOckets !
    if TimerDiff($loop1) > 1000 Then
    $loop1 = TimerInit()
    $wert = Int(1000 / $loop3)
    if $wert < 10 Then
    GUICtrlSetColor($label_loop,0xff0000)
    Else
    GUICtrlSetColor($label_loop,0x00ff00)
    EndIf

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

    GUICtrlSetData($label_loop,$wert & " RPS") ;Rec pro sekunde
    EndIf
    $loop3 = TimerDiff($loop2)
    $loop2 = TimerInit()

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

    ;User Control
    $select[0] = _GUICtrlListView_GetSelectionMark($lv)
    if Not ($select[1] = $select[0]) Then
    $select[1] = $select[0]
    if $select[0] = -1 Then
    GUICtrlSetData($label_user,"User: ")
    GUICtrlSetState($b_user_send,$gui_disable)
    GUICtrlSetState($b_user_kick,$gui_disable)
    $select[2] = ""
    Else
    $name_select = _GUICtrlListView_GetItemText($lv,$select[0])
    GUICtrlSetData($label_user,"User: " & $name_select)
    GUICtrlSetState($b_user_send,$gui_enable)
    GUICtrlSetState($b_user_kick,$gui_enable)
    $select[2] = $name_select
    EndIf
    EndIf

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

    ;MAAAAIIIINNNNNNNN FUNC
    _work()
    EndIf
    WEnd

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

    func _work()
    ;NEUER EINGANG
    $temp = TCPAccept($verbindung)
    if not ($temp = -1) Then
    _new_user($temp)
    EndIf

    for $i = 0 To $MAX
    ;IDENTIFIZIEREN
    if $user[$i][4] = 1 Then
    $temp = TCPRecv($user[$i][0],4096)
    if TimerDiff($user[$i][2]) > 3000 Then
    _info($user[$i][1] & " - Zeitüberschreitung!")
    _user_del($i)
    Elseif $temp = "" Then
    ContinueLoop
    ElseIf $temp = $SECURE Then
    _info($user[$i][1] & " - hat sich identifiziert")
    TCPSend($user[$i][0],"/Secure/1")
    $user[$i][4] = 2
    $user[$i][2] = TimerInit()
    EndIf

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

    ;NAMENSGEBUNG
    ElseIf $user[$i][4] = 2 Then
    $temp = TCPRecv($user[$i][0],50)
    if $temp = "" Then
    if TimerDiff($user[$i][2]) > 3000 Then
    _info($user[$i][1] & " - Zeitüberschreitung!")
    _user_del($i)
    EndIf
    Else
    $test = $temp
    $k = 0
    While 1
    $fehler = 0
    For $m = 0 to $MAX
    ;ConsoleWrite($i & ": " & $user[$m][3] & "=" & $test & @CRLF)
    if $user[$m][3] = $test Then
    $fehler = 1
    ExitLoop
    EndIf
    Next
    if $fehler = 1 Then
    $k += 1
    $test = $temp & "[" & $k & "]"
    Else
    ExitLoop
    EndIf
    WEnd
    _info($user[$i][1] & " - bekommt Namen: " & $test)
    ;_GUICtrlListView_AddItem($lv,$test)
    TCPSend($user[$i][0],"/name/" & $test & "}")
    $user[$i][4] = 3
    $user[$i][3] = $test
    _user_new($i)
    $temp = GUICtrlCreateListViewItem($user[$i][3],$lv)
    $USER_N[$i] = $temp
    EndIf

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

    ;PRÜFEN BIS ALLES BEARBEITET WURDE
    ElseIf $user[$i][4] = 3 Then
    $temp = TCPRecv($user[$i][0],50)
    if $temp = "" Then
    ElseIf $temp = "/bereit/" Then
    _info($user[$i][3] & " ist bereit zum Chatten")
    $user[$i][4] = 4 ; BEREIT
    EndIf

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

    ;ROUTINE ARBEIT
    ElseIf $user[$i][4] = 4 Then
    $temp = TCPRecv($user[$i][0],4096)
    if @error Then
    _info($user[$i][3] & " hat den Chat verlassen!")
    TCPCloseSocket($user[$i][0])
    $test = GUICtrlDelete($user_N[$i])
    ;MUSS NOCH NE LIS VIE AKTUALISIERUNG HIN :)
    _user_del($i)
    EndIf
    if not ($temp = "") Then
    _befehle($temp,$i)
    EndIf
    EndIf
    Next
    EndFunc

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

    Func _send_user()
    $text = GUICtrlRead($input)
    if $text = "" Then
    Else
    _info("PRIVAT-MSG to " & $select[2] & ": " & '"' & $text & '"')
    GUICtrlSetData($input,"")
    for $k = 0 to $max
    if $user[$k][3] = $select[2] Then
    TCPSend($user[$k][0],"/text/" & @CRLF & " " & $text & "}")
    Return 1
    EndIf
    Next
    EndIf
    EndFunc

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

    Func _kick_user()
    for $l = 0 to $max
    if $select[2] = $user[$l][3] Then
    TCPCloseSocket($user[$l][0])
    _user_del($l)
    GUICtrlDelete($user_N[$l])
    $user_N[$l] = ""
    _GUICtrlListView_SetSelectionMark($lv,-1)
    Return 1
    EndIf
    Next
    EndFunc

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

    func _user_del($count) ;GLOBAL
    $temp = $user[$count][3]
    for $i = 0 to 9
    $user[$count][$i] = ""
    Next
    for $n = 0 to $MAX
    if $user[$n][3] = "" Then
    Else
    TCPSend($user[$n][0],"/user_del/" & $temp & "}")
    EndIf
    Next
    EndFunc

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

    Func _user_new($count) ;Global
    $temp = $user[$count][3]
    for $n = 0 to $MAX
    if $user[$n][3] = "" Then
    Else
    TCPSend($user[$n][0],"/user_new/" & $temp & "}")
    EndIf
    Next
    EndFunc

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

    Func _new_user($temp) ;LOCAL
    for $i = 0 to $MAX
    if $USER[$i][0] = "" Then
    $user[$i][0] = $temp
    $user[$i][1] = SocketToIP($user[$i][0])
    $user[$i][2] = TimerInit()
    $user[$i][4] = 1
    _info($user[$i][1] & " versucht zu connecten!")
    Return
    EndIf
    Next
    EndFunc

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

    Func _server_start()
    GUICtrlSetState($b_start,$gui_disable)
    _info("IP: " & $IP &" (" & _GetIP() & ") - Port: " & $Port)
    TCPStartup()
    $verbindung = TCPListen($Ip,$port)
    if $verbindung = -1 Then
    _info("Fehler beim hochfahren!")
    GUICtrlSetState($b_start,$gui_enable)
    GUICtrlSetState($b_close,$gui_disable)
    Else
    GUICtrlSetBkColor($graph,0x00ff00)
    _info("Server gestartet")
    $stat = 1
    GUICtrlSetState($b_close,$gui_enable)
    EndIf
    EndFunc

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

    Func _Server_close()
    GUICtrlSetState($b_close,$gui_disable)
    TCPCloseSocket($verbindung)
    for $i = 0 to $MAX
    if $user[$i][0] = "" Then
    Else
    TCPCloseSocket($user[$i][0])
    if $user[$i][3] = "" Then
    Else
    GUICtrlDelete($user_n[$i])
    EndIf
    EndIf

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

    $user[$i][0] = ""
    $user[$i][1] = ""
    $user[$i][2] = ""
    $user[$i][3] = ""
    $user[$i][4] = ""
    $user[$i][5] = ""
    $user[$i][6] = ""
    $user[$i][7] = ""
    $user[$i][8] = ""
    $user[$i][9] = ""
    $user_n[$i] = ""
    Next
    GUICtrlSetData($label_user,"User: ")
    GUICtrlSetState($b_user_send,$gui_disable)
    GUICtrlSetState($b_user_kick,$gui_disable)
    GUICtrlSetData($label_loop,"000000 RPS")

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

    TCPShutdown()
    GUICtrlSetBkColor($graph,0xff0000)
    _info("Server herruntergefahren")
    $stat = 0
    GUICtrlSetState($b_start,$gui_enable)
    EndFunc

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

    Func _info($text)
    $time = "[" & @hour & ":" & @MIN & ":" & @SEC & "] "
    _GUICtrlEdit_AppendText($edit,@crlf & $time & " " & $text)
    _scroll_end()
    EndFunc

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

    Func _user_info($text)
    $time = "[" & @hour & ":" & @MIN & ":" & @SEC & "] "
    _GUICtrlEdit_AppendText($edit,@crlf & $time & " " & $text)
    _scroll_end()
    EndFunc

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

    ;FUNC AUS DER HILFEDATEI :D
    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] [autoit][/autoit] [autoit]

    Func _befehle($source,$wer=-1) ;(wer = von wem die anfrage kommt)
    $DATA = StringSplit($source,"}")

    for $n = 1 to $DATA[0]
    $code = "/text/"
    if StringLeft($DATA[$n],stringlen($code)) = $code Then
    _user_info("[Global - " & $user[$wer][3] & "] " & StringTrimLeft($DATA[$n],stringlen($code)))
    ;_info()
    for $i = 0 to $MAX
    if $user[$i][3] = "" Then
    Else
    ; SENDET TEXT AN ALLES USER !
    TCPSend($user[$i][0],"/text/" & @CRLF & "[Global von '" & $user[$wer][3] & "'] " & StringTrimLeft($DATA[$n],stringlen($code)) & "}")
    EndIf
    Next
    EndIf

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

    $code = "/text_privat/"
    if StringLeft($DATA[$n],stringlen($code)) = $code Then
    ;_info()
    for $i = 0 to $MAX
    if $user[$i][3] = "" Then
    Else
    ; SENDET TEXT AN PRIVAT USER !
    $temp = StringSplit(StringTrimLeft($DATA[$n],stringlen($code)),"/")
    if $temp[0] = 2 Then
    for $k = 0 to $MAX
    if $user[$k][3] = $temp[1] Then
    $target = $K
    ExitLoop
    EndIf
    Next
    TCPSend($user[$wer][0],"/text/" & @CRLF & "[Privat zu '" & $user[$target][3] & "'] " & $temp[2] & "}")
    TCPSend($user[$target][0],"/text/" & @CRLF & "[Privat von '" & $user[$wer][3] & "'] " & $temp[2] & "}")
    _user_info("[Privat - " & $user[$wer][3] & " zu " & $user[$target][3] & "] " & $temp[2])
    ;TCPSend($user[$i][0],"/text/" & @CRLF & "[Privat zu '" & $user[$target][3] & "'] " & StringTrimLeft($DATA[$n],stringlen($code)) & "}")
    ;TCPSend($user[$target][0],"/text/" & @CRLF & "[Privat von '" & $user[$wer][3] & "'] " & StringTrimLeft($DATA[$n],stringlen($code)) & "}")
    ExitLoop
    Else
    ExitLoop
    EndIf
    EndIf
    Next

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

    EndIf

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

    ;USER AKTUALISIERUNG - ALLE USER
    $code = "/GET_USER_ALL/"
    if $DATA[$n] = $code Then
    dim $anhang
    for $i = 0 to $MAX
    if $user[$i][3] = "" Then
    Else
    $anhang &= $user[$i][3] & @CRLF
    EndIf
    Next
    TCPSend($user[$wer][0],"/GET_USER_ALL/" & $anhang & "}")
    EndIf
    Next
    EndFunc

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

    Func _send_server_msg()
    $text = GUICtrlRead($input)
    if $text = "" Then
    Else
    _info("MSG: " & '"' & $text & '"')
    GUICtrlSetData($input,"")
    for $k = 0 to $max
    if $user[$k][3] = "" Then
    Else
    TCPSend($user[$k][0],"/text/" & @CRLF & " " & $text & "}")
    EndIf
    Next
    EndIf
    EndFunc

    func _scroll_end()
    _GUICtrlEdit_LineScroll($edit,0,_GUICtrlEdit_GetLineCount($edit))
    EndFunc

    [/autoit]

    QUellcode Client ( Chat programm für den Benutzer :D )

    Spoiler anzeigen
    [autoit]

    ;CLIENT

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

    #include
    #include
    #include
    #Include
    #Include
    #include
    #include
    #include
    #include

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

    $win = GUICreate("Login",500,400)
    GUISetBkColor(0x000000)

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

    $l_name = GUICtrlCreateLabel("Bitte geben Sie ihren Namen ein!",5,5,490,15)
    GUICtrlSetColor(-1,0xffffff)
    GUICtrlSetFont(-1,8,1000)
    $input_name = GUICtrlCreateInput("",5,20,490,30,$ss_center)
    GUICtrlSetFont(-1,14,1000)
    GUICtrlSetColor(-1,0x00ff00)
    GUICtrlSetBkColor(-1,0x606060)
    $b_login = GUICtrlCreateButton("Login",5,55,150,30)
    GUICtrlSetFont(-1,12,1000)
    GUICtrlSetCursor(-1,0)

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

    $lv = GUICtrlCreateListView("User online",0,0,150,375)
    _GUICtrlListView_SetColumnWidth($lv,0,140)
    GUICtrlSetBkColor($lv,0x000000)
    GUICtrlSetColor($lv,0xa0ff00)
    GUICtrlSetFont($lv,9,1000)
    $l_time = GUICtrlCreateLabel("00:00:00",150,5,350,15,$ss_center)
    GUICtrlSetColor(-1,0xffffff)
    GUICtrlSetFont(-1,10,1000)
    $edit = GUICtrlCreateEdit("© by Supercopra",150,20,350,330,$es_readonly)
    GUICtrlSetBkColor($edit,0x000000)
    GUICtrlSetColor($edit,0x00ff00)
    GUICtrlSetFont($edit,8,1000)
    $input = GUICtrlCreateInput("",150,350,350,25)
    GUICtrlSetBkColor(-1,0x202020)
    GUICtrlSetFont($input,9,1000)
    GUICtrlSetColor(-1,0x00ff00)
    $b_send = GUICtrlCreateButton("Senden (Enter)",150,375,350,25) ;----> istn running ?!?! O.o :(;$BS_DEFPUSHBUTTON)
    GUICtrlSetCursor(-1,0)
    GUICtrlSetState($b_send,$GUI_DEFBUTTON)

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

    $b_chat_art = GUICtrlCreateButton("zum Privatchat",0,375,150,25)
    GUICtrlSetBkColor($b_chat_art,0x00AAAA)
    GUICtrlSetCursor(-1,0)
    _set(2,$gui_hide)

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

    Global $IP = @IPAddress1
    Global $Port = 12345 ;test Port :D
    Global $KEY = "Venzol123!?"
    Global $VALUE = "Siegbert Schnoesel"
    Global $LEVEL = 5
    Global $SECURE = _StringEncrypt(1,$value,$key,$level)
    Global $UNAME
    Global $stat = -1
    Global $UHR
    Global $verbindung
    Global $MAX = 100
    Global $user[$MAX+1][2]
    ;Global $open[$max+1][3] ;1 = OPEN PRIVATS NAME , 2 = OPEN PRIVATS ID, 3 = Windows-Fenster
    Global $alow_ref = -1
    Global $spamschutz = -1
    Global $spamschutz_time = 1500
    Global $chat_art = 1 ; 1 = global , 2 = Privat
    Global $selection = -1

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

    GUISetState(@sw_show)
    While 1
    _SCHELIFE()
    WEnd

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

    func _SCHELIFE()
    $a = GUIGetMsg()

    Switch $a
    case -3
    Exit
    case $b_login
    _login()
    EndSwitch

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

    if $stat = 1 Then
    $temp = _GUICtrlListView_GetSelectionMark($lv)
    if $selection = $temp Then
    Else
    $na = _GUICtrlListView_GetItemText($lv,$temp)
    $selection = $temp
    if $selection = -1 Then
    if $chat_art = 2 Then
    WinSetTitle($win,"","Privatchat (niemand ausgewählt)")
    EndIf
    Else
    if $chat_art = 2 Then
    if Not ($na = $Uname) Then
    WinSetTitle($win,"","Privatchat mit "& '"' & $na & '"')
    EndIf
    EndIf
    EndIf
    EndIf


    Switch $a
    Case $b_send
    _send()
    Case $b_chat_art
    if $chat_art = 1 Then
    $chat_art = 2
    GUICtrlSetBkColor($b_chat_art,0xAAAA00)
    GUICtrlSetData($b_chat_art,"zum Globalchat")
    WinSetTitle($win,"","Privatchat mit (niemand ausgewählt)")
    $selection = -2
    GUICtrlSetState($b_send,$GUI_DEFBUTTON)
    Else
    $chat_art = 1
    $selection = -2
    GUICtrlSetBkColor($b_chat_art,0x00AAAA)
    GUICtrlSetData($b_chat_art,"zum Privatchat")
    WinSetTitle($win,"","GlobalChat")
    GUICtrlSetState($b_send,$GUI_DEFBUTTON)
    EndIf
    EndSwitch

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

    ;SENDEN
    if _IsPressed("0d") and not (WinActive($win) = 0) Then _send()

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

    ;EMPFANGEN ETC.
    _woark()

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

    ;SPAMSCHUTZ entfernen
    if not ($spamschutz = -1) And TimerDiff($spamschutz) > $spamschutz_time Then
    $spamschutz = -1
    GUICtrlSetState($input,$gui_enable)
    GUICtrlSetData($input,"")
    ControlFocus($win,"",$input)
    EndIf

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

    EndIf
    EndFunc

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

    func _woark()
    ;TIME
    if $UHR = @HOUR & ":" & @min & ":" & @SEC Then
    Else
    $UHR = @HOUR & ":" & @min & ":" & @SEC
    GUICtrlSetData($l_time,$UHR & " Uhr - " & StringLeft($Uname,25))
    EndIf

    ;EMPFANGEN
    $temp = TCPRecv($verbindung,4096)
    if @error Then
    _set(2,$gui_hide)
    _set(1,$gui_show)
    _set(-1,$gui_enable)
    $stat = -1
    For $i = 0 to $MAX
    if $user[$i][1] = "" Then
    Else
    GUICtrlDelete($user[$i][0])
    $user[$i][0] = ""
    $user[$i][1] = ""
    EndIf
    Next
    GUICtrlSetData($edit,"© by Supercopra")
    GUICtrlSetData($l_name,"Bitte geben Sie ihren Namen ein!")
    $alow_ref = -1
    MsgBox(48,"Verbindungsabbruch","Verbindung zum Server verloren!")
    EndIf

    if $temp = "" Then
    Else
    _befehl($temp)
    EndIf
    EndFunc

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

    Func _set($was,$wie = $gui_show)
    if $was = 1 Then ;LOGIN
    $chat_art = 1
    GUICtrlSetState($l_name,$wie)
    GUICtrlSetState($input_name,$wie)
    GUICtrlSetState($b_login,$wie)
    if $wie = $gui_show Then WinSetTitle($win,"","Login")
    ElseIf $was = 2 Then ;CHAT
    GUICtrlSetState($lv,$wie)
    GUICtrlSetState($l_time,$wie)
    GUICtrlSetState($edit,$wie)
    GUICtrlSetState($input,$wie)
    GUICtrlSetState($b_send,$wie)
    GUICtrlSetState($b_chat_art,$wie)
    if $wie = $gui_show Then
    $chat_art = 1
    $selection = -2
    GUICtrlSetBkColor($b_chat_art,0x00AAAA)
    GUICtrlSetData($b_chat_art,"zum Privatchat")
    WinSetTitle($win,"","GlobalChat")
    GUICtrlSetState($b_send,$GUI_DEFBUTTON)
    EndIf
    ElseIf $was = -1 Then ;LOGIN ?!?
    GUICtrlSetState($input_name,$wie)
    GUICtrlSetState($b_login,$wie)
    EndIf
    EndFunc

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

    func _login()
    _set(-1,$gui_disable)
    $name = GUICtrlRead($input_name)
    $test2 = StringSplit($name,"}")
    if StringLen($name) < 3 Then
    MsgBox(48,"Achtung","Der Name muss mindestens 3 Zeichen lang sein!")
    _set(-1,$gui_enable)
    Return
    ElseIf StringLeft($name,1) = "/" Then
    MsgBox(48,"Achtung","Ungültiger Name: '/' ist nicht erlaubt!")
    _set(-1,$gui_enable)
    Return
    ElseIf $test2[0] >= 2 Then
    MsgBox(48,"Achtung","Ungültiger Name: '}' ist nicht erlaubt!")
    _set(-1,$gui_enable)
    Return
    EndIf

    TCPStartup()
    GUICtrlSetData($l_name,"Verbinde mit dem Server...")
    $verbindung = TCPConnect($IP,$port)

    if $verbindung = -1 Then
    MsgBox(48,"Fehlgeschlagen","Das Herrstellen einer Verbindung zum Server schlug fehl!" _
    & @crlf & "Er ist vermutlich offline!")
    GUICtrlSetData($l_name,"Bitte geben Sie ihren Namen ein!")
    _set(-1,$gui_enable)
    Return
    EndIf

    ;IDENTIFIZIEREN
    TCPSend($verbindung,$SECURE)

    ;BESTÄTIGUNG DER IDENTIFIKATION ABWARTEN
    $timer = TimerInit()
    While 1
    Sleep(1)
    if TimerDiff($timer) > 3000 Then
    MsgBox(48,"Fehler","Server reagiert nicht mehr!")
    GUICtrlSetData($l_name,"Bitte geben Sie ihren Namen ein!")
    _set(-1,$gui_enable)
    Return
    Else
    $emp = TCPRecv($verbindung,50)
    if Not ($emp = "") Then
    if $emp = "/Secure/1" Then
    ExitLoop
    EndIf
    EndIf
    EndIf
    WEnd

    ;SENDE NAMEN
    TCPSend($verbindung,$name)

    ;BESTÄTIGUNG DEs NAMENS ABWARTEN
    $timer = TimerInit()
    While 1
    Sleep(1)
    if TimerDiff($timer) > 3000 Then
    MsgBox(48,"Fehler","Server reagiert nicht mehr!")
    GUICtrlSetData($l_name,"Bitte geben Sie ihren Namen ein!")
    _set(-1,$gui_enable)
    Return
    Else
    $emp = TCPRecv($verbindung,50)
    $temp = StringSplit($emp,"}")
    For $o = 1 to $temp[0]
    if StringLeft($temp[$o],6) = "/name/" Then
    $emp = StringTrimLeft($temp[$o],6)
    ExitLoop
    EndIf
    Next

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

    if Not ($emp = "") Then
    $UNAME = $emp
    WinSetTitle($win,"","GlobalChat")
    ExitLoop
    EndIf
    EndIf
    WEnd

    ;SENDE BEREITSCHAFFT
    TCPSend($verbindung,"/bereit/")

    _set(1,$gui_hide)
    _set(2,$gui_show)

    $stat = 1
    Sleep(500)
    TCPSend($verbindung,"/GET_USER_ALL/")
    return 1
    EndFunc

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

    Func _befehl($source)
    ;WENN TCP RECV, 2x TCP SEND annimmt -.-
    $DATA = StringSplit($source,"}")

    For $n = 1 to $DATA[0]
    ;GESCHRIEBENES empfangen !
    $code = "/text/"
    if StringLeft($DATA[$n],stringlen($code)) = $code Then
    _GUICtrlEdit_AppendText($edit,StringTrimLeft($DATA[$n],stringlen($code)))
    _GUICtrlEdit_LineScroll($edit,0,_GUICtrlEdit_GetLineCount($edit))
    EndIf

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

    ;SPEZIELLE CODES AB HIER:
    $code = "/GET_USER_ALL/"
    if StringLeft($DATA[$n],stringlen($code)) = $code Then
    $user2 = StringTrimLeft($DATA[$n],stringlen($code))
    $sp = StringSplit($user2,@crlf)
    ;_GUICtrlListView_DeleteAllItems($lv)
    for $i = 1 to $sp[0]
    if $sp[$i] = "" or ($sp[$i] = $uname) Then
    Else
    for $j = 0 to $MAX
    if $user[$j][1] = "" Then
    $user[$j][0] = GUICtrlCreateListViewItem($sp[$i],$lv)
    $user[$j][1] = $sp[$i]
    ExitLoop
    EndIf
    Next
    ;_GUICtrlListView_AddItem($lv,$sp[$i])
    EndIf
    Next
    $alow_ref = 1
    ContinueLoop
    EndIf

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

    ;USER_OFFLINE (del):
    $code = "/User_del/"
    if StringLeft($DATA[$n],stringlen($code)) = $code Then
    $user2 = StringTrimLeft($DATA[$n],stringlen($code))
    ;_GUICtrlListView_DeleteAllItems($lv)
    for $j = 0 to $max
    if $user[$j][1] = $user2 Then
    GUICtrlDelete($user[$j][0])
    $user[$j][0] = ""
    $user[$j][1] = ""
    ExitLoop
    EndIf
    Next
    _GUICtrlListView_SetSelectionMark($lv,-1)
    ContinueLoop
    EndIf

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

    ;USER_Online (new):
    if $alow_ref = 1 Then
    $code = "/User_new/"
    if StringLeft($DATA[$n],stringlen($code)) = $code Then
    $user2 = StringTrimLeft($DATA[$n],stringlen($code))
    ;_GUICtrlListView_DeleteAllItems($lv)
    $fehler = -1
    for $j = 0 to $max
    if $user[$j][1] = $user2 or $user2 = $uname Then
    $fehler = 1
    ExitLoop
    EndIf
    Next
    if $fehler -1 Then
    for $j = 0 to $max
    if $user[$j][1] = "" Then
    $user[$j][0] = GUICtrlCreateListViewItem($user2,$lv)
    $user[$j][1] = $user2
    ExitLoop
    EndIf
    Next
    EndIf
    ContinueLoop
    EndIf
    EndIf
    Next

    EndFunc

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

    Func _send()
    if $spamschutz = -1 Then
    $text = GUICtrlRead($input)
    $sec = StringSplit($text,"}")
    if $sec[0] >= 2 Then
    MsgBox(48,"Ungültiger Text","Achtung!" & @crlf & @crlf & "Ungültige Zeichen sind im Text, den sie versenden wollen, enthalten." & @crlf & _
    "Das Zeichen: " & '"' & "}" & '"' & " ist für den fließenden Programmverlauf vorbehalten!")
    Return
    EndIf

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

    if $text = "" Then
    Else

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

    GUICtrlSetData($input,"Spamschutz: " & $spamschutz_time/1000 & " Sekunden!")
    GUICtrlSetState($input,$gui_disable)
    $spamschutz = TimerInit()

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

    if $chat_art = 1 Then
    $inhalt = "/text/" & $text & "}"
    TCPSend($verbindung,$inhalt)
    Else
    $temp = _GUICtrlListView_GetSelectionMark($lv)
    if $temp = -1 Then
    MsgBox(48,"Hinweis","Wenn Sie einem User privat schreiben wollen," & @crlf _
    & "müssen Sie einen (in der linken Liste) anklicken!")
    Return -1
    Else
    $temp2 = _GUICtrlListView_GetItemText($lv,$temp)
    if $temp2 = $uname Then
    MsgBox(48,"-.-","Sie haben sich selbst angewählt," & _
    @crlf & "Sie würden sich selbst schreiben. :P")
    Else
    $inhalt = "/text_privat/" & $temp2 & "/" & $text & "}"
    TCPSend($verbindung,$inhalt)
    EndIf
    EndIf
    EndIf

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

    EndIf
    EndIf
    EndFunc

    [/autoit]

    Server muss nicht vor dem CLienten gestartet werden ABER, wenn er nicht an ist kann man natürlich nicht "connecten" xD


    Warum ich den Post hier mache:
    1. Verbesserungsvorschläge, Kritik, FLames xD, etx evntl Lob...
    2. Ist die Schleife ( in _work() ) effizent ? oder kann man das beschleunigen? bzw ist es schlimm wenn der Durchlauf der Schleife mal ne Sekunde dauert ? wenn zb 100 User angemeldet sind ?
    3. Langeweile... xD ist klar... :D

    die "compiled" Programme:
    Server:

    Server.exe
    Client:
    CLient.exe

    mfG...

  • Hey,
    zu erstmal das ist das genau das,was ich gesucht habe :)

    Jedoch hab ich eine Frage..: Ich habe jetzt den Port geöffnet und alles in der .au3 angepasst.Jedoch kann mein Kollege nicht zum Server connecten.Es kommt immer Zeitüberschreitung...halt die Msgbox.

    Wie kann ich das ändern,dass er zu meiner IP Addresse connecten kann.(nicht NetzwerkIP)

    Danke

  • na ja öm, kp hast du all das beachtet ?:

    AUf dem Server mit dieser Gateway?!-IP arbeiten.. kp wie die jetzt hies, oder NEtzwerk IP, zumindeste diese, welche von der Makro: "IpAdress1" ausgegeben wird.
    z.b.: 192.153.232.123 <( random erzeugt, kp wem die gehört )

    AUf dem CLienten allerdings arbeitest du mit der Computer Ip des Server.
    z.b.: 90.34.242.232 <( random erzeugt, kp wem die gehört )

    BEachten solltest du außerdem dass die erste Ip adresse da, pro Router-reebot geändert wird, gibts aber auch möglichkeiten welche auch in einem guten Tut hier im FOrum iwo zusammengefsst wurden...

  • Hallo Supercopra

    könntest du wenn du Scripte postest diese mit den includes Posten.

    DANKE

    ;CLIENT

    #include
    #include
    #include
    #Include
    #Include
    #include
    #include
    #include
    #include


    ;SERVER

    #include
    #include
    #include
    #Include
    #Include
    #include
    #include

    gruss

    Baldrian

    :rock: :rock:

    Solange
    du den anderen sein Anderssein nicht verzeihen kannst, bist du noch weit ab vom
    Wege der Weisheit.

  • Server Includes müssten sein:

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

    #include <Array.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <GuiListView.au3>
    #include <Inet.au3>
    #include <String.au3>

    [/autoit]

    Client Includes müssten sein

    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <GuiListView.au3>
    #include <Misc.au3>
    #include <StaticConstants.au3>
    #include <String.au3>

    [/autoit]

    Gruß Marvin

  • jo, sry wegen den includes, habe nicht drauf geachtet, mein Opera Browser ignoriert diese Zeilen -.-
    Danke @Protex