上一篇
安卓发送网络请求数据包
- 行业动态
- 2025-04-22
- 6
安卓网络请求基础
安卓发送网络请求通常基于以下两种方式:
- HTTP/HTTPS协议(应用层)
- TCP/UDP协议(传输层)
常用网络请求库
库名 | 特点 |
---|---|
OkHttp | 轻量级、支持同步/异步请求、自动管理连接池 |
Retrofit | 基于OkHttp,支持RESTful API、可生成强类型接口代码 |
Volley | 适合小数据量请求、内置缓存机制 |
HttpURLConnection | Android原生API,需手动管理线程和连接复用 |
HTTP数据包结构
以POST请求为例,完整数据包包含:
[请求行] + [请求头] + [空行] + [请求体]
示例(POST /api/login)
部分 | |
---|---|
请求行 | POST /api/login HTTP/1.1 |
请求头 | Content-Type: application/json User-Agent: OkHttp/4.9.3 |
空行 | <空行> |
请求体 | {"username":"test","password":"123456"} |
TCP数据包结构
TCP数据包由以下部分组成:
[源端口] + [目标端口] + [序列号] + [确认号] + [数据偏移] + [标志位] + [窗口] + [校验和] + [紧急指针] + [有效载荷]
关键字段说明
字段 | 作用 |
---|---|
序列号 | 标识数据包中数据的位置,用于重组数据流 |
确认号 | 接收方期望收到的下一个字节序号 |
标志位 | SYN/ACK(连接建立)、FIN(连接关闭) |
窗口大小 | 流量控制,告知对方可接收的数据量 |
发送网络请求的代码示例(OkHttp)
添加依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
发送POST请求
// 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .build(); // 构建请求体 MediaType JSON = MediaType.get("application/json; charset=utf-8"); String json = "{"username":"test","password":"123456"}"; RequestBody body = RequestBody.create(json, JSON); // 构建请求 Request request = new Request.Builder() .url("https://api.example.com/login") .post(body) .addHeader("User-Agent", "AndroidApp/1.0") .build(); // 发送异步请求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理失败 Log.e("Network", "Request failed: " + e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { // 处理成功响应 String responseBody = response.body().string(); Log.d("Network", "Response: " + responseBody); } else { // 处理非2xx响应 Log.e("Network", "Server Error: " + response.code()); } } });
抓包与分析工具
Wireshark/Tcpdump
- 功能:捕获设备发送/接收的原始TCP/IP数据包
- 使用步骤:
- 手机开启USB调试并信任电脑
- 电脑端运行
adb shell tcpdump -i any -s 0 -w capture.pcap
- 停止抓包后用Wireshark打开
capture.pcap
分析
Android Studio Network Inspector
- 功能:图形化查看HTTP请求/响应详情(需Android 10+)
- 使用步骤:
- 连接真机或模拟器
- 在
View > Tool Windows > Network Inspector
中启动监控 - 执行网络请求后查看详细信息
常见问题与解决方案
问题 | 现象 | 解决方案 |
---|---|---|
SSL握手失败 | javax.net.ssl.SSLHandshakeException: Certificate not trusted | 使用自定义TrustManager 禁用证书验证(仅限测试环境) |
大文件上传失败 | java.net.ProtocolException: unexpected end of stream | 分片上传 设置 OkHttp 超时时间检查服务器接收逻辑 |
数据包丢失 | 请求超时或部分数据未到达服务器 | 启用TCP重传机制 检查网络环境 增加重试逻辑 |
相关问题与解答
Q1:如何捕获安卓应用发送的HTTP数据包?
A:
- 使用Wireshark/Tcpdump:通过
adb shell
命令抓包,过滤HTTP协议数据包。adb shell tcpdump -i any -s 0 -w http_capture.pcap
- Android Studio Network Inspector:在真机或模拟器上实时监控HTTP请求,查看Headers和Body。
- 代理工具(如Fiddler/Charles):配置手机代理指向电脑,拦截并分析HTTP流量。
Q2:如何优化安卓网络请求的性能?
A:
- 连接复用:使用
OkHttp
的ConnectionPool
减少TCP握手次数。 - 压缩数据:启用GZIP压缩请求体和响应体。
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(chain -> { Response response = chain.proceed(chain.request()); return response.newBuilder() .header("Content-Encoding", "gzip") .build(); }) .build();
- 缓存策略:使用
Cache-Control
头或OkHttp
缓存机制。 - 异步并发:合理使用线程池,避免阻塞主