AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TServerSocket und TClientSocket String-Länge
Thema durchsuchen
Ansicht
Themen-Optionen

TServerSocket und TClientSocket String-Länge

Ein Thema von michele_tedesco · begonnen am 7. Jan 2015 · letzter Beitrag vom 7. Jan 2015
Antwort Antwort
michele_tedesco

Registriert seit: 19. Mär 2014
50 Beiträge
 
#1

TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 09:16
Hallo zusammen

Was passiert genau wenn beim TServerSocket unter Last ganz oft SendText aufgerufen wird und der "Buffer" sich füllt? Also der zu sendende Text die maximale Grösse von 64k erreicht?
Stimmt diese maximale Grösse überhaupt?

Ich konnte in manchen Fälle feststellen, dass der Client (ReceiveText aufgerufen beim Event ClientSocketRead) dann am Schluss dieser 64k-Nachricht, welche aus mehreren Befehle (String, welches mit Sonderzeichen anfängt und aufhört und immer ca. 100 Zeichen lang ist) besteht, einen abgehakten Befehl erhält und erst mit der folgenden Nachricht (erneut ClientSocketRead) den Rest des Befehlt zu Beginn des String (ReceiveText) erhält.

Wann genau schickt der ServerSocket die NAchricht ab (mit SendText) und kann das sein, dass bei hoher Last (200 Mal SendText pro Sekunde) sich der Client aufhängt??

Das ganze habe ich auf XE5 festgestellt.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 09:28
Du musst doch grundsätzlich davon ausgehen, das die Nachricht beim Empfänger nur happenweise ankommt. Das ist einfach so. Ergo muss dein Empfänger eine Puffer pflegen, d.h.
1. Hänge die gerade empfangenen Bytes an den Puffer an.
2. Wenn der Puffer nun eine vollständige Nachricht enthält, extrahiere die Nachricht und verarbeite sie.
3. Der Puffer kann nun den Anfang der nächsten Nachricht enthalten, oder auch die komplette nächste Nachricht.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 10:53
Das liegt halt in der Natur des Protokolls. Für Delphi gibt es mit Indy und Synapse allerdings auch freie Bibliothek, die das Problem durch Verwendung eines Puffers umgehen. Der Clientaufruf blockiert dann zwar solange bis der gesamte gesendete Text empfangen wurde, aber bei Bedarf kann man den Aufruf in einem Thread unterbringen.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#4

AW: TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 12:29
Oder man nimmt gleich die ICS von Francois Piette. Die sind Event getrieben und nicht blockierend.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 13:07
Und auch da musst Du dich ums zusammensammeln selbst kümmern. Und auch bei den Indies musst Du das tun. Sie bieten dir imho nur die Möglichkeit, einen durch CR/LF terminierten String zu schicken und zu empfangen. DAS ist dann blockierend, weil die 'ReadLn' - Methode eben wartet, bis das CR/LF eingetrudelt ist.

Bei anderen Protokollen (Frame, Length encoding. Checksum etc.) muss man alles selbst machen. Die Routine zum Empfangen sieht im Prinzip so aus

Delphi-Quellcode:
Procedure TMyThing.OnReceive (Sender : TObject; Data: TBuffer; BytesReceived : Integer);
Begin
  myBuffer.Append (Data, BytesReceived);
  While myBuffer.ContainsFullMessage do
    ProcessMessage(myBuffer.ExtractMessage);

End;
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

AW: TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 14:30
Bei anderen Protokollen (Frame, Length encoding. Checksum etc.) muss man alles selbst machen. Die Routine zum Empfangen sieht im Prinzip so aus ...
Die Indy TIdIOHandler Klasse für den Socketzugriff bietet ein breites Sortiment an Read/Write Methoden, denen man auch sagen kann wie ein String terminiert, ist oder wie lang ein Stream, der gelesen werden soll. Auch Encodings und Timeouts lassen sich fein steuern. Wenn man den Puffer direkt anspricht, ist man schon viel zu low level. Daher ist Indy nach etwas Einarbeitung auch geeignet, komplexere Protokolle schnell abzubilden.
Michael Justin
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: TServerSocket und TClientSocket String-Länge

  Alt 7. Jan 2015, 14:45
Oh, das wusste ich nicht. Ich hatte das immer selbst gebaut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz