2012-04-12 17 views
1

IndyからTMemoryStreamを送信する最善の方法は何ですか?IndyとTStreams

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 

とサーバ側では:

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; 

しかし、もう一方の端にエラーがないこと、にも関わらず、文字列関数にそのメモリストリームを使用して、私がしようとしている瞬間に

ちょうど????????????????????を返す私はそれを保存しているテキストファイルで。

+0

送信する最も良い方法は、HTTPサーバーが期待する方法で送信することです。サーバーはそれをどのように期待していますか? –

+0

?申し訳ありませんが、私はあなたが何を意味するか完全には分かりません。 –

+0

サーバーがストリームデータを受信する方法を教えてください。つまり、サーバーはPOSTメソッドまたはGETメソッドを期待していますか?特別なパラメータまたはフィールド名で指定しますか? –

答えて

3

TIdIOHandler.Write(TStream)TIdIOHandler.ReadStream()例えば、あなたのためのTMemoryStream.Size財産の送受信を扱うことができます。

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; 

あなたはエラーがTMemoryStreamからStringへの変換に関連して述べた、と述べました。 TMemoryStreamの実際の内容が両端にどのように表示されているかを示してください。コンテンツはあなたが期待しているものではない可能性があります。どちらのクライアントのTMemoryStreamあなたはTMemoryStreamStringを保存、またはCLIENは、サーバーへのUTF-16エンコードされた文字を送信していないときに開始する'?'文字が含まれています。

関連する問題