如何确保Delphi 10.4 Tethering组件具备互联网访问能力并排查无报错连接异常问题
测试Delphi 10.4 Tethering组件读写能力的实用方案
看起来你遇到了Tethering组件连接不稳定的问题,而且最头疼的是没有错误提示——这确实很棘手。结合你提供的消费端代码,我整理了一套逐步测试和排查的方案,帮你验证组件的读写能力,同时定位连接失败的根源。
一、先补上关键的错误监听,别让错误“隐身”
你的现有代码里没有监听Tethering组件的错误事件,这就是为什么你看不到任何错误信息的原因。先给这两个组件加上错误处理:
- 给
ChessEngineTetheringManager添加OnError事件处理:
procedure TChessOpeningsWizardMainForm.ChessEngineTetheringManagerError( const Sender: TObject; const AError: string); begin {$IFDEF DEBUG} CodeSite.Send('Tethering Manager错误:' + AError); {$ENDIF} ShowMessage('连接错误:' + AError); end;
- 给
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
相关产品推荐
相关产品推荐

