当前位置:首页 > 行业动态 > 正文

安卓与服务器建立连接

安卓通过HTTP/HTTPS协议与服务器建立连接,需配置网络权限,使用OkHttp/Retrofit等库发起请求,处理异步回调及异常,确保数据传输

安卓与服务器建立连接的实现方式

网络权限配置

安卓应用需在 AndroidManifest.xml 中声明网络权限:

<uses-permission android:name="android.permission.INTERNET" />

注意:Android 6.0+ 需动态申请敏感权限(如定位权限可能间接影响网络状态判断)。


HTTP 请求实现方式

使用 HttpURLConnection

// 示例:发送 GET 请求
URL url = new URL("https://example.com/api/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000); // 连接超时 5秒
connection.setReadTimeout(5000);    // 读取超时 5秒
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
    InputStream inputStream = connection.getInputStream();
    // 读取输入流(如 JSON 解析)
} else {
    // 处理错误码(如 404、500)
}
connection.disconnect();

使用第三方库(OkHttp / Retrofit)

库名 特点 适用场景
OkHttp 轻量级,支持缓存、拦截器 简单请求、文件上传
Retrofit 基于 OkHttp,支持注解、自动解析 JSON 复杂 API 接口调用

OkHttp 示例

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
    .url("https://example.com/api/data")
    .build();
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 处理失败
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String json = response.body().string();
            // 解析 JSON
        }
    }
});

SSL 证书处理

信任自签名证书(开发环境)

// 忽略证书校验(仅限测试环境)
connection.setSSLSocketFactory(new InsecureSSLSocketFactory());
connection.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true; // 直接信任所有证书
    }
});

HTTPS 双向认证(生产环境)

  • 将服务器公钥导入客户端(通过 KeyStore)。
  • 配置 SSLSocketFactory 并验证服务器证书。

异步处理网络请求

方式 优点 缺点
AsyncTask 简单易用,UI 线程回调 生命周期依赖 Activity
Handler+Thread 灵活控制线程,可复用 代码较繁琐
线程池 高效管理线程,适合多任务 需手动处理线程同步
Coroutine 简洁异步代码,避免回调地狱 需 Kotlin 支持

Kotlin Coroutine 示例

GlobalScope.launch(Dispatchers.IO) {
    val result = runBlocking { // 模拟网络请求
        // 执行网络操作
    }
    withContext(Dispatchers.Main) {
        // 更新 UI
    }
}

错误处理与网络状态检查

常见错误类型

错误类型 触发原因 处理方式
SocketTimeout 网络延迟或服务器无响应 重试机制 + 超时配置
UnknownHost 域名解析失败(如断网) 提示用户检查网络
SSLHandshake 证书不匹配或被改动 校验证书或替换可信证书

网络状态检查

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
boolean isConnected = networkInfo != null && networkInfo.isConnected();

相关问题与解答

Q1:如何实现大文件上传并显示进度?

A

  • 使用 MultipartBody(OkHttp/Retrofit)或分块上传(HttpURLConnection)。
  • 监听输出流写入进度,通过 ProgressListener 更新 UI。
  • 示例(OkHttp):
    RequestBody fileBody = RequestBody.create(mediaType, file);
    ProgressRequestBody body = new ProgressRequestBody(fileBody, progress -> {
      // 更新进度条(需切换到主线程)
    });

Q2:如何在后台持续保持与服务器的连接?

A

  • 使用 JobScheduler(API 21+)或 WorkManager(支持全版本)定期拉取数据。
  • 通过 Service 结合 Socket 实现长连接(如 WebSocket)。
  • 示例(WorkManager):
    PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, 15, TimeUnit.MINUTES)
      .build();
    WorkManager.getInstance(context).enqueue(work);
0