TClientSocket TServerSocket



  • Hallo,

    ich möchte vom Server zum Client den Inhalt einer TMemo Komponente Zeile für Zeile übermitteln. Dazu sendet der Client an den Server den Text MEMOGet und der Client setzt bei sich eine boolsche Variable (b_MemoMessage) auf true (als nächstes kommt ja der Text und keine Anweisungen vom Server).

    Wenn der Server nun MEMOGet erhält macht er folgendes:

    for(int i = 0; i < Memo1->Lines->Count; i++)
    {
        Socket->SendText(Memo1->Lines->Strings[i]);
    
    }
    Socket->SendText("MEMOEnd");
    

    Der Client macht derweil folgendes (im onRead event)(TSL ist eine TStringList, cs ist TClientSocket, s_Message ist ein String):

    s_Message = cs->Socket->ReceiveText();
    if(b_MemoMessage)
    {
        if(s_Message == "MEMOEnd")
            {
                    //Hier kommt das Programm nie hin !?!
            b_MemoMessage = false;
                    TSL->SaveToFile("Memo.txt");
                    if(TSL)
                        delete TSL;
                    TSL = new TStringList;
                    return;
            }
            else
            {
                TSL->Add(s_Message);
            }
            return;
    }
    

    wenn ich nun die TStringList "manuell" speichere, dann steht alles vom Memo in einer Zeile mit MEMOEnd am Ende.
    Warum wird der Inhalt von meinem TMemo nicht Zeile für Zeile übertragen/empfange. Ich kenne mich leider auf diesem Gebiet noch so gut wie gar nicht aus.

    Danke
    Robert



  • möglich, dass nicht genau "MEMOEnd" ankommt, sondern bisschne was anders. das kann an den charsets liegen, daran, dass der clientsocket evtl alles kleingeschrieben sendet, keine ahnung. vergleiche das empfangene einfach mal zeichen für zeichen mit MEMOEnd, vielleicht kommste dann drauf



  • Also im tollen Windows Editor steht ganz am Ende genau MEMOEnd. Und warum bekomme ich alles in einer Zeile. Der Server schickt doch das Memo Zeile für Zeile an den Client und der fügt es Zeile für Zeile der TStringList hinzu. Aber wenn ich sie speicher steht alles in einer Zeile. 😕



  • So ein ähnliches Problem hatte ich auch einmal. Da du sehr schnell per for-Schleife Zeile für Zeile an den Clienten sendest, wird der Text einfach rangehängt. Versuch mal mit einem von dir gewählten Zeichen das Ende der Zeile zu markieren und wenn der Text ankommt, dann zerlegst du ihn einfach wieder.



  • vielleicht steht da auch gar kein carriage return + line feed drin sondern es ist wirklich nur ne umgebrochene memo zeile ? 🙄

    nur wenn du enter drückst wird auch das carriage return + line feed eingetragen nicht wenn der auto umbruch im memo feld ist !

    [ Dieser Beitrag wurde am 22.04.2003 um 14:54 Uhr von 1ntrud0r editiert. ]



  • Der Zeilenumbruch wird nicht mitgesendet. Ist ja auch logisch, da nicht der Memo-Inhalt als Ganzes sondern eben nur der Inhalt der einzelnen Zeilen übertragen wird. Also jedem SendText noch eine "\r\n" hinterherschicken bzw. explizit an die Zeile anhängen.



  • Hallo,

    also ich hab jetzt mal des mit dem "\r\n" gemacht. Wenn ich nun die TStringList "manuell" speicher, dann sieht das auch wunderbar aus. Aber in der TstringList ist alles immer in einer Zeile.
    (Beispiel)
    Ich hab ins Memo geschrieben:

    Zeile1
    Zeile2
    Zeile3
    Zeile4

    Dann den Debugger angeworfen und TSL->Strings[0] untersucht und da stand folgendes:
    Data: 00972764 "Zeile1\r\nZeile2\r\nZeile3\r\nZeile4\r\nMEMOEnd"

    Kann ich denn den Text nicht schon so in die TStringList bekommen, dass eine Zeile in einem String ist?

    Robert



  • TSL->Text=s_Message;

    Damit wird dann bei jedem Zeilenumbruch auch eine neue Zeile in der TStringList TSL erzeugt!



  • Das funktioniert bestens.
    Danke!!



  • Dann könntest du natürlich auch gleich Memo1->Text verschicken und bräuchtest nicht die Zeilen einzeln abzuarbeiten. Bei grösseren Datenmengen wirst du allerdings so oder so Schwierigkeiten bekommen, da nicht garantiert ist, dass alle Daten (oder auch nur der Inhalt einer Zeile) komplett übertragen wird.

    Um sicherzugehen musst du ein eigenes Protokoll implementieren, bei dem du zB. nach einer bestimmten Menge empfangener Bytes eine Bestätigung zum Server zurückschickst, der erst daraufhin den nächsten Datensatz sendet. Und ein Timeout gehört natürlich auch noch mit dazu, um ggf. nicht angekommene Daten automatisch neu verschicken.


Anmelden zum Antworten