上一篇
安卓开发怎么连接云服务器
- 行业动态
- 2025-04-22
- 2
前置条件准备
云服务器配置
- 拥有公网IP的云服务器(如阿里云ECS、酷盾安全CVM等)
- 开放所需端口(如80/443/8080等)
- 部署可访问的服务(如REST API、WebSocket服务等)
安卓端权限配置
在AndroidManifest.xml
中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />
连接方式选择
场景 | 协议 | 适用场景 | 常用库 |
---|---|---|---|
简单数据交互 | HTTP/HTTPS | REST API调用 | HttpURLConnection 、OkHttp 、Retrofit |
实时通信 | WebSocket | 聊天、推送 | OkHttp WebSocket、Socket.IO |
文件传输 | FTP/SFTP | 大文件上传下载 | Apache Commons Net |
HTTP请求实现步骤
使用HttpURLConnection
发送GET请求
// 异步任务避免阻塞主线程 new Thread(() -> { try { URL url = new URL("https://your-server.com/api/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); // 解析输入流(如JSON) } else { // 处理错误码 } } catch (Exception e) { e.printStackTrace(); } }).start();
使用OkHttp
发送POST请求(推荐)
OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create( MediaType.parse("application/json"), "{"key":"value"}"); Request request = new Request.Builder() .url("https://your-server.com/api/upload") .post(body) .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 result = response.body().string(); // 处理返回数据 } } });
数据解析与安全
JSON解析(推荐Gson
)
Gson gson = new Gson(); String json = "{"name":"John", "age":30}"; Person person = gson.fromJson(json, Person.class); // 自动映射到Java对象
HTTPS配置(必选)
- 在服务器部署SSL证书(如Let’s Encrypt免费证书)
- 安卓端自动信任权威CA签发的证书
- 自签名证书需手动添加到信任列表:
// 示例:信任自签名证书(仅限开发环境) CertificatePinner certificatePinner = new CertificatePinner.Builder() .add("your-server.com", "sha256/abcdef...") // 替换为证书哈希值 .build(); connection.setCertificatePinner(certificatePinner);
常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
连接超时 | 网络不稳定/服务器响应慢 | 设置超时参数:connection.setConnectTimeout(10,000) |
SSL握手失败 | 证书未信任/协议不匹配 | 检查证书有效性,强制启用TLS1.2:connection.setSSLSocketFactory(...) |
CORS跨域问题 | 服务器未开放跨域 | 服务器端设置Access-Control-Allow-Origin 头 |
完整示例:登录功能实现
服务器端API示例(Node.js)
const express = require('express'); const app = express(); app.use(express.json()); app.post('/login', (req, res) => { const { username, password } = req.body; if (username === 'admin' && password === '123456') { res.json({ token: 'abcdef' }); } else { res.status(401).json({ error: 'Unauthorized' }); } }); app.listen(3000);
安卓端实现
// 创建请求体 JSONObject json = new JSONObject(); json.put("username", "admin"); json.put("password", "123456"); RequestBody body = RequestBody.create( MediaType.parse("application/json"), json.toString()); // 发送POST请求 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://your-server.com/login") .post(body) .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(); // 解析token并存储 } else { // 处理错误(如401) } } });
相关问题与解答
Q1:如何选择合适的云服务器类型?
A:根据需求选择:
- 计算型:高CPU(如视频渲染)
- 存储型:大硬盘(如文件存储)
- 通用型:平衡性能和成本(如小型API服务)
推荐新手从共享型服务器(如阿里云突发性能实例)开始。
Q2:如何传输大文件(如视频)?
A:方案对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|——|——|——|———-|
| 分片上传 | 支持断点续传 | 实现复杂 | 大文件(>100MB) |
| 云存储SDK | 集成方便 | 依赖厂商 | 使用阿里云OSS/酷盾安全COS |
| WebSocket | 实时性高 | 消耗长连接 | 实时传输(如直播)