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

无法Ping通检测服务器状态:Django服务可达性代码报错排查

解决Java中UnknownHostException检测Django服务器可达性的问题

哦,这个问题我之前也碰到过!你收到的UnknownHostException是因为**InetAddress.getByName()方法不能传入完整的URL(包含http://、端口号和斜杠)**——它的作用是解析主机名或IP地址,你把整个URL传进去,它会把http://192.168.1.100:8000/当成一个无效的主机名来解析,自然找不到对应的地址。

下面给你两种针对性的解决办法:

方法1:仅检测主机是否在线(基于ICMP Ping)

如果你只是想确认192.168.1.100这台设备在局域网内可达,不需要验证Django服务的端口,可以修改代码,只传入纯IP地址:

public boolean isServerReachable() {
 try {
  // 只传递纯IP地址,去掉多余的协议、端口和路径
  return InetAddress.getByName("192.168.1.100").isReachable(500);
 } catch (Exception e) {
  Log.i("result",e.toString());
  return false;
 }
}

⚠️ 注意:这种方式依赖ICMP协议,有些设备可能禁用了Ping响应,而且在Android平台需要确保已经申请了INTERNET权限。

方法2:检测Django服务的特定端口(更准确)

如果要真正验证Django服务器是否在运行(8000端口开放并可连接),推荐使用Socket直接尝试连接端口——这比Ping更能反映服务的可用性:

public boolean isServerReachable() {
    Socket socket = null;
    try {
        // 连接指定IP和8000端口,超时时间设为500毫秒
        socket = new Socket();
        socket.connect(new InetSocketAddress("192.168.1.100", 8000), 500);
        return true;
    } catch (IOException e) {
        Log.i("result", e.toString());
        return false;
    } finally {
        // 记得关闭Socket资源
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                Log.i("result", "关闭Socket失败: " + e.toString());
            }
        }
    }
}

额外注意事项

  • 确保你的Android应用已经在AndroidManifest.xml中声明了网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 不要在主线程调用这个方法!Android会抛出NetworkOnMainThreadException,建议放到子线程、Coroutines或者AsyncTask中执行。
  • 如果想更进一步验证Django服务能正常响应HTTP请求,可以发送一个简单的GET请求(比如用HttpURLConnection或OkHttp),检查返回的HTTP状态码是否为200。

内容的提问来源于stack exchange,提问作者Lechucico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:11:29