Android使用Retrofit2上传文件失败:无法连接指定服务器问题
解决Retrofit2上传文件无法连接到服务器的问题
咱们一步步来排查你遇到的“无法连接到192.168.10.2:8080”问题,从最基础的网络环境到代码细节逐一确认:
1. 确认设备与服务器在同一局域网
首先要保证你的Android设备和运行服务器的电脑连接的是同一个WiFi网络。然后检查服务器的IP地址是否正确:
- 打开电脑的命令提示符(Windows)或终端(Mac/Linux),输入
ipconfig(Windows)或ifconfig(Mac/Linux),找到当前网络的IPv4地址,确保和你代码中APIUtils里的Base_Url的IP完全一致(比如是不是192.168.10.2,有时候路由器会自动分配新IP)。
2. 验证服务器是否正常运行
先在电脑浏览器里访问http://192.168.10.2:8080/Quanlysinhvien/uploadhinhanh.php,看看能不能正常打开页面。如果浏览器都无法访问,说明服务器本身有问题:
- 检查Tomcat(或你用的服务器软件)是否已经启动;
- 确认8080端口没有被其他程序占用(可以用
netstat -ano | findstr 8080(Windows)或lsof -i :8080(Mac/Linux)查看); - 用Postman等工具测试上传接口,确认服务器端的
uploadhinhanh.php能正常处理文件上传请求。
3. 解决Android 9+的明文HTTP限制
从Android Pie(API 28)开始,系统默认禁止明文HTTP请求,而你用的是http://开头的地址,这会导致连接失败。需要配置允许明文流量:
方法1:直接在Manifest中添加配置
在AndroidManifest.xml的<application>标签里添加:
android:usesCleartextTraffic="true"
方法2(API 30+推荐):使用网络安全配置
- 在
res/xml目录下创建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
- 在
AndroidManifest.xml的<application>标签中引用该配置:
android:networkSecurityConfig="@xml/network_security_config"
4. 检查权限配置与动态申请
虽然你说已经加了权限,但还是要确认:
- 网络权限:
AndroidManifest.xml中必须有<uses-permission android:name="android.permission.INTERNET" />(这个权限不需要动态申请); - 存储权限:如果你的设备是Android 6.0(API 23)及以上,读取外部存储需要动态申请
READ_EXTERNAL_STORAGE权限。可以在DangKyActivity的onCreate方法中添加权限申请代码:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100); }
(注意要导入androidx.core.app.ActivityCompat、androidx.core.content.ContextCompat和android.Manifest类)
5. 修正代码中的细节问题
即使连接问题解决了,这些小错误也可能导致上传失败:
- MediaType拼写错误:在
DangKyActivity中,你写的是MediaType.parse("multipart/from-data"),正确的应该是multipart/form-data; - 超时时间调整:当前Retrofit的连接超时是10秒,局域网连接慢的话可能超时,可以把
connectTimeout改成20秒:
.connectTimeout(20000, TimeUnit.MILLISECONDS)
- 方法名/参数名拼写:
DataClient中的UploadPhot和phto拼写不规范,建议改成uploadPhoto和photo,避免后续维护混淆。
6. 检查电脑防火墙/杀毒软件
电脑上的防火墙或杀毒软件可能会阻止外部设备访问8080端口,你可以暂时关闭防火墙试试,或者在防火墙设置中添加规则,允许8080端口的入站连接。
按照以上步骤逐一排查,应该就能解决连接问题啦!
内容的提问来源于stack exchange,提问作者Nhut Khanh Le
相关产品推荐
相关产品推荐

