Client Server abfrage

  • Schönen guten Abend,

    vor ein paar Tagen habe ich mich mal beschäftigt, wie das ganze funktioniert mit Client Server (Tcp) connection. Ich habe es soweit geschafft bzw einigermaßen verstanden, wie ich vom Client (der auf mein PC ist) eine befehl zum Server (der auf meinen Root liegt) zu senden. Jetzt ist meine Frage, wie mache ich es das der Server mir eine Antwort gibt (z.b anhand einer Text message) also Server gibt ein Befehl zum Client zurück?

    Mein Script sieht folgendermaßen aus:

    Client

    [autoit]

    Func _sendPacket($text)
    TCPStartup()
    $socket = TCPConnect("94.23.xxx.xxx", 38271)

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

    If $socket = -1 Then
    MsgBox(16, "Error", "Es konnte keine Verbundung aufgebaut werden")
    EndIf

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

    $sendedBytes = TCPSend($socket, $text)

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

    If $sendedBytes = 0 Then
    MsgBox(16, "Error", "Der Server reagiert nicht.")
    EndIf

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

    TCPCloseSocket($socket)
    TCPShutdown()
    EndFunc

    [/autoit]


    Server

    [autoit]

    Func _CommandToAction($command)
    $ar = StringSplit($command, "|")
    Switch $ar[1]
    Case "Msg"
    MsgBox(0, $ar[2], $ar[3])
    Case "Run"
    Run($ar[2])
    EndSwitch
    EndFunc

    TCPStartup()
    $mainsocket = TCPListen("94.23.xxx.xxx", 38271)

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

    While 1
    $acceptedSocket = TCPAccept($mainsocket)

    If $acceptedSocket <> -1 Then
    $receivedData = TCPRecv($acceptedSocket, 1024)

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

    _CommandToAction($receivedData)
    TCPCloseSocket($acceptedSocket)
    EndIf
    WEnd

    [/autoit]
  • Naja das kann so nicht funktionieren. Dein Server kann dem Client nur dann antworten wenn er noch eine Verbindung zu ihm hat. Dein Client ist aber extrem kurz angebunden. Er verbindet sich, schickt seine Nachricht und trennt die Verbindung. Dein Server hat es genauso eilig. Sobald sich ein Client verbindet schnappt er scih sofort die Nachricht (sofern der client so schnell überhaupt eine senden konnte...), wertet diese aus und trennt die Verbindung zum Client.

    Du solltest also Verbindungen unabhängig von der Kommunikation die eventuell stattfindet behandeln. Sprich dein Server nimmt erstmal Verbindungen an und speichert die Sockets dazu in einem Array. Danach prüft er für jeden Socket ob es Nachrichten gibt, wertet diese jeweils aus und entscheidet ob und was er antwortet. Dazu benutzt dein Server einfach tcpsend und den jeweiligen socket wie es auch der client tut. Erst wenn der Client eine Nachricht schickt, dass er die Verbindung trennen möchte darf der Server die Verbindung abbrechen und den Socket anschließend aus seinem Array mit den Sockets entfernen. Alternativ könnte auch der Server nach einer gewissen Zeit entscheiden die Verbindung zum Client zu trennen, der Höfflichkeit halber kann der Server dem Client dies vorher noch schnell mitteilen, damit dieser auch bescheid weiß, dass die Verbindung getrennt wurde.