Gegenseitige TCP Verbindung

  • HI Leute,

    ich habe folgendes Problem.Ich bin ja gerade dabei ein Script zu schreiben für meinen eigenen Client, mit dem sich andere meinen Status anschauen/abfragen können.
    Habe eben 2 Versionen geschrieben, eine für die Anwender (client) und eine für mich (Server)

    Nun habe ich es geschafft, dass wenn die Anwender auf einen Button "Status" klicken , dieser sich zu meinem Server verbindet, das Wort "Statusanfrage" sendet und sich somit versucht den Status zu holen.Mein Server überprüft dann den String auf "Statusanfrage" bzw. auf den binärenwert "13" .

    Nun soll sich aber der Server auch mit dem Client verbinden und einen String zurückgeben/senden, bspw. "online". Wie schaffe ich das nun das beide miteinander richtig kommunizieren können.

    Anmerkung: Die Funktion des Servers läuft in einer Endlosschleife (was sich ja dann auch ändern muss,weil der ja nicht unendlich senden kann oder?).
    Die Funktion des Clients wird nur bei drücken eines Buttons aktiv)

    Server (der zurzeit nur empfangen kann):

    [autoit]


    ; Quelltext
    TCPStartup()
    Global $mainsocket = TCPListen("127.0.0.1", 8001)
    ; Quelltext
    Func Status()

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

    $acceptedSocket = TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen

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

    If $acceptedSocket <> -1 Then ; Wenn $acceptedSocket ungleich -1 ist, ...
    $receivedData = TCPRecv($acceptedSocket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
    If $receivedData = "Statusanfrage" or "13" Then
    MsgBox(1,"Server", "Anfrage erhalten " & $receivedData)
    EndIf
    EndIf
    EndFunc

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

    Client(der zurzeit nur senden kann):

    [autoit]


    Func Status()
    TCPStartup()

    $mainsocket = TCPListen("127.0.0.1", 8001) ; Den mainsocket erstelle
    $socket = TCPConnect("127.0.0.1", 8001) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socket" ab

    If $socket = -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
    MsgBox(16, "Client: Error", "Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
    EndIf

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

    $sendedBytes = TCPSend($socket,"Statusanfrage") ; Sendet den Text an unseren verbundenen Socket

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

    If $sendedBytes = 0 Then ; Wenn der Rückgabewert von TCPSend(...) 0 ist, Fehlermeldung ausgeben
    MsgBox(16, "Client: Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
    EndIf

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


    TCPCloseSocket($socket)
    TCPShutdown()

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

    EndFunc

    [/autoit]


    Danke schoneinmal im vorraus und ich hoffe das ihr mir helfen könnt.

    Einmal editiert, zuletzt von BigDaddy (20. Juli 2011 um 08:34)

  • Hab zwar in AutoIt noch nie großartig etwas mit Server/Client gemacht aber soweit ich weiß kannst du im server nachdem du eine Socketverbindung hast einfach mit

    [autoit]

    TCPSend($acceptedSocket,"data")

    [/autoit]


    eine Antwort senden. Diese musst du dann am Client einfach mit

    [autoit]

    TCPRecv($socket,1024)

    [/autoit]

    wieder empfangen.

    Btw: auf "13" zu prüfen ist nicht so intelligent denn falls du irgendwann noch andere Keywords hast und davon zufällig auch eins 13 Zeichen lang ist kommts zu Problemen.

    2 Mal editiert, zuletzt von Milla (13. Juli 2011 um 01:10)

  • Danke für die Antwort,

    deine Idee hatte ich auch schon, jedoch war ich nicht ind er Lage es funktionsfähig in das Script zu integrieren.
    Wäre es möglich, dies für mich zu tun und dann zu posten ?
    Danke

  • ich schreib das mal eben um, stand by

    Server:

    Spoiler anzeigen
    [autoit]

    ; Quelltext
    TCPStartup()
    Global $mainsocket = TCPListen("127.0.0.1", 8001)
    status() ;Die funktion muss aufgerufen werden
    ; Quelltext
    Func Status()
    While 1 ;Server muss immer darauf warten, deshalb endlosschleife. Er sendet nur eine antwort, wenn er statusanfrage empfängt

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

    $acceptedSocket = TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen

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

    If $acceptedSocket <> -1 Then ; Wenn $acceptedSocket ungleich -1 ist, ...
    $receivedData = TCPRecv($acceptedSocket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
    If $receivedData = "Statusanfrage" Then
    MsgBox(1,"Server", "Anfrage erhalten " & $receivedData)
    $sendedbytes=TCPSend($acceptedsocket,"online")
    If $sendedBytes = 0 Then ; Wenn der Rückgabewert von TCPSend(...) 0 ist, Fehlermeldung ausgeben
    MsgBox(16, "Server: Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
    EndIf
    EndIf
    EndIf
    WEnd
    EndFunc

    [/autoit]

    Client:

    Spoiler anzeigen
    [autoit]


    status()
    Func Status()
    TCPStartup()

    $socket = TCPConnect("127.0.0.1", 8001) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socket" ab

    If $socket = -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
    MsgBox(16, "Client: Error", "Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
    EndIf

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

    $sendedBytes = TCPSend($socket,"Statusanfrage") ; Sendet den Text an unseren verbundenen Socket

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

    If $sendedBytes = 0 Then ; Wenn der Rückgabewert von TCPSend(...) 0 ist, Fehlermeldung ausgeben
    MsgBox(16, "Client: Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
    EndIf
    Do
    $receivedData=TCPRecv($socket,1024) ;Wartet in einer schleife darauf, das der Server eine Antwort sended
    Until $receivedData<>""
    MsgBox(0,"Status empfangen","Der Server ist " & $receivedData);Wenn die Antwort da ist, wird eine MsgBox ausgegeben

    TCPCloseSocket($socket)
    TCPShutdown()

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

    EndFunc

    [/autoit]


    btw, der Client muss keinen mainsocket erstellen

    Einmal editiert, zuletzt von Sundown (13. Juli 2011 um 09:18)

  • Morgen,

    also das Script von Sundown sollte soweit laufen aber soweit ich das sehe möchtest du einen TCP IP Chatroom basteln der übers Netzwerk bzw WWW auf lauffähig ist oder nicht?

    ich habe erst vor kurzem einen gebastelt der läuft auch gut ich würde sagen wenn es dich interessiert hänge ich den einfach mal komplett an, hatte mich auch einfach erstmal in die Codes anderer eingelesen um die TCP IP Funktionen richtig zu verstehen sowie auch die passende Syntax dazu.. die ist nämlich manchmal etwas tricky sobald man mehrere Dinge ineinander verschachtelt.

    also viel Spaß damit :)
    Gruß Marvin

  • Vielen Dank für eure Hilfe,

    ich werde mich mal eben durch alles durcharbeiteb und dann bescheid geben wie weit ich bin ;) .

    Edit 1:

    So ich habe mal Sundown´s Idee ausprobiert und es fubnktioniert wirklich gut.Danke.
    Aber wie sieht es den aus mit der mehrfachen Benutzung? Also den Client werden ja viele Leute bekommen, somit werden die sich ja alle mit mir unter einer anderen IP
    connecten. Schafft der Server das den dann auch noch jeden die richtige Nacchricht zu verschicken ? oder muss man da nen Array o.ä. erstellen der alle IPs abspeichert
    und dann abarbeiten ?

    Danke nochmals.

    2 Mal editiert, zuletzt von BigDaddy (13. Juli 2011 um 15:01)

  • So wie es jetzt ist, kann man da auch mehrfach anfragen, allerdings geht das nur solange, wie man auch nur eine einzige nachricht, nämlich online, sendet, wenns mehr sein soll, muss man tatsächlich mit arrays arbeiten. Ich arbeite momentan selber an einem TCP/IP chat, also bin schon fertig, und baue jetzt noch diverse features ein. Wenn du sowas mal machen willst, meld dich mal bei mir, dann kann ich dir alles schritt für schritt erklären

  • Hmmm... also doch nen Array.
    Es geht mir ja nur um die mehrfache Verbindung,sprich : Das sich ganze viele Leute mit mir Verbinden werden um den Status abzufragen.Natürlich wird die verbindung bei den Clients auch nach der Anfrage geschlossen, sollte das nicht dan auch ohne Array klappen?

    Falls nicht, wäre es möglich , wieder direkt das Array bzw. due Funktion in das Script einzuarbeiten und hier zu Posten ?

    Danke

  • Morgen,

    mit einem Array zu arbeiten ist einfach die Optimalste Lösung du kannst auch ewig viele variablen erstellen usw aber das ist einfach rein logisch totaler Käse xD
    ich hatte ja mein Script gepostet, in diesem arbeite ich auch mit Arrays ist einfach die Beste Lösung.
    Am besten solltest du einfach dir überlegen was der Chat können muss und dann Stück für Stück drauf los.. und solltest du Probleme haben sind hier in der Communitydoch ausreichend User die dir weiterhelfen können ;)

    Gruß Marvin

  • Jo es geht einfach nicht anders weil du eine unbestimmte Anzahl an Clients hast.
    Und die Verbindungsdaten musst du irgendwo speichern
    Deswegen gibts da egtl keine andere sinnvolle Möglichkeit außer Array's

  • So nun habe ich mal eine Prototypen fertig.

    Über localhost und Internet funktioniert alles super.

    Vielen Dank euch allen bei eure intensiven Hilfe.

    (Kann auf gelöst umgestellt werden)

    2 Mal editiert, zuletzt von BigDaddy (18. Juli 2011 um 09:52)