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

Android平台下,如何用Delphi 11.x无需原始Socket检测IP地址可达性?

Delphi 11.x 检测指定IP+端口可达性(无需原始Socket)

针对你的需求,以下是几种无需手动编写原始Socket代码的解决方案,适配Delphi 11.x Android平台:

方案1:使用Indy的TIdTCPClient组件

Indy是Delphi自带的网络组件库,TIdTCPClient已封装Socket逻辑,只需简单配置即可快速检测端口连通性:

  1. 在项目中添加IdTCPClient单元引用
  2. 编写检测函数,设置短超时时间(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:30:09