Fast fertiger UDP Multiclient Chat

  • Hey Leute ich hab man nen UDP-chat geschrieben.
    hab leider keine 2 pcs darum kann ich nicht fertigschreiben. :(
    brauche nämlich 2 ips
    immoment noch über 2 ports geregelt
    wer lust hat, da mal ein paar variablen zuvertauschen ;)

    ich würds selber tun kanns aber nicht testen
    hier die scripte:

    Spoiler anzeigen

    Server:

    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <arraymore.au3>

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

    ;### Einstellungen ###
    $Ip = "127.0.0.1"
    $port = 80

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

    ;### Einleitung ###
    ConsoleWrite("Multichat Copyright 2011 Buphx" & @CRLF & @CRLF)
    ConsoleWrite("Einstellungen:" & @CRLF _
    & "Ip: " & $Ip & @CRLF _
    & "Port: " & $port & @CRLF)
    HotKeySet("{esc}", "end")
    UDPStartup()
    $bind = UDPBind($Ip, $port) ;socket erstellen
    Global $empf, $online

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

    While 1
    While $empf = ""
    $empf = UDPRecv($bind, 2048)
    WEnd
    If StringInStr($empf, "Offline||") Then
    _setOffline(StringReplace($empf, "Offline||", ""))
    $empf = ""
    ElseIf StringInStr($empf, "Online||") Then
    _setOnline(StringReplace($empf, "Online||", ""))
    $empf = ""
    ElseIf StringInStr($empf, "Refresh||") Then
    _ONsendlist(StringReplace($empf, "Refresh||", ""))
    $empf = ""
    Else
    $aEmpf = StringSplit($empf, "|")
    $empf = ""
    _ArrayDelete($aEmpf, 0)
    ConsoleWrite($aEmpf[0] & " --> " & $aEmpf[1] & ": " & $aEmpf[3] & @CRLF)
    $send = UDPOpen("127.0.0.1", $aEmpf[2])
    UDPSend($send, $aEmpf[0] & ": " & $aEmpf[3])
    UDPCloseSocket($send)
    EndIf
    WEnd

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

    Func end()
    Exit
    EndFunc ;==>end

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

    Func _setOffline($Ip)
    ConsoleWrite($Ip & " --> Offline" & @CRLF)
    StringReplace($online, $Ip & "|", "")
    EndFunc ;==>_setOffline

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

    Func _setOnline($Ip)
    ConsoleWrite($Ip & " --> Online" & @CRLF)
    $online &= $Ip & "|"
    EndFunc ;==>_setOnline

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

    Func _ONsendlist($IPuPORT)
    $aIPuPORT=StringSplit($IPuPORT,":")
    ConsoleWrite($aIPuPORT[1] & ': "Refresh"' & @CRLF)
    $sendlist = UDPOpen($aIPuPORT[1], $aIPuPORT[2])
    UDPSend($sendlist, "Refresh||" & $online)
    UDPCloseSocket($sendlist)
    EndFunc ;==>_ONsendlist

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    Spoiler anzeigen

    client1

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    OnAutoItExitRegister("exitfunc")

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

    ;### Gui ###
    $Form1 = GUICreate("client1", 621, 444, 190, 161)
    $Msgs = GUICtrlCreateEdit("", 16, 8, 433, 345,$ES_READONLY)
    $Senden = GUICtrlCreateButton("Senden", 464, 368, 145, 65)
    $Text = GUICtrlCreateEdit("", 16, 368, 433, 65, $ES_MULTILINE)
    $List1 = GUICtrlCreateList("", 464, 8, 145, 310)
    GUICtrlSetLimit($List1, 1000)
    $Refresh = GUICtrlCreateButton("Refresh", 464, 320, 145, 30)
    GUISetState(@SW_SHOW)

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

    ;### einstellungen ###
    Global $serverport = 80, $serverip = "127.0.0.1", $myip = "127.0.0.1", $dsip = "127.0.0.1", $dsport = 82, $myport = 81

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

    UDPStartup()
    _online() ; Beim Server anmelden und die Onlineliste abfragen

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Senden ;Button "senden"
    _Send($serverip, $serverport, $myip, $dsip, $dsport, GUICtrlRead($Text))
    GUICtrlSetData($Text, "")
    Case $Refresh
    _NeedRefresh()
    EndSwitch
    $empf = ""
    $empf = UDPRecv($bind, 2048)
    If StringInStr($empf, "Refresh||") Then
    _refreshlist(StringReplace($empf, "Refresh||", ""))
    ElseIf $empf <> "" Then
    GUICtrlSetData($Msgs, GUICtrlRead($Msgs) & @CRLF & @HOUR&":"&@MIN&":"&@SEC&" "& $empf)
    EndIf
    WEnd

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

    Func _send($servip, $servport, $ip, $dsip, $dsport, $Text = "testmail")
    $open = UDPOpen($servip, $servport)
    $status = UDPSend($open, $dsip & "|" & $ip & "|" & $dsport & "|" & $Text)
    UDPCloseSocket($open)
    ConsoleWrite($status)
    EndFunc ;==>_send

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

    Func exitfunc()
    $offline = UDPOpen($serverip, $serverport)
    UDPSend($offline, "Offline||127.0.0.1")
    UDPCloseSocket($bind)
    UDPCloseSocket($offline)
    UDPShutdown()
    EndFunc ;==>exitfunc

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

    Func _refreshlist($ips)
    $ips = StringSplit($ips, "|")
    GUICtrlSetData($List1, "")
    For $i = 1 To $ips[0] - 1
    GUICtrlSetData($List1, $ips[$i] & "|")
    Next
    EndFunc ;==>_refreshlist

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

    Func _NeedRefresh()
    $Need = UDPOpen($serverip, $serverport)
    UDPSend($Need, "Refresh||127.0.0.1:" & $myport)
    UDPCloseSocket($Need)
    ConsoleWrite("refresh")
    EndFunc ;==>_NeedRefresh

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

    Func _online()
    Global $bind = UDPBind("127.0.0.1", $myport)
    $online = UDPOpen($serverip, $serverport)
    UDPSend($online, "Online||127.0.0.1")
    _NeedRefresh()
    EndFunc ;==>_online

    [/autoit]
    Spoiler anzeigen

    Client2

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    OnAutoItExitRegister("exitfunc")

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

    ;### Gui ###
    $Form1 = GUICreate("client1", 621, 444, 190, 161)
    $Msgs = GUICtrlCreateEdit("", 16, 8, 433, 345,$ES_READONLY)
    $Senden = GUICtrlCreateButton("Senden", 464, 368, 145, 65)
    $Text = GUICtrlCreateEdit("", 16, 368, 433, 65, $ES_MULTILINE)
    $List1 = GUICtrlCreateList("", 464, 8, 145, 310)
    GUICtrlSetLimit($List1, 1000)
    $Refresh = GUICtrlCreateButton("Refresh", 464, 320, 145, 30)
    GUISetState(@SW_SHOW)

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

    ;### einstellungen ###
    Global $serverport = 80, $serverip = "127.0.0.1", $myip = "127.0.0.1", $dsip = "127.0.0.1", $dsport = 81, $myport = 82

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

    UDPStartup()
    _online() ; Beim Server anmelden und die Onlineliste abfragen

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Senden ;Button "senden"
    _Send($serverip, $serverport, $myip, $dsip, $dsport, GUICtrlRead($Text))
    GUICtrlSetData($Text, "")
    Case $Refresh
    _NeedRefresh()
    EndSwitch
    $empf = ""
    $empf = UDPRecv($bind, 2048)
    If StringInStr($empf, "Refresh||") Then
    _refreshlist(StringReplace($empf, "Refresh||", ""))
    ElseIf $empf <> "" Then
    GUICtrlSetData($Msgs, GUICtrlRead($Msgs) & @CRLF & @HOUR&":"&@MIN&":"&@SEC&" "& $empf)
    EndIf
    WEnd

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

    Func _send($servip, $servport, $ip, $dsip, $dsport, $Text = "testmail")
    $open = UDPOpen($servip, $servport)
    $status = UDPSend($open, $dsip & "|" & $ip & "|" & $dsport & "|" & $Text)
    UDPCloseSocket($open)
    ConsoleWrite($status)
    EndFunc ;==>_send

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

    Func exitfunc()
    $offline = UDPOpen($serverip, $serverport)
    UDPSend($offline, "Offline||127.0.0.1")
    UDPCloseSocket($bind)
    UDPCloseSocket($offline)
    UDPShutdown()
    EndFunc ;==>exitfunc

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

    Func _refreshlist($ips)
    $ips = StringSplit($ips, "|")
    GUICtrlSetData($List1, "")
    For $i = 1 To $ips[0] - 1
    GUICtrlSetData($List1, $ips[$i] & "|")
    Next
    EndFunc ;==>_refreshlist

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

    Func _NeedRefresh()
    $Need = UDPOpen($serverip, $serverport)
    UDPSend($Need, "Refresh||127.0.0.1:" & $myport)
    UDPCloseSocket($Need)
    ConsoleWrite("refresh")
    EndFunc ;==>_NeedRefresh

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

    Func _online()
    Global $bind = UDPBind("127.0.0.1", $myport)
    $online = UDPOpen($serverip, $serverport)
    UDPSend($online, "Online||127.0.0.1")
    _NeedRefresh()
    EndFunc ;==>_online

    [/autoit]

    (der unterschied Client 1&2 sind die ports in reihe 20) ;)

    mfg

    Buphx :D

  • 3 tage wäre schlimm 30 tage kann man aber auch legal um 90 erweitern wenn wir von win7 reden download findeste sogar in netz legal von win7 zwar ohne sp1 aber zum testen brauch man das ja nicht

    Gruss

  • Oha. Dann hoffe das du deine Windows DVD nicht verbummelst :) Ich steh vor ein ähnlich Problem meins ist aber übler ich müsste zum Testen ein Active Directory Server installieren den gibs leider nicht als Testversion :)

    Gruss DevFly