Frage zu TSockets
-
Hi
ich arbeite mich gerade in TClient und tServerSocket ein habe ein feststellung gemacht:
Ich schicke vom Client eine suchanfrage an den Client ( SendText(AnsiString) )
Dann schickt der Server die ergebnisse einzeln mit SendText an den Client!
wenn ich den Server im debugmode habe und vor dem senden einen Brakepoint dann klappt das auch! normal kommen aber nur 3 von 60 an!woran liegt das? kann das ereigniss onClientRead nicht doppelt ausgelöst werden oder wo ist das Problem?
Wenn es daran liegen sollte, kann man das irgentwie umgehen?
Was ich mich auch noch frage ist: Wenn der Server mehrere connections hat und ich um onClientRead was schicke bekommt das dann der client der was geschikt hat? wie kann ich sonst einzelne clients ansprechen?
Hoffe habe mich einigermassen verständlich ausgedrückt und ihr könnt mir ein wenig weiterhelfen!
THX
Dagsta
-
Setz einfach anstelle des Breakpoints eine kurze Warteschleife
DWORD TCount = GetTickCount(); while(GetTickCount() < TCount + 500) // 500 ms warten Application->ProcessMessages(); // Nachrichtenwarteschlange abarbeiten
oder als Funktion
Delay(DWORD WaitTime) { DWORD TCount = GetTickCount(); while(GetTickCount() < TCount + WaitTime) Application->ProcessMessages(); }
Aufruf z.B. Delay(500) // 500 ms warten
Zum zweiten: Ein ServerSocket hat die Auflistung Connections[int Index], sieh mal in der Onlinehilfe nach.
-
Irgendwie kann ich das Problem nicht nachvollziehen? Wo sendest du denn die 60 Strings?
-junix
-
Ich aber!
Dein Problem ist das, dass Du zu schnell Strings verschickt.
Wenn du z.B: 5 mal SendText aufrust z.B. so:Client->SendText("a"); Client->SendText("b"); Client->SendText("c"); Client->SendText("d"); Client->SendText("e");
Du versucht wahrscheinlich mit dem ereignis OnClientRead des Servers den String zu lesen per ReciveText(); Nur wird nicht bei jedem SendText auch onClientRead aufgerufen was jedoch nicht heißt das der Rest verloren geht.
Der Text den du nun mit ReciveText(); empfängst sieht so aus
abcde
Du solltest einen Delimer einbauen um zu unterscheiden wo Anfang und Ende eines Strings ist.
Senden
Client->SendText("■a"); Client->SendText("■b"); Client->SendText("■c"); Client->SendText("■d"); Client->SendText("■e");
Empfangen
int anz = 0; AnsiString t = ""; for ( int i = 0; i < text.Length(); i++ ) if ( text.SubString(i,1) == "■" ) anz++; for ( int i = 0; i < anz; i++ ) { t = text.SubString(1,text.Pos("■") - 1 ); text.Delete( 1, text.pos("■") ); suchen(t); }
Weiß jetzt nicht ob es 100% richtig ist aber so in der Art habe ich es auch gemacht.
P.S. HANSMANN!!!!!!!!!!!!!!!!!!!!!!!! (insider)
-
SlashXP++ schrieb:
Du solltest einen Delimer einbauen um zu unterscheiden wo Anfang und Ende eines Strings ist.
Siehe auch in der FAQ: Netzwerk - Protokollentwicklung
Dein Code dürfte übrigens so nicht zwingend funktionieren, da unter Umständen noch nicht alle Daten angekommen sind, wenn OnClientRead auftritt...
-junix
-
um nochmal auf das vom Slash und Junix einzugehen!
es kann also vorkommen, dass wenn onread ausgelöst wird da Message1Messa drinen steht obwohl ich eigentlich Message1 und Message2 gesendet habe!
also klappt das auch nicht!dann wäre ja ein stream sinnvoll! den gibt es ja auch!
also würde ich mir die erste Message aus dem stream nehmen! dann wäre der rest ja noch drinne!
aber das ereignisse würde dann doch nicht öfter ausgelöst oder?
und wie ist das wird der stream nach dem auslösen der on read wieder gelert? oder ist der teil den ich noch nicht verarbeitet habe beim nächsten mal noch mit drinne?Hoffe ihr versteht was ich meine!
@Junix + Shlash ihr habt ja meine UIN in ICQCU
Dagsta