如何确保使用TTetheringAppProfile.SendStream发送的消息正确传递?

时间:2015-04-15 15:44:43

标签: firemonkey delphi-xe7 tethering

我有一个简单的移动应用程序,它需要一系列照片并通过SendStream()发送到连接的配置文件。

myTetherAppProfile.SendStream(myTetherManager.RemoteProfiles[idConnected],
                              'ImageData',
                              bmpStreamData);

这里出现的问题是接收器应用程序根据连接强度没有得到所有图像流(在接收器应用程序上没有触发ResourceReceived-Event)。

如果我收到传递失败的回复,这将没有问题。但是我没有得到这个(SendStream()返回" True")

除了实现&#34之外是否还有可能;如果您收到了我的图像,请回复另一条消息" -function即使连接错误也能实现稳定的传输?或者默认情况下App-Tethering设计为有损?

此外,在大量图像之后,我有时会通过同行" -error重置"连接。 (我不确定这个错误是否与实际问题有关,所以我更喜欢发布它。)

1 个答案:

答案 0 :(得分:2)

查看System.Tether.AppProfile(XE8版本)中的相关代码,它似乎是一个错误。请参阅下面的内联评论。请报告https://quality.embarcadero.com

function TTetheringAppProfile.SendStream(const AProfile: TTetheringProfileInfo; const Description: string;
  const AStream: TStream): Boolean;
var
  LProfileInfo: TTetheringProfileInfo;
  LConnection: TTetheringConnection;
  LCommand: TTetheringCommand;
begin
  if not FindProfile(AProfile.ProfileIdentifier, LProfileInfo) then
    raise ETetheringException.CreateFmt(SNoProfile, [AProfile.ProfileIdentifier]);
  CheckProfileIsConnected(AProfile);
  LConnection := GetConnectionTo(AProfile);
  TMonitor.Enter(LConnection);
  try
    LCommand := LConnection.Protocol.SendCommandWithResponse(SendStreamCommand, Version, Description);
    if LCommand.Command = SendStreamOkResponse then
    begin
      Result := LConnection.Protocol.TransferStream(AStream);
      if Result then
      begin    <-- Result here is guaranteed to be True
        LCommand := LConnection.Protocol.ReceiveCommand;
        if LCommand.Command = SendStreamContentOKResponse then
          Result := True;  <-- Sets Result to True if succeeds, 
              <-- but nothing to set Result to False if call failed.
      end;
    end
    else
      Result := False;
  finally
    TMonitor.Exit(LConnection);
  end;
end;