上一篇
安卓创建客户端连接服务器
- 行业动态
- 2025-04-24
- 3963
配置网络权限,用HttpURLConnection/OkHttp创建连接,指定服务器IP与端口,异步处理
安卓客户端连接服务器的实现步骤与方法
配置网络权限
在 AndroidManifest.xml
中声明网络权限,否则应用无法进行网络通信。
<uses-permission android:name="android.permission.INTERNET" />
选择网络协议
根据需求选择协议:
| 协议 | 适用场景 |
|—————-|—————————————————————————–|
| HTTP/HTTPS | 常规请求(如API调用、文件下载) |
| WebSocket | 实时双向通信(如聊天、推送通知) |
| TCP/UDP | 底层自定义协议(需手动处理数据包) |
HTTP请求实现
工具库选择
- OkHttp:轻量级、高效,支持同步/异步请求。
- Retrofit:基于OkHttp,提供RESTful API的声明式调用。
OkHttp示例(GET请求)
// 添加依赖(build.gradle) implementation 'com.squareup.okhttp3:okhttp:4.9.3' // 代码示例 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/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 responseBody = response.body().string(); // 处理成功逻辑 } else { // 处理非200状态码 } } });
Retrofit示例(POST请求)
// 添加依赖(build.gradle) implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 定义接口 public interface ApiService { @POST("user/login") Call<LoginResponse> login(@Body LoginRequest request); } // 使用Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); Call<LoginResponse> call = apiService.login(new LoginRequest("username", "password")); call.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { // 处理响应 } @Override public void onFailure(Call<LoginResponse> call, Throwable t) { // 处理失败 } });
WebSocket通信
工具库选择
- Java-WebSocket:轻量级WebSocket客户端库。
- OkHttp WebSocket:支持WebSocket的OkHttp。
Java-WebSocket示例
// 添加依赖(build.gradle) implementation 'org.java-websocket:Java-WebSocket:1.5.3' // 代码示例 URI serverUri = new URI("wss://echo.websocket.org"); WebSocketClient client = new WebSocketClient(serverUri) { @Override public void onOpen(ServerHandshake handshake) { // 连接成功 send("Hello, WebSocket!"); } @Override public void onMessage(String message) { // 接收消息 Log.d("WebSocket", "Received: " + message); } @Override public void onClose(int code, String reason, boolean remote) {} @Override public void onError(Exception ex) {} }; client.connect();
安全性处理
- HTTPS强制校验:确保服务器部署有效SSL证书。
- 自签名证书信任:开发阶段可临时绕过校验(仅限测试环境)。
// 信任所有证书(仅测试用) OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new TrustAllCertificates(), new X509TrustManager() {...}) .hostnameVerifier((hostname, session) -> true) .build();
错误处理与日志
- 常见错误:网络不可用、超时、SSL异常、服务器返回非200状态码。
- 日志记录:使用
Logcat
或第三方库(如 Timber)记录网络日志。// 示例:捕获超时异常 try { Response response = client.newCall(request).execute(); } catch (IOException e) { if (e instanceof SocketTimeoutException) { Log.e("Network", "请求超时"); } else { Log.e("Network", "网络错误: " + e.getMessage()); } }
单元测试
- 模拟网络响应:使用
Mockito
或Robolectric
模拟服务器返回。// 示例:Mock Retrofit接口 ApiService apiService = mock(ApiService.class); when(apiService.login(any())).thenReturn(new Response<>());
相关问题与解答
问题1:如何优化安卓网络请求的性能?
- 答案:
- 缓存:使用本地缓存(如Room数据库)或HTTP缓存头(如
Cache-Control
)。 - 压缩:启用GZIP压缩减少数据传输量。
- 分页加载:对大数据集采用分页请求(如
PAGE_SIZE=50
)。 - 并发限制:通过线程池或RxJava控制并发请求数。
- 缓存:使用本地缓存(如Room数据库)或HTTP缓存头(如
问题2:如何处理多线程下的并发网络请求?
- 答案:
- 线程池管理:使用
ExecutorService
或OkHttp
的内置线程池。 - 同步机制:对共享资源(如单例Retrofit实例)使用
synchronized
或ConcurrentHashMap
。 - 回调隔离:确保每个请求的回调逻辑独立,避免交叉
- 线程池管理:使用