上一篇
安卓建立tcp服务器端
- 行业动态
- 2025-04-22
- 6
环境准备与权限配置
在安卓设备上建立TCP服务器需要确保应用具备网络权限,并在子线程中执行网络操作。
添加网络权限
在 AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
线程管理
安卓主线程禁止执行耗时操作(如网络IO),需通过子线程或异步任务处理。
TCP服务器端实现步骤
以下是使用Java编写TCP服务器的核心逻辑:
步骤 | 说明 | 代码示例 |
---|---|---|
创建ServerSocket | 指定监听端口(如8080) | ServerSocket server = new ServerSocket(8080); |
等待客户端连接 | 调用 accept() 阻塞等待 |
Socket client = server.accept(); |
数据收发 | 通过输入/输出流传输数据 | BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));<br>PrintWriter out = new PrintWriter(client.getOutputStream()); |
关闭资源 | 释放Socket和流资源 | client.close(); server.close(); |
完整代码示例
public class MainActivity extends AppCompatActivity { private static final int PORT = 8080; private ServerThread serverThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启动服务器线程 serverThread = new ServerThread(PORT); serverThread.start(); } @Override protected void onDestroy() { super.onDestroy(); // 停止服务器线程 serverThread.interrupt(); } // 定义服务器线程类 private static class ServerThread extends Thread { private int port; private ServerSocket server; public ServerThread(int port) { this.port = port; } @Override public void run() { try { // 创建ServerSocket并监听端口 server = new ServerSocket(port); while (!isInterrupted()) { // 接受客户端连接 Socket client = server.accept(); // 处理客户端请求(新建线程避免阻塞) new Handler(client).start(); } } catch (IOException e) { e.printStackTrace(); } finally { // 关闭服务器 if (server != null) { try { server.close(); } catch (IOException ignored) {} } } } // 内部类处理客户端通信 private class Handler extends Thread { private Socket socket; public Handler(Socket socket) { this.socket = socket; } @Override public void run() { try { // 读取客户端数据 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String message = in.readLine(); Log.d("TCPServer", "Received: " + message); // 发送响应数据 PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println("Hello from Android Server!"); out.flush(); // 关闭连接 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
测试方法
同一设备测试
- 使用
Netcat
工具(需安装):nc localhost 8080
- 输入消息后按回车,观察服务器日志。
- 使用
跨设备测试
- 获取安卓设备的IP地址(需与客户端处于同一局域网)。
- 在PC端使用Telnet或自定义客户端连接:
telnet <设备IP> 8080
常见问题与解答
问题1:如何处理多个客户端连接?
解答:为每个客户端分配独立线程处理通信,避免阻塞主服务器线程,示例中已通过 new Handler(client).start()
实现。
问题2:如何将接收到的数据更新到UI?
解答:通过 Handler
或 runOnUiThread
将数据传递到主线程。
runOnUiThread(() -> textView.setText("Received: " + message));