我有一个简单的移动应用程序,它需要一系列照片并通过SendStream()发送到连接的配置文件。
myTetherAppProfile.SendStream(myTetherManager.RemoteProfiles[idConnected],
'ImageData',
bmpStreamData);
这里出现的问题是接收器应用程序根据连接强度没有得到所有图像流(在接收器应用程序上没有触发ResourceReceived-Event)。
如果我收到传递失败的回复,这将没有问题。但是我没有得到这个(SendStream()
返回" True")
除了实现&#34之外是否还有可能;如果您收到了我的图像,请回复另一条消息" -function即使连接错误也能实现稳定的传输?或者默认情况下App-Tethering设计为有损?
此外,在大量图像之后,我有时会通过同行" -error重置"连接。 (我不确定这个错误是否与实际问题有关,所以我更喜欢发布它。)
答案 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;