You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保Delphi 10.4 Tethering组件具备互联网访问能力并排查无报错连接异常问题

测试Delphi 10.4 Tethering组件读写能力的实用方案

看起来你遇到了Tethering组件连接不稳定的问题,而且最头疼的是没有错误提示——这确实很棘手。结合你提供的消费端代码,我整理了一套逐步测试和排查的方案,帮你验证组件的读写能力,同时定位连接失败的根源。

一、先补上关键的错误监听,别让错误“隐身”

你的现有代码里没有监听Tethering组件的错误事件,这就是为什么你看不到任何错误信息的原因。先给这两个组件加上错误处理:

  1. 给ChessEngineTetheringManager添加OnError事件处理:
procedure TChessOpeningsWizardMainForm.ChessEngineTetheringManagerError(
  const Sender: TObject; const AError: string);
begin
  {$IFDEF DEBUG}
  CodeSite.Send('Tethering Manager错误:' + AError);
  {$ENDIF}
  ShowMessage('连接错误:' + AError);
end;
  1. 给ChessEngineTetheringAppProfile添加OnError事件处理:
procedure TChessOpeningsWizardMainForm.ChessEngineTetheringAppProfileError(
  const Sender: TObject; const AError: string);
begin
  {$IFDEF DEBUG}
  CodeSite.Send('Tethering Profile错误:' + AError);
  {$ENDIF}
  ShowMessage('Profile错误:' + AError);
end;

加上这两个事件后,组件的任何错误都会被捕获,你就能知道连接失败到底是配对问题、网络问题还是资源调用问题了。

二、构建最小化读写测试用例,验证数据传输

要测试读写能力,最好的方式是做一个简单的“回声”测试——消费端发数据,服务端原样返回,这样能完整验证整个数据链路。

第一步:在服务端添加测试资源

如果你的服务端还没有测试用的资源,先加一个:

procedure TEngineServerForm.FormCreate(Sender: TObject);
var
  TestResource: TTetheringResource;
begin
  // 假设你已经初始化了EngineTetheringProfile
  TestResource := TTetheringResource.Create(EngineTetheringProfile);
  TestResource.ResourceName := 'TestEcho';
  TestResource.OnExecute := TestResourceExecute;
end;

procedure TEngineServerForm.TestResourceExecute(const Sender: TObject;
  const AResource: TTetheringResource; const AParameters: TTetheringStream;
  const AResult: TTetheringStream);
var
  InputStr: string;
begin
  // 读取消费端发送的数据
  AParameters.Position := 0;
  InputStr := TStringStream(AParameters).DataString;
  // 返回响应数据
  TStringStream(AResult).WriteString('Echo: ' + InputStr);
end;

第二步:在消费端添加测试按钮和逻辑

在你的主窗体加一个测试按钮,点击后执行读写测试:

procedure TChessOpeningsWizardMainForm.btnTestTetheringClick(Sender: TObject);
var
  TestResource: TTetheringRemoteResource;
  InputStream, ResultStream: TTetheringStream;
  ResponseStr: string;
begin
  // 先确认基础连接状态
  if (ChessEngineTetheringManager.PairedManagers.Count = 0) or
     (ChessEngineTetheringAppProfile.ConnectedProfiles.Count = 0) then
  begin
    ShowMessage('请先确保已配对并连接到服务端');
    Exit;
  end;

  // 找到服务端的测试资源
  TestResource := ChessEngineTetheringAppProfile.RemoteResources.FindByName('TestEcho');
  if not Assigned(TestResource) then
  begin
    ShowMessage('未找到测试资源,请检查服务端配置');
    Exit;
  end;

  // 发送测试数据并接收响应
  InputStream := TStringStream.Create('Tethering读写测试');
  try
    ResultStream := TStringStream.Create('');
    try
      TestResource.Execute(InputStream, ResultStream);
      // 读取响应
      ResultStream.Position := 0;
      ResponseStr := TStringStream(ResultStream).DataString;
      ShowMessage('测试成功!响应:' + ResponseStr);
      {$IFDEF DEBUG}
      CodeSite.Send('Tethering测试响应:' + ResponseStr);
      {$ENDIF}
    finally
      ResultStream.Free;
    end;
  finally
    InputStream.Free;
  end;
