安卓连接服务器的实现方式
HTTP/HTTPS请求
适用场景:RESTful API调用、文件下载、提交表单等。
常用库:OkHttp、Retrofit、Volley。
AndroidManifest.xml
中声明INTERNET
权限。xml <uses-permission android:name="android.permission.INTERNET" />
java ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); boolean connected = cm.getActiveNetworkInfo() != null;
java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("https://example.com/api").build(); client.newCall(request).enqueue(new Callback() { ... });
java @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { String body = response.body().string(); // 解析数据 } }
WebSocket长连接
适用场景:实时聊天、股票行情、游戏等需要持续通信的场景。
常用库:OkHttp WebSocket、Socket.IO。
步骤 | 说明 | 代码示例(OkHttp) |
---|---|---|
建立连接 | 通过Request 创建WebSocket。 |
“`java Request request = new Request.Builder().url(“wss://example.com/socket”).build(); WebSocket ws = client.newWebSocket(request, new WebSocketListener() { … }); |
收发消息 | 监听onMessage 事件并发送数据。 |
java @Override public void onMessage(WebSocket webSocket, String text) { webSocket.send("回应: " + text); } |
断线重连 | 监听onFailure 并尝试重连。 |
java @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { // 延迟重连 } |
TCP/UDP Socket编程
适用场景:自定义协议传输、局域网通信、文件传输。
注意:需处理线程和IO流。
java Socket socket = new Socket("192.168.1.1", 8080);
OutputStream
写入数据。java PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println("Hello Server"); out.flush();
InputStream
读取响应。java BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String response = in.readLine();
java socket.close();
常见问题与解决方案
网络请求失败或超时
- 原因:网络不可用、服务器地址错误、防火墙拦截。
- 解决方案:
- 检查
AndroidManifest
中的网络权限。 - 使用
ConnectivityManager
确认网络状态。 - 设置超时时间:
client.setConnectTimeout(10, TimeUnit.SECONDS);
。
- 检查
HTTPS证书校验失败
- 原因:服务器使用自签名证书或证书不被信任。
- 解决方案:
- 忽略证书校验(仅限测试环境):
java client.sslSocketFactory(new SSLContext().getSocketFactory(), trustManager);
- 生产环境建议使用可信证书或配置证书信任白名单。
- 忽略证书校验(仅限测试环境):
相关问题与解答
问题1:如何优化安卓网络请求的性能?
解答:
- 缓存响应:使用
OkHttp
的缓存机制或第三方库(如Glide
)。 - 压缩数据:启用GZIP压缩(服务器和客户端均需支持)。
- 合并请求:减少频繁的网络调用,批量处理数据。
- 异步处理:避免阻塞UI线程,使用
ExecutorService
或协程。
问题2:如何在安卓中处理大文件上传?
解答:
- 分片上传:将文件分割为多个小块(如1MB/片),逐片上传并支持断点续传。
- 使用进度监听:通过
OkHttp
的ProgressResponseBody
或Retrofit
的Callback
监控上传进度。 - 后台服务:在
Service
或WorkManager
中执行上传任务,避免Activity被回收导致