我有一个使用 Indy 10 TIdHttpServer(随 Delphi 2006 提供)与 Delphi 2006 Web 服务应用程序通信的 Android 应用程序。Delphi 应用程序生成一个大的 XML 文件并提供它。XML 生成可能会持续 5 分钟以上。
如果持续时间GenerateXml()
超过大约 5 分钟 (*),TIdHTTPResponseInfo.WriteContent
如果在 Delphi IDE 中运行,我会检测到错误 10053:
Socket Error # 10053 Software caused connection abort.
但是,在 android 端没有检测到任何东西,并且HttpGet
-call 会永远持续下去。
我的问题是:
1.) 为什么我会收到错误 10053 以及如何避免它?似乎android超时连接,但http.socket.timeout
设置为无限。
和
2.) 我能做些什么来在客户端检测到这样的错误(除了设置超时,它必须太大而无用)?我可以在 TIdHttpServer.OnException 中做些什么吗?
这是我的代码。Android - 下载功能,在 AsyncTask 中运行:
protected static HttpEntity downloadEntity(String url) throws IOException {
HttpClient client = new DefaultHttpClient();
//Check because of Error 10053: but timeout is null -> infinite
Log.d("TAG", "http.socket.timeout: " + client.getParams().getParameter("http.socket.timeout"));
HttpGet get = new HttpGet(url);
HttpResponse response;
try {
//in case of Error 10053 the following call seems to last forever (in PlainSocketImpl.read)
response = client.execute(get);
} catch (ClientProtocolException e) {
//...
}
//...
return response.getEntity();
}
TIdHttpServer.OnCommandGet 的 Delphi 实现:
procedure ServeXmlDoc(XmlDoc: IXMLDocument; ResponseInfo: TIdHTTPResponseInfo);
var
TempStream: TMemoryStream;
begin
ResponseInfo.ContentType := 'text/xml';
TempStream := TMemoryStream.Create;
XMLDoc.SaveToStream(TempStream);
ResponseInfo.FreeContentStream := True;
ResponseInfo.ContentStream := TempStream;
end;
procedure TMyService.HTTPServerCommandGet(AContext: TIdContext; RequestInfo: TIdHTTPRequestInfo;
ResponseInfo: TIdHTTPResponseInfo);
begin
Coinitialize(nil);
try
//...
ServeXmlDoc(GenerateXml(), ResponseInfo);
finally
CoUninitialize;
end;
end;
编辑:(*)即使在整个过程持续时间不到 2 分钟的情况下,我也做了进一步的测试并遇到了错误。