Client und Server Anwendung

  • Hey Leute ich hab mir mal folgendes Video Tutorial angeguckt und nachgebaut.

    http://www.youtube.com/watch?v=HLpdlsPVZFw

    nun hab ich versucht, dass der Server auch was zurück sendet. Also hab einen weiteren Befehl hinzu gefügt wo er es eigentlich machen sollte, nur leider klappte es nicht. ich hänge die scripte im Anhang mal bei. Also mein befehl lautet: Space.

    Danke schon mal für eure hilfe.


    Michael

  • Also. Serverseitig siehts gut aus. Auf der Client Seite müsstest du aber noch was ändern.
    Du frägst wahrscheinlich zu schnell TCPRecv ab. Wenn du TCPRecv sofort und nur einmal abfrägst hat es der Server noch überhaupt nicht gesendet.
    Ich würde es so machen (einfach dort einsetzen wo du auskommentiert hast):

    Spoiler anzeigen
    [autoit]

    If $Data = "Space" Then
    Do
    $incomming = TCPRecv($ConnectedSocket, 2048)
    Until $incomming <> ""
    ;$incomming = StringSplit($incomming, "|") Geht nicht gut. Du würdest sonst das ganze Arrray in der MsgBox anzeigen wollen.
    MsgBox(0, "Incoming Message", $incomming)
    $incomming = ""
    EndIf

    [/autoit]


    Sollte funktionieren.

    Gruss Shadowigor

  • Super es funktioniert.

    Danke für die schnelle Antwort.

    Muss es nun nur mal Testen wenn ich mit richtige Netzwerkanwendung mache. Also den Serverteil auf einem PC und der Clientteil auf nem anderen.

    Nur auf kurz oder lang will ich mal gucken, wie ich Dateien übertragen kann übers Netzwerk ohne auf Serverdienste wie FTP zurück zu greifen, wenns geht.

    Michael

  • so, habs nun endlich geschafft zu testen und funktioniert nach kleiner Anpassung. Also das mit dem wegen der IP Adresse. Nur nun ist noch das Problem, mit dem wie man Daten via Netzwerk am besten verschicken kann.

    Kennt jemand vll eine gute idee?


    Michael

  • Einfach eine Datei per FileRead auslesen, das Ausgelesene per TCP versenden und auf der anderen Seite mit FileWrite wieder zusammenbauen.

  • Habs nun wie beschrieben versucht, nur leider übermittelt er die Datei, nur Ohne Inhalt. Das ist bischen doof, vorallem wenn man mal keine Textdatei sondern Batch Datei bzw eine Anwendung verschickt.

    So hier mal das Serverscript

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    TCPStartup()

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

    $datei = FileRead("test.txt",2048)

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

    While 1

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

    $socket = TCPListen("192.168.0.1", 20202)

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

    $connect = TCPAccept($socket)

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

    $empfang = TCPRecv($connect, 2048)

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

    if $empfang = "senden" Then
    TCPSend($connect, $datei)
    EndIf

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

    if $empfang = "ende" Then
    TCPCloseSocket($connect)
    EndIf

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

    Sleep(50)
    WEnd
    TCPShutdown()

    [/autoit]


    Client Script

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    TCPStartup()

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

    $socket = TCPConnect("192.168.0.1", 20202)

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

    $senden = InputBox("Befehl", "Bitte eingeben")

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

    TCPSend($socket, $senden)

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

    $datei = TCPRecv($socket, 2048)

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

    FileWrite("test.txt", $datei)

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

    TCPShutdown()

    [/autoit]


    Ich hoffe vielleicht findet jemand den fehler? Und beim Senden muss ich gucken, wie ichs mache wenn Dateien größer sind. Weil hab mal im Netz was gehört, dass man bei TCPRecv begrenzen sollte / muss hier 2048 Oder ist auch okay, wenn ich diesen wert deutlich erhöhe oder wie würdet Ihr das machen?

    Danke schon mal im vorraus.

    Und das mit dem Übermitteln der Textdatei ist erstmal ein versuch. Möchte in zukunft auch mal ne batch Datei bzw exe Datei versenden.


    Michael

    Einmal editiert, zuletzt von lwl2011Bochum (15. Oktober 2011 um 23:55)

  • Klar geht das nicht:

    1. Du kommst gar nie aus dieser Schleife (Server).
    2. In der schleife machst du jedes mal Listen und accept.
    3. Du liest nur die ersten 2048 Zeichen ein die du dann verschickst.
    4. Du hast beim Client keine Schleife beim TCPRecv (der wartet nicht von alleine bis was kommt).
    (5. Das Sleep ist nicht nötig)
    (6. Es ist einfacher wenn di @IPAddress1 nimmst bei TCPListen)

    Ich finde das sind schon recht viele Punkte. Korrigier die mal und dann sehen wir weiter.

    Gruss Shadwigor

  • so zu den Punkten:

    zu 1) Das ist gewollt, also der server soll in Endlosschleife laufen, bis er manuell beendet wird bzw vom client den Befehl "ende" erhält. Dann endet das Programm.

    zu 2) muss ich das nicht so machen, wenn ich nicht weiß, wann der Client eine anfrage schickt?

    zu 3) kann ich die Sache mit den Zeichen auch verändern? also das er auch rest liest oder geht das nit?

    zu 4) Habe nun im nachgang eine schleife gemacht, zwar nur zu versuchszwecken eine Endlosschleife, die manuell beendet werden muss.

    zu 5) habe ich nun entfernt.

    zu 6) Ja gut könnte man machen, aber für Damit es Funktioniert sollte es nicht zu tun haben.


    Nur trotz der das ich die Endlosschleife auf dem Client gemacht habe, wird bislang nur die Datei übertragen aber Ohne Inhalt, was könnte noch falsch liegen?


    Michael

  • so Funktioniert nun doch. habs in eine Andere Netzwerkanwendung gepackt, die bislang nur Werte übermittelte und es funktioniert. Nur nun noch die Frage, wegen Dateiinhalt menge. wie kann ich diese erhöhen? Bzw. nach und nach senden? also als art packete?

    Hoffe jemand kann helfen.

    Michael

  • Also kurz nochmal zu den Punkten:
    1. Ich nahm an dass das so sein sollte. Aber wenn du "ende" gesendet hast hat er nur das Socket geschlossen, die Schleife ist aber weitergegangen.
    2. Listen ist nur einmal vor dem verbinden nötig. danach musst du accept in eine schleife packen bis sich der client connected hat. Dann geht das Script ganz normal weiter
    Beispiel:

    [autoit]

    TCPStartup()
    $idListen = TCPListen(@IPAddress1, 50000)
    Do
    $idSocket = TCPAccept($idListen)
    Until $idSocket <> -1
    ; Dann geht das Script weiter

    [/autoit]

    Nun zu deinem Problem mit dem File:
    FileRead liest immer die nächsten z.B. 2048 Zeichen ein. Dafür musst du es aber mit FileOpen öffnen. Sonst fängt er immer wieder von vorne an.
    Also kannst du das in eine Schleife packen:

    [autoit]

    $hFile = FileOpen("Pfad zur Datei", 0) ; Öffnet die Datei im Lese-Modus (0)
    Do
    $sText = FileRead($hFile, 2048) ; Liest immer die nächsten 2048 Zeichen ein
    TCPSend($idSocket, $sText) ; und sendet diese
    Until $sText = "" ; Widerholt das bis das Ende des Files erreicht ist

    [/autoit]

    Ich hoffe ich konnte dir helfen.

    Gruss Shadowigor

  • danke sieht super aus. werd es heute abend mal testen. vorher klappts nicht wirklich. wenn noch was ist poste ichs wieder bei.


    Michael