2009-11-22 4 views
4

J'essaie de transférer quelques gros flux (~ 1Mb) entre le serveur/client DataSnap mais en vain. J'essaie de comprendre le code de Jim Tierney (http://blogs.embarcadero.com/jimtierney/2009/04/06/31461) sans aucune chance et je ne peux même pas compiler le code à cause d'une bibliothèque manquante, de toute façon ...gros flux avec DataSnap

La taille maximale d'un flux que je peux pour recevoir est 64k, donc des conseils/idées/échantillons de code que vous pouvez fournir pour un programmeur de week-end comme moi sera très bien accueilli. Je vous remercie!

mon code serveur:

function TsrvMethods.getStream(iCount: integer): TStream; 
begin 
    Result := dummyStream('', iCount); 
end; 

function dummyStream(sCnt: string; iCount: integer): TStream; 
begin 
    Result := TMemoryStream.Create; 
    while iCount > 1 do begin 
    Result.Write(Pointer(sCnt)^, Length(sCnt)); 
    Dec(iCount); 
    end; 
    Result.Seek(0, TSeekOrigin.soBeginning); 
end; 

mon client code d'appel:

procedure TfrmMain.butStreamClick(Sender: TObject); 
var 
    sStr : TStream; 
begin 
    cycleConnection; //make sure we have an active connection 

    with TsrvMethodsClient.Create(SQLConn.DBXConnection, False) do begin 
    sStr := getStream(Integer(SpinCount.Value)); 
    Free; 
    end; 
    FreeAndNil(sStr); 
end; 
+0

Quel est le problème avec ce code? S'il vous plaît laissez-nous savoir ce que l'erreur de compilation ou d'exécution est et sur quelle ligne. –

+0

Le code que j'ai posté fonctionne bien avec des flux plus petits que 64k. Lorsque des flux plus importants sont envoyés, il n'y a pas d'erreur mais le flux est vide de l'autre côté (ou n'est pas envoyé/reçu). –

Répondre

6

En fait, je pense que ce'ai obtenu. Je publie ceci comme réponse peut-être que quelqu'un d'autre en a besoin.

procedure TfrmMain.butStreamClick(Sender: TObject); 
const 
    iBufSize = 128; 
var 
    sStr : TStream; 
    sMem : TMemoryStream; 
    buf: PByte; 
    iRead: integer; 
begin 
    cycleConnection; 

    with TsrvMethodsClient.Create(SQLConn.DBXConnection, False) do begin 

    sStr := getStream(500000); //500k stream 

    GetMem(buf, iBufSize); 
    sMem := TMemoryStream.Create; 
    try 
     repeat 
     iRead := sStr.Read(Pointer(buf)^, iBufSize); 

     if iRead > 0 then sMem.WriteBuffer(Pointer(buf)^, iRead); 
     if iRead < iBufSize then break; 
     until iRead < iBufSize; 
    finally 
     FreeMem(buf, iBufSize); 
    end; 

    Free; 
    end; 
    FreeAndNil(sStr); 
    FreeAndNil(sMem); 
end; 

P.S. Recherche dans des exemples de code DataSnap J'ai trouvé qu'une amélioration (liée à la vitesse) serait que iBufSize soit réglé sur 61440 (ou une valeur hexadécimale équivalente à $ F000) qui semble être la plus grande taille pouvant être reçue en une seule fois. Si le flux de réception est plus grand, la taille signalée sera -1 et le code ci-dessus est nécessaire pour lire le flux entier.