end;

点击这个按钮,如果能收到“Echo: Tethering读写测试”的提示,说明读写功能完全正常;如果失败,之前加的错误事件会告诉你具体原因。

三、优化现有代码的调试逻辑,定位连接问题

你的现有代码里只靠计数判断配对和连接状态,这不够准确——PairManager调用后不一定配对成功,Connect后也不一定真的连上了。可以优化一下:

1. 修正EndManagersDiscovery里的配对验证

// 原代码里的配对部分改成这样:
if ARemoteManagers[i].ManagerText = 'COWEngineManager' then
begin
  {$IFDEF DEBUG}
  CodeSite.Send('尝试配对:' + ARemoteManagers[i].ManagerText + ' (' + ARemoteManagers[i].ManagerID + ')');
  {$ENDIF}
  ChessEngineTetheringManager.PairManager(ARemoteManagers[i]);
  // 立即检查配对是否成功
  if ChessEngineTetheringManager.PairedManagers.IndexOf(ARemoteManagers[i].ManagerID) <> -1 then
  begin
    Inc(theTotalPaired);
    {$IFDEF DEBUG}
    CodeSite.Send('配对成功:' + ARemoteManagers[i].ManagerText);
    {$ENDIF}
  end
  else
  begin
    {$IFDEF DEBUG}
    CodeSite.Send('配对失败:' + ARemoteManagers[i].ManagerText);
    {$ENDIF}
  end;
end;

2. 修正EndProfilesDiscovery里的连接验证

// 原代码里的连接部分改成这样:
for i:=0 to ChessEngineTetheringManager.RemoteProfiles.Count-1 do
begin
  {$IFDEF DEBUG}
  CodeSite.Send('尝试连接Profile:' + ChessEngineTetheringManager.RemoteProfiles[i].ProfileText);
  {$ENDIF}
  ChessEngineTetheringAppProfile.Connect(ChessEngineTetheringManager.RemoteProfiles[i]);
  // 立即检查连接是否成功
  if ChessEngineTetheringAppProfile.ConnectedProfiles.IndexOf(ChessEngineTetheringManager.RemoteProfiles[i].ProfileID) <> -1 then
  begin
    {$IFDEF DEBUG}
    CodeSite.Send('Profile连接成功:' + ChessEngineTetheringManager.RemoteProfiles[i].ProfileText);
    {$ENDIF}
  end
  else
  begin
    {$IFDEF DEBUG}
    CodeSite.Send('Profile连接失败:' + ChessEngineTetheringManager.RemoteProfiles[i].ProfileText);
    {$ENDIF}
  end;
end;

这样你就能在CodeSite里看到每一步的具体结果,到底是配对失败还是连接失败。

四、额外的排查小技巧

  • 检查端口开放:Delphi Tethering默认用2020-2022端口,你可以通过ChessEngineTetheringManager.Port属性确认当前使用的端口,然后用telnet命令测试端口是否能连通(比如telnet 服务端IP 2020)。
  • 临时禁用防火墙:虽然你已经加了例外,但有时候防火墙规则可能有冲突,临时禁用防火墙测试一下,如果能正常连接,说明防火墙的例外配置有问题。
  • 监听连接状态变化:给ChessEngineTetheringAppProfile的OnConnect和OnDisconnect事件加处理,实时监控连接状态:
procedure TChessOpeningsWizardMainForm.ChessEngineTetheringAppProfileConnect(
  const Sender: TObject; const AProfile: TTetheringProfile);
begin
  {$IFDEF DEBUG}
  CodeSite.Send('Profile已连接:' + AProfile.ProfileText);
  {$ENDIF}
  fEngineTetheringIsConnected := True;
end;

procedure TChessOpeningsWizardMainForm.ChessEngineTetheringAppProfileDisconnect(
  const Sender: TObject; const AProfile: TTetheringProfile);
begin
  {$IFDEF DEBUG}
  CodeSite.Send('Profile已断开:' + AProfile.ProfileText);
  {$ENDIF}
  fEngineTetheringIsConnected := False;
end;

内容的提问来源于stack exchange,提问作者Mike at Bookup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:09:09