2012-04-12 13 views
1

Was ist der beste Weg zum Senden eines TMemoryStream über Indy?Indy und TStreams

Im Moment versuche ich:

procedure TClientForm.IdTCPClient1Connected(Sender: TObject); 
begin 
    IdTCPClient1.IOHandler.Write(KStore.Size); 
    KStore.Position := 0; 
    IdTCPClient1.IOHandler.Write(KStore); 

    Memo1.Lines.Add('Client connected with server'); 
end 

Und am Ende Server:

function MemoryStreamToString(M: TMemoryStream): string; 
begin 
    SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char)); 
end; 

procedure TClientForm.IdTCPServer1Connect(AContext: TIdContext); 
var 
    LStore: TMemoryStream; 
    Size: Int64; 
    LStore := TMemoryStream.Create; 
    LStore.Position := 0; 
    Size := AContext.Connection.IOHandler.ReadInt64(); 
    AContext.Connection.IOHandler.ReadStream(LStore,Size); 
end; 

Aber trotz eines Mangels an Fehler, am anderen Ende mit, dass Speicher-Stream auf String-Funktion kehrt einfach zurück ???????????????????? in der Textdatei speichern ich es zu.

+0

Der beste Weg, es zu senden, ist, es in der Art und Weise zu senden, wie der HTTP-Server es erwartet. Wie erwartet der Server? –

+0

? Entschuldigung, ich bin mir nicht ganz sicher, was du meinst. –

+0

Wie erwartet der Server die Stream-Daten? Ich meine, erwartet der Server eine POST- oder GET-Methode? in einem speziellen Parameter oder Feldname? –

Antwort

3

TIdIOHandler.Write(TStream) und TIdIOHandler.ReadStream() können die Übertragung und den Empfang der für Sie TMemoryStream.Size Eigentum behandeln, zB:

procedure TClientForm.IdTCPClient1Connected(Sender: TObject); 
begin 
    IdTCPClient1.IOHandler.LargeStream := True; 
    IdTCPClient1.IOHandler.Write(KStore, 0, True); 
    Memo1.Lines.Add('Client connected with server'); 
end; 

.

function MemoryStreamToString(M: TMemoryStream): string; 
begin 
    SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char)); 
end; 

procedure TClientForm.IdTCPServer1Connect(AContext: TIdContext); 
var 
    LStore: TMemoryStream; 
    S: String; 
begin 
    LStore := TMemoryStream.Create; 
    try 
    AContext.Connection.IOHandler.LargeStream := True; 
    AContext.Connection.IOHandler.ReadStream(LStore, -1, False); 
    S := MemoryStreamToString(LStore); 
    finally 
    LStore.Free; 
    end; 
end; 

Mit dieser sagte, Sie erwähnten die Fehler der Umwandlung TMemoryStream-String zusammenhängt. Bitte zeigen Sie an, wie der eigentliche Inhalt des TMemoryStream an beiden Enden aussieht. Wahrscheinlichkeiten sind, dass der Inhalt nicht ist, was Sie erwarten. Entweder die TMemoryStream des Clients enthält '?' Zeichen zu beginnen, wenn Sie eine String in die TMemoryStream gespeichert haben, oder die Clien sendet keine UTF-16 codierten Zeichen an den Server.