Android平台下,如何用Delphi 11.x无需原始Socket检测IP地址可达性?
Delphi 11.x 检测指定IP+端口可达性(无需原始Socket)
针对你的需求,以下是几种无需手动编写原始Socket代码的解决方案,适配Delphi 11.x Android平台:
方案1:使用Indy的TIdTCPClient组件
Indy是Delphi自带的网络组件库,TIdTCPClient已封装Socket逻辑,只需简单配置即可快速检测端口连通性:
- 在项目中添加
IdTCPClient单元引用 - 编写检测函数,设置短超时时间(1-2秒为宜)避免卡顿:
function IsServerReachable(const AIP: string; APort: Word; ATimeoutMS: Integer = 1500): Boolean; var IdTCPClient: TIdTCPClient; begin Result := False; IdTCPClient := TIdTCPClient.Create(nil); try IdTCPClient.Host := AIP; IdTCPClient.Port := APort; IdTCPClient.ConnectTimeout := ATimeoutMS; try IdTCPClient.Connect; Result := IdTCPClient.Connected; IdTCPClient.Disconnect; except // 连接失败直接返回False,无需额外处理异常 end; finally IdTCPClient.Free; end; end;
调用示例:
if not IsServerReachable('192.168.1.100', 1234) then begin ShowMessage('服务器离线,应用将退出'); Terminate; // 终止应用 end;
注意:超时时间需合理设置,过短易误判网络波动,过长仍会导致卡顿。
方案2:调用Android原生InetAddress API
利用Delphi的JNI桥接直接调用Android系统的网络检测方法,无需依赖第三方组件:
uses Androidapi.JNI.Net, Androidapi.Helpers; function IsHostReachable(const AIP: string; ATimeoutMS: Integer = 1500): Boolean; var InetAddr: JInetAddress; begin Result := False; try InetAddr := TJInetAddress.JavaClass.getByName(StringToJString(AIP)); // 检测IP是否可达,超时单位为毫秒 Result := InetAddr.isReachable(ATimeoutMS); except // 捕获解析或网络异常,返回False end; end;
补充说明
- 该方法仅检测IP可达性,若需验证端口开放状态,可结合方案1的
TIdTCPClient使用 - 需在
AndroidManifest.xml中添加必要权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
方案3:使用THTTPClient(适用于带HTTP服务的服务器)
如果你的服务器同时提供HTTP接口,可通过请求轻量级接口快速检测:
uses System.Net.HttpClient; function IsHttpServerAlive(const AUrl: string; ATimeoutMS: Integer = 1500): Boolean; var HttpClient: THttpClient; Response: IHTTPResponse; begin Result := False; HttpClient := THttpClient.Create; try HttpClient.Timeout := ATimeoutMS; try Response := HttpClient.Get(AUrl); Result := Response.StatusCode = 200; except end; finally HttpClient.Free; end; end;
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

