Netzwerk-Chat ohne Server

  • Hi,

    ich möchte einen Netzwerk-Chat ohne Server schreiben. D.h. es müssten alle Eingaben an alle Chat-Programme geschickt werden oder wer den Chat als 1. startet fungiert als Server. Das hat allerdings den Nachteil wenn dieser den Chat verlässt bricht der Chat zusammen da der Server fehlt. Die erste Methode wäre dadurch am besten ist aber wahrscheinlich ziemlich langsam da er ja alles öfter schicken muss.

    Einen Server will ich deshalb nicht da dieser von jemanden gestartet werden müsste. Wenn der jemand nun nicht da ist können die anderen mit dem Ofenrohr ins Gebirge schaun. Die Lösung ware hierfür den Server an meherer Leute zu verteilen. Dadurch würden aber mehrere den Chat-Server starten da man sich ja nicht absprechen kann. Aus diesem Grund habe ich beschlossen das ganze ohne Server zu machen.

    Hat wer eine Idee zur realisierung des ganzen?

    GUI und n paar Testübertragungen sind schon fertig:

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=MoN_icon.ico
    #AutoIt3Wrapper_Res_Description=by Michi26206
    #AutoIt3Wrapper_Res_Fileversion=1.0
    #AutoIt3Wrapper_Res_LegalCopyright=by Newinto-Projekt
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #cs --------------------------------------------------------------------------------------------------------

    MoN.exe (C) by Michi26206 - Programm zum Chatten inerhalb des Netzwerkes

    #ce --------------------------------------------------------------------------------------------------------

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

    #include <ButtonConstants.au3>
    #include <Date.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <ListBoxConstants.au3>
    #include <WindowsConstants.au3>

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

    ;Variablen anfang
    Global $titel = "MoN", $version = "1.0", $Zeilen_Quellecode = "115", $Maindialog, $Chat_Box, $User_Box, $Nachricht_Input, $Senden, $Hilfe, $StatusBar, $Hilfe_Gui, $Hilfe_Button, $Hilfe_Link
    ;ab hier Chat variablen
    Global $Botname = "Ivan", $Username, $Nachricht, $Nachricht_an[3]
    ;ab hier Netzwerkvariablen
    Global $Sende_Socket, $Ip = "5.80.80.50", $Port = 606
    ;Variablen ende

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

    Username()

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

    HotKeySet("!{v}", "GUI_verstecken")
    HotKeySet("!{w}", "GUI_zeigen")
    HotKeySet("!{c}", "Close")
    MsgBox(64, $titel, "Drücke Alt+V um das Chatfenster zu verstecken" & @CRLF & "Drücke Alt+W um das Chatfenster wiederherzustellen" & @CRLF & "Drücke Alt+B um den Chat sofort zu beenden")
    HotKeySet("{ENTER}", "Senden")
    TCPStartup()
    ;--------------------------------------------------------
    ;--------------- Anfang GUI Maindialog ------------------
    ;--------------------------------------------------------
    $Maindialog = GUICreate($titel, 600, 420, -1, -1)
    GUISetBkColor(0xF5A53D)
    $Chat_Box = GUICtrlCreateEdit("", 20, 20, 400, 295, BitOR($WS_VSCROLL, $WS_HSCROLL, $ES_READONLY))
    GUICtrlSetBkColor($Chat_Box, 0xFFFFFF)
    GUICtrlCreateLabel("Nachricht an:", 450, 20, 90)
    GUICtrlSetBkColor(-1, 0xF5A53D)
    GUICtrlSetFont(-1, 10, 250, 0, "Comic Sans MS")
    $User_Box = GUICtrlCreateList("", 450, 45, 120, 270, 0)
    $Nachricht_an[1] = GUICtrlSetData($User_Box, "Alle")
    $Nachricht_an[2] = GUICtrlSetData($User_Box, "Ivan")
    $Nachricht_Input = GUICtrlCreateInput("", 20, 325, 550, 20)
    GUICtrlSetState ($Nachricht_Input, $GUI_FOCUS)
    $Senden = GUICtrlCreateButton("Senden", 336, 360, 180, 30, 0)
    $Hilfe = GUICtrlCreateButton("Hilfe", 57, 360, 180, 30, 0)
    $StatusBar = _GUICtrlStatusBar_Create($Maindialog)
    Dim $StatusBar_PartsWidth[1] = [150]
    _GUICtrlStatusBar_SetParts($StatusBar, $StatusBar_PartsWidth)
    _GUICtrlStatusBar_SetText($StatusBar, "Uhrzeit: " & _NowTime(5), 0)
    _GUICtrlStatusBar_SetMinHeight($StatusBar, 20)
    GUISetState(@SW_SHOW, $Maindialog)
    ;--------------------------------------------------------
    ;----------------- Ende GUI Maindialog ------------------
    ;--------------------------------------------------------

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

    $Sende_Socket = TCPConnect($Ip, $Port)
    If @error Then
    GUICtrlSetData($Chat_Box, " " & $Botname & ": Ich kann keinen Socket erzeugen. Ist der Computer mit einem Netzwerkverbunden?")

    EndIf

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

    ;--------------------------------------------------------
    ;-------------- Anfang GUI Hilfe_gui ----------------
    ;--------------------------------------------------------
    $Hilfe_Gui = GUICreate("Sie haben das Hilfe gefunden!", 350, 120, -1, -1)
    GUISetBkColor(0xFFFFFF)
    GUICtrlCreateLabel("Ein Programm von Newinto-Projekt:", 10, 10)
    $Hilfe_Link = GUICtrlCreateLabel("http://www.newinto-projekt.de.be", 180, 10)
    GUICtrlSetColor($Hilfe_Link, 0x0000EE)
    GUICtrlCreateLabel($titel & " v. " & $version, 100, 35, 200)
    GUICtrlSetFont(-1, 10, 250, 0, "Comic Sans MS")
    GUICtrlSetColor(-1, 0xff0000)
    GUICtrlCreateLabel("Autor: Michi26206" & @CRLF & $Zeilen_Quellecode & " Zeilen Quellcod", 100, 50)
    $Hilfe_Button = GUICtrlCreateButton("Schließen", 150, 90)
    ;--------------------------------------------------------
    ;---------------- Ende GUI Hilfe_gui ----------------
    ;--------------------------------------------------------
    AdlibEnable("Uhr", 1000)

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

    TCPSend($Sende_Socket, " >>" & $Username & " betritt den Chat"); & @CRLF & GUICtrlRead($Chat_Box))
    Sleep(10)
    TCPSend($Sende_Socket, " " & $Botname & ": Willkommen im Chat"); & @CRLF & GUICtrlRead($Chat_Box))
    If @error Then
    GUICtrlSetData($Chat_Box, GUICtrlRead($Chat_Box) & @CRLF &" " & $Botname & ": Ich kann die Nachricht nicht versenden.")
    Else
    GUICtrlSetData($Chat_Box, " " & $Botname & ": Willkommen im Chat")
    EndIf

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Close()
    Case $Hilfe
    WinSetTrans($Hilfe_Gui, "", 0)
    GUISetState(@SW_SHOW, $Hilfe_Gui)
    For $i = 5 To 255 Step +10
    WinSetTrans($Hilfe_Gui, "", $i)
    Sleep(20)
    Next
    Case $Hilfe_Button
    WinSetTrans($Hilfe_Gui, "", 255)
    For $i = 250 To 0 Step -10
    WinSetTrans($Hilfe_Gui, "", $i)
    Sleep(20)
    Next
    GUISetState(@SW_HIDE, $Hilfe_Gui)
    Case $Hilfe_Link
    Run("http://www.newinto-projekt.de.be")
    Case $Senden
    Senden()
    EndSwitch
    Sleep(20)
    WEnd

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

    Func Uhr()
    _GUICtrlStatusBar_SetText($StatusBar, "Uhrzeit: " & _NowTime(5), 0)
    EndFunc ;==>Uhr

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

    Func Username()
    Local $iMsgBoxAnswer
    $Username = InputBox( "Willkomen beim Chat", "Bitte gib deinen gewünschten Nicknamen ein: ", "", "", 250, 125)
    If $Username = "" Then
    $iMsgBoxAnswer = MsgBox(4117,"Fehler","Du musst einen Nicknamen angeben!")
    Select
    Case $iMsgBoxAnswer = 4 ;Wiederholen
    Username()
    Case $iMsgBoxAnswer = 2 ;Abbrechen
    Exit
    EndSelect
    EndIf
    EndFunc ;==>Username

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

    Func Senden()
    $Nachricht = GUICtrlRead($Nachricht_Input)
    If $Nachricht = "" Or $Nachricht = " " Then
    MsgBox(64, "Fehler", "Es kann keine leere Nachricht versendet werden!")
    Else
    TCPSend($Sende_Socket, $Username & ": " & $Nachricht); & @CRLF & GUICtrlRead($Chat_Box))
    If @error Then
    GUICtrlSetData($Chat_Box, GUICtrlRead($Chat_Box) & @CRLF &" " & $Botname & ": Ich kann die Nachricht nicht versenden.")
    Else
    GUICtrlSetData($Chat_Box, GUICtrlRead($Chat_Box) & @CRLF &$Username & ": " & $Nachricht)
    EndIf
    ;GUICtrlSetData($Chat_Box, $Username & ": " & $Nachricht & @CRLF & GUICtrlRead($Chat_Box))
    EndIf
    GUICtrlSetData($Nachricht_Input, "")
    GUICtrlSetState ($Nachricht_Input, $GUI_FOCUS)
    EndFunc ;==>Senden

    Func GUI_zeigen()
    GUISetState(@SW_SHOW, $Maindialog)
    GUISetState(@SW_HIDE, $Hilfe_Gui)
    EndFunc ;==>GUI_zeigen

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

    Func GUI_verstecken()
    GUISetState(@SW_HIDE, $Maindialog)
    GUISetState(@SW_HIDE, $Hilfe_Gui)
    EndFunc ;==>GUI_verstecken
    Func Close()
    HotKeySet("{ENTER}")
    HotKeySet("!{v}")
    HotKeySet("!{w}")
    HotKeySet("!{c}")
    TCPShutdown()
    Exit
    EndFunc ;==>Close

    [/autoit]


    Gruß Michi26206

    PS: Das ganze ist für die Berufsschule (Ja und ich weiß auch das so etwas nicht sogerne in Schulen gesehen wird xD, aber ich schrieb ihn ja nur ;) )
    PSS: Ich hätte nen gekürzten C Windows Code von so nem Chat vom Bruder eines ehemaligen Klassen Kamerads. Soll ich den Posten? Muss aber erst noch fragen ;).Ist aber ziemlich gekürzt ich hab kaum was damit anfangen können. Aber evtl. bekomm ihr es ja hin.

  • du kannst au3 TCP leider nicht ohne server nutzen, es sei denn du lässt jeden mit dem du chatten willst über einen anderen port laufen, sehr unschicke lösung

    bastel dir doch einfach dein chat programm auf einem fixen port,
    und überprüfe beim start ob es bereits einen server gibt , falls nicht wird statt der "client()" einfach die "server()" funktion gestartet
    dafür müsstest du in deinem netz allerdings eine liste der rechner ip's erstellen welche dann abgearbeitet wird

    sollte nicht all zu schwer sein :)

  • hi,

    Theoretisch müsste das möglich sein. Setz dich mal mit p2p auseinander.

    Wird aber sicher nicht leicht;)

    grez

  • Hi,

    ja dann schau ich mal ich meld mich dann ma wieder. THX @ all.

    du kannst au3 TCP leider nicht ohne server nutzen, es sei denn du lässt jeden mit dem du chatten willst über einen anderen port laufen, sehr unschicke lösung

    bastel dir doch einfach dein chat programm auf einem fixen port,
    und überprüfe beim start ob es bereits einen server gibt , falls nicht wird statt der "client()" einfach die "server()" funktion gestartet
    dafür müsstest du in deinem netz allerdings eine liste der rechner ip's erstellen welche dann abgearbeitet wird

    sollte nicht all zu schwer sein :)

    Ja das hab ich mir auch scho gedacht ich denke es dauert aber ziemlich lange bis er die Liste durch hat. Gehen würde das ganze whrscheinlich über eine For schleife.

    Michi26206

    PS: Schönen Feiertag morgen

    2 Mal editiert, zuletzt von Michi26206 (5. Januar 2009 um 21:32)