在安卓应用中搭建服务器时,需在AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
通过ServerSocket
类监听指定端口,示例代码如下:
import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; public class ServerConfig { private int port = 8080; // 默认端口号 public void startServer() { new Thread(() -> { try { ServerSocket serverSocket = new ServerSocket(port); // 等待客户端连接 while (true) { Socket clientSocket = serverSocket.accept(); // 处理客户端请求(需新建线程或线程池) } } catch (IOException e) { e.printStackTrace(); } }).start(); } }
可通过配置文件或用户输入动态指定端口:
// 从SharedPreferences读取端口号 SharedPreferences prefs = getSharedPreferences("config", MODE_PRIVATE); int port = prefs.getInt("server_port", 8080); // 默认8080
端口范围 | 用途建议 | 备注 |
---|---|---|
1-1023 | 系统保留端口 | 需特殊权限,安卓通常不可用 |
1024-49151 | 用户自定义端口 | 推荐使用(如8080、8000) |
49152-65535 | 动态分配端口 | 可临时使用,但需确保未被占用 |
常见异常及解决方案:
| 异常类型 | 原因 | 解决方案 |
|———-|——|———-|
| BindException: Address already in use
| 端口被占用 | 更换端口号或关闭占用进程 |
| IOException: Permission denied
| 缺少网络权限 | 检查AndroidManifest.xml
权限声明 |
解答:
优先使用高位端口(如8080、8000、9000),避免使用1024以下的系统保留端口,若需动态分配,可调用ServerSocket(0)
让系统自动分配空闲端口,并通过serverSocket.getLocalPort()
获取实际端口号。
解答:
为每个客户端连接创建独立线程或使用线程池。
ExecutorService pool = Executors.newCachedThreadPool(); while (true) { Socket client = serverSocket.accept(); pool.execute(() -> handleClient(client)); // 处理客户端逻辑 }