【问题标题】:Indy and TStreamsIndy 和 TStreams
【发布时间】:2012-04-12 18:07:08
【问题描述】:

通过 Indy 发送 TMemoryStream 的最佳方式是什么?

目前我正在尝试:

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;

但尽管没有错误,但在另一端使用该内存流到字符串函数只会返回 ??????????????????????在我保存到的文本文件中。

【问题讨论】:

  • 最好的发送方式,是以HTTP服务器期望的方式发送。服务器如何期望它?
  • ?抱歉,我不完全确定您的意思。
  • 服务器期望如何接收流数据?我的意思是,服务器是否需要 POST 或 GET 方法?在特殊的参数或字段名称中?
  • 整个(尝试的)服务器都存在问题。
  • 服务器正在将数据读入 LStore,但之后 LStore 超出范围。

标签: delphi delphi-xe2 indy memorystream


【解决方案1】:

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;

话虽如此,您提到错误与从TMemoryStreamString 的转换有关。请在两端显示TMemoryStream 的实际内容。内容可能不是您所期望的。当您将String 存储到TMemoryStream 中时,客户端的TMemoryStream 包含以'?' 开头的字符,或者客户端未将UTF-16 编码字符发送到服务器。

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多