Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TServerSocket - ClientRead kommt nur einmal (https://www.delphipraxis.net/113344-tserversocket-clientread-kommt-nur-einmal.html)

easywk 6. Mai 2008 13:46


TServerSocket - ClientRead kommt nur einmal
 
Moin, moin,

ich möchte zwischen dem Server und dem Client Daten austauschen. Dazu benutze ich TServerSocket und TClientSocket:
- Client sendet meine eigene Datenstruktur TNetRequest
- Server liest diese aus und antwortet mit der Struktur TNetAnswer
- wenn der Client dann die Antwort hat, schickt er die nächste Anfrage

Client-Seite - On Read
Delphi-Quellcode:
procedure TFormMain.NetzwerkClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var Answer:TNetAnswer;
begin
  Socket.ReceiveBuf(Answer,sizeof(Answer));
  // die eigentlichen Daten auswerten
  case Answer.RequestId of
      0 :
        begin
          // TBD Antwort weiter verarbeiten
          Inc(Request.RequestId); // Request ist im Client global angelegt
          Socket.SendBuf(Request,sizeof(Request));
        end;
      1 :
        begin
          // TBD Antwort weiter verarbeiten
          Dec(Request.RequestId); // Request ist im Client global angelegt
          Socket.SendBuf(Request,sizeof(Request));
        end;
    end;
Server-Seite - OnClientWrite
Delphi-Quellcode:
procedure TFormMain.NetzwerkServerClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
var Request:TNetRequest;
    Answer:TNetAnswer;
begin
  Socket.ReceiveBuf(Request,sizeof(Request));
  ExecNetzwerkRequest(Request,Answer); // Antwort aufbereiten
  Socket.SendBuf(Answer,sizeof(Answer));
end;
Mein Problem: die erste Anfrage kommt beim Server an und wird auch beantwortet. Per Debug habe ich auch festgestellt, dass der Client die Antwort vom Server erhält - NUR kommt beim Server die zweite Anfrage nicht mehr an ...

Hat da irgendjemand eine Idee zu? Die Suche hat mir auch nicht wirklich weitergeholfen (was auch daran liegen könnte, dass ich die komplizierteren Threads zu diesem Thema einfach nicht verstanden habe :-))

easywk

Muetze1 6. Mai 2008 14:36

Re: TServerSocket - ClientRead kommt nur einmal
 
Mal eine andere Frage: Woher willst du wissen, ob du im Empfangsbuffer des Socket schon die gesamte Strukturgrösse vorliegen hast? Du liest einfach diese Grösse aus, ohne vorher zu schauen, wieviel empfangen wurde. Somit kann es sein dass du gar nicht die komplette Struktur einliest.

-> Socket.ReceiveLength()
-> Socket.Read Rückgabewert

easywk 6. Mai 2008 14:58

Re: TServerSocket - ClientRead kommt nur einmal
 
Ich hatte vorher auch schon mal eine Variante, die so aussah:

Client:
Delphi-Quellcode:
procedure TFormMain.NetzwerkClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var Answer:TNetAnswer;
begin
  if Socket.ReceiveLength<sizeof(Answer) then
    Exit;
  Socket.ReceiveBuf(Answer,sizeof(Answer));
  ...
Server:
Delphi-Quellcode:
procedure TFormMain.NetzwerkServerClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
var Request:TNetRequest;
    Answer:TNetAnswer;
begin
  if Socket.ReceiveLength<sizeof(Request) then
    Exit;
  Socket.ReceiveBuf(Request,sizeof(Request));
   ...
end;
Das hat aber auch nichts geändert. Außerdem habe ich beim Debuggen nachgeschaut und die ReceiveLength ist genau die erwartete Länge - es hat also nichts mit meinem Problem zu tun (wobei mir durchaus klar ist, dass das noch sauber gelöst werden muss).

Net7 6. Mai 2008 17:01

Re: TServerSocket - ClientRead kommt nur einmal
 
Hi,

Zitat:

Die Suche hat mir auch nicht wirklich weitergeholfen (was auch daran liegen könnte, dass ich die komplizierteren Threads zu diesem Thema einfach nicht verstanden habe
Hatte mal für mein Forum, eben deswegen eine einleuchtende Demo gebastelt, die kaum einer näheren Erläuterung bedürfte.

Klick!

Mfg Net7

easywk 7. Mai 2008 08:40

Re: TServerSocket - ClientRead kommt nur einmal
 
Danke für das Beispiel.

Habe den Fehler inzwischen gefunden.
Auf dem Server muss ich natürlich das Ereignis OnClientRead verwenden und nicht OnClientWrite :wall: :wall: :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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