【问题标题】:Delphi XE5 Android Httpserver segmentation fault?Delphi XE5 Android Httpserver分段错误?
【发布时间】:2013-10-04 07:34:08
【问题描述】:

我遇到了这个令人难以置信的疯狂错误! 我将 idhttpserver,webbrowser 放到一个新的移动 android 应用程序上。

我希望服务器向浏览器提供内容。 它在 Windows 上运行良好,但在我的 android 设备上失败。 我测试了一个 tcpserver 和 tcpclient。我可以让客户端连接,但是当我开始 writeln 和 readln 我得到分段错误。

即使我在关闭调试的情况下运行应用程序仍然崩溃...这是代码 sn-p。

procedure TForm37.Button1Click(Sender: TObject);
begin
  IdHTTPServer1.Bindings.Add;
  try
    IdHTTPServer1.Active := true; 
    if IdHTTPServer1.Active then
      Button1.Text := 'Server Started';
  except on E: Exception do
    Button1.Text := 'Server Failed';
  end;
end;

procedure TForm37.Button2Click(Sender: TObject);
var
  astring : string;
begin
  try
    astring := IdHTTP1.Get('http://10.0.1.78:6000/');
    // or  astring := IdHTTP1.Get('http://127.0.0.1:6000/');
    ShowMessage(astring);
  except on E: Exception do
    Button2.Text := 'connection failed';
  end;
end;

procedure TForm37.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentText := 
    '<html><head><title>My First Response</title></head>' +
    '<body>Command: ' + ARequestInfo.Command +
    '<br />Host: ' + ARequestInfo.Host +
    '<br />URI: ' + ARequestInfo.URI +
    '<br />UserAgent: ' + ARequestInfo.UserAgent +
    '</body></html>';
end;

【问题讨论】:

  • Bindings.Add 只是创建一个与 IP 0.0.0.0 端口 80 的新绑定。这些都与您尝试访问的 IP 或端口无关。您应该在添加后配置绑定。
  • 更准确地说,Bindings.Add 创建了一个默认为TIdCustomTCPServer.DefaultPort 属性值的新绑定,恰好在TIdHTTPServer 中默认为80,但可以更改。 Skywalker 可以在调用 Bindings.Add 之前将 DefaultPort 设置为 6000。
  • @Skywalker:请指出是哪一行代码实际引发了错误,并提供完整的错误消息。 Segmentation Fault 相当于 Windows 平台上的 AccessViolation。这可能意味着在您尝试使用之前未正确初始化某些内容。
  • @KenWhite 我在调用 bindings.add 时确实将默认端口设置为 6000;它添加了绑定0.0.0.0:6000,我尝试了本地循环和我的设备IP地址。连接到idhttpserver 不是问题。
  • @RemyLebeau 这就是我发现很难破解在idhttpserver 中实际产生问题的代码,但我使用idtcpserver 和@987654332 运行的测试@ 只需连接然后调用idtcpclient.writeln('hi'); 并在idtcpserver.Onexecute 事件上我输入acontext.connection.socket.readln(avar); 我已经在Windows 上完成了一百万次,几乎没有聊天应用程序和文件共享。我很困惑!我知道在 lazarus 中,您必须在 uses 子句中添加 cthreads 才能使 indy 工作,但我认为这里不是同样的问题。谢谢!

标签: android delphi indy httpserver delphi-xe5


【解决方案1】:

这个答案肯定很不受欢迎。 我也在尝试使用 XE5 开发一个 FM HD Android Datasnap 应用程序,而且我每时每刻都会遇到分段错误 (11)!这是完全不可预测的。 编译为 Win32 目标不会产生错误。 例如: 按钮的事件处理程序将在第一次单击按钮时成功执行并完成,然后在第二次单击时它将无缘无故地产生分段错误。 在这一点上,我的应用程序几乎没有任何用处,但我花了好几个小时尝试一个错误,才能让它完成它的工作。 我个人认为在 Delphi XE5 中进行 Android 开发实际上并不可行,除非您碰巧是已经使用其他开发者开发 Android 应用程序的人。环境和/或您整天没有什么比与之抗争更好的事情了。

【讨论】:

  • 我正在积极开发一个运行良好的 Android 应用程序......大多数问题的发生是因为我们非常习惯于 win32 处理内存释放的方式以及如何创建组件我发现 FMX 仍然在一些错误中非常错误,但在其他方面非常棒。也许发布一些代码给我,我看看我能不能帮你?迈克有一个美好的一天!
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多