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: textmeine 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
-
-
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 dankbarlg 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.