无法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
相关产品推荐
相关产品推荐

