chat - name: text ausgeben



  • Hallo Leute,

    habe mir einen kleinen lokalen Chat geschrieben und möchte dann in einem Memo die Nachrichten in folgendem Format ausgeben:
    Name: text

    meine 2 Funktionen hierfür:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
    AnsiString text = Edit1->Text;    //s = der Text, der gesendet wird
    AnsiString name = Edit2->Text;    //der Name des Nutzers
    
     if(isServer){      //wenn es ein Server ist, dann Sende von Server Connections[0] nicht vergessen
    
      //ServerSocket1->Socket->Connections[0]->SendBuf(name.c_str(), sizeof(name));
      ServerSocket1->Socket->Connections[0]->SendText(name);
      ServerSocket1->Socket->Connections[0]->SendText(text);
      }
     else           //ansonsten sende von Client
     // ClientSocket1->Socket->SendBuf(name.c_str(), sizeof(name));
        ClientSocket1->Socket->SendText(name);
        ClientSocket1->Socket->SendText(text);
    
     }
    

    und ...

    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
     AnsiString name = Socket->ReceiveText();  //für Namen
     AnsiString text = Socket->ReceiveText();  //für das Empfangen des Textes
    
      Memo1->Lines->Add(" " + name + ": "); //Name wird empfangen
      Memo1->LInes->Add(" " + text + " "); //Text wird empfangen
    
    }
    

    ausgabe:
    Name:
    Text:

    Irgendwie logisch, dass es nicht funkt - es wird wohl beim 1. mal der gesamte Text empfangen - doch wie kann ich das ausbessern?

    vielen dank und lg

    Matthi



  • Hi,
    schau mal hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=43719

    MfG

    Alexander Sulfrian



  • Hallo ...
    sorry, das konnte mir nicht wirklich weiterhelfen ... habe es inzwischen mal mit buf probiert .. also folgender code:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
    AnsiString text = Edit1->Text;    //s = der Text, der gesendet wird
    AnsiString name = Edit2->Text;    //der Name des Nutzers
    
    char w[20];
      std::strcpy(w, name.c_str());
    char txt[500];
      std::strcpy(txt, text.c_str());
    
     if(isServer){      //wenn es ein Server ist, dann Sende von Server Connections[0] nicht vergessen
      ServerSocket1->Socket->Connections[0]->SendBuf(w, sizeof(w));
      ServerSocket1->Socket->Connections[0]->SendBuf(txt, sizeof(txt));
     // ServerSocket1->Socket->Connections[0]->SendText(name);
     // ServerSocket1->Socket->Connections[0]->SendText(text);
      }
     else           //ansonsten sende von Client
        ClientSocket1->Socket->SendBuf(w, sizeof(w));
       // ClientSocket1->Socket->SendText(name);
       // ClientSocket1->Socket->SendText(text);
    
     }
    
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
     AnsiString receive;  //für das Empfangen des Namens
     AnsiString rectext;
     //char w[] = receive.c_str();
     char w[40];
      std::strcpy(w, receive.c_str());
     Socket->ReceiveBuf(w, sizeof(w));
     Memo1->Lines->Add(w); //Name wird empfangen
     char text[500];
      std::strcpy(text, rectext.c_str());
     Socket->ReceiveBuf(text, sizeof(text));
     Memo1->Lines->Add(text);
      //Socket->ReceiveBuf(receive.c_str(), sizeof(receive.c_str() + 1));
      //Memo1->Lines->Add(Socket->ReceiveText());  //nun wird noch der Text empfangen
    
    }
    

    doch leider sendet er mir hier auch immer nur den 1. string.
    bin für jede hilfe dankbar

    lg matthi



  • Lies dir den Beitrag zur Protokollentwicklung nochmal durch.
    Du musst dir selbst eine Methode einfallen lassen, wie du den ankommenden Datenstrom in die entsprechenden Teile zerlegst. Üblicherweise benutzt man dazu besondere Trennzeichen und/oder Informationen über die Länge der einzelnen Abschnitte, mit anderen Worten: ein eigenes Protokoll.


Anmelden zum Antworten