Einzelnen Beitrag anzeigen

Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#18

Re: Sehr langen String mit Clientsocket an Serversocket send

  Alt 29. Feb 2004, 07:31
Zitat von AnTiPrimaTe:
bei blocked sockets kann es aber genauso zu Fragmentierung kommen,
wenn die Daten groß sind, dann werden die je von TCP-Stack
gesplittet, Netz dazwischen spielt auch ne Rolle.
man muss auf jeden Fall selbst eigene Frames "verpacken",
wie ich bereits oben geschrieben hab, mit Start- und End-Signaturen
.
Definitiv Nein -> keine Start- und End-Signaturen.

Wenn der Client connected (Dann sendet der Client auch sofort) wird im OnGetThread von TServerSocket ein neuer TServerClientThread erzeugt. Dadurch wird dann im neuen TServerClientThread (oder aus dem Threadpool) die Methode ClientExecute aufgerufen. Das folgende Beispiel basiert übrigends auf
dem Beispiel aus der OH.
Delphi-Quellcode:
procedure TClientThread.ClientExecute;
var
  szBuffer : array[0..1024] of Char;
  aWSStream : TWinSocketStream;
  iBytes : Integer;
  aMStream : TMemoryStream;
  DataPosition : Integer;
begin
  FillChar(szBuffer, SizeOf(szBuffer), #0);
  while not Terminated and ClientSocket.Connected do
  begin
    try
      // Blockierende Sockets mit 60 Sekunden Timeout
      aWSStream := TWinSocketStream.Create(ClientSocket, 60000);
      aMStream := TMemoryStream.Create;
      try
        // Client muss innerhalb von 5 Sekunden mit der Übertragung beginnen
        if aWSStream.WaitForData(5000) then
          repeat
            iBytes := aWSStream.Read(szBuffer, SizeOf(szBuffer));
            if iBytes = 0 then // Wenn keine Daten mehr aus der Verbindung gelesen werden können,
                               // kappe die Verbindung zum Cient. Dadurch liefert auch WaitForData
                               // False und die Repeat-Schleife wird verlassen.
              ClientSocket.Close
            else
              aMStream.WriteBuffer(szBuffer, iBytes);
          until not aWSStream.WaitForData(2000); // Solange aus Verbindung lesen, wie
                                                 // wie Verbindung bereit ist.
        // Ab hier sind alle Daten, die gesendet wurden in aMStream !!!!!
        FStream.Clear;
        aMStream.Seek(0,soFromBeginning);
        // Der Client hat vor den eigentlichen Nutzdaten einen einen Record in den TWinSocketStream
        // geschrieben. Dieser Record enthält eine sog. CommandID. Dieser Record muss jetzt erstmal
        // aus aMStream gelesen werden.
        DataPosition:=aMStream.Read(FCommand,SizeOf(TClSvCommand));
        
        // Kopiere jetzt ab Dataposition die Nutzdaten nach FStream
        FStream.CopyFrom(aMStream,aMstream.Size-DataPosition);

       // Entscheide über die CommandID was zu tun ist.
        Case FCommand.CommandID of
          iCommandLoadMemo : Synchronize(UpdateMemo);
          iCommandCLearMemo : Synchronize(ClearMemo);
          end;
      finally
        aWSStream.Free;
        ClientSocket.Close;
        aMStream.Free;
      end;
    except
      HandleException;
      end;
  end;

end;
I come from outer space to save the human race
  Mit Zitat antworten Zitat