当前位置:首页 > 行业动态 > 正文

安卓建立tcp服务器端

环境准备与权限配置

在安卓设备上建立TCP服务器需要确保应用具备网络权限,并在子线程中执行网络操作。

添加网络权限
AndroidManifest.xml 中声明网络权限:

<uses-permission android:name="android.permission.INTERNET" />

线程管理
安卓主线程禁止执行耗时操作(如网络IO),需通过子线程或异步任务处理。

安卓建立tcp服务器端  第1张


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();
                }
            }
        }
    }
}

测试方法

  1. 同一设备测试

    • 使用 Netcat 工具(需安装):
      nc localhost 8080
    • 输入消息后按回车,观察服务器日志。
  2. 跨设备测试

    • 获取安卓设备的IP地址(需与客户端处于同一局域网)。
    • 在PC端使用Telnet或自定义客户端连接:
      telnet <设备IP> 8080

常见问题与解答

问题1:如何处理多个客户端连接?

解答:为每个客户端分配独立线程处理通信,避免阻塞主服务器线程,示例中已通过 new Handler(client).start() 实现。

问题2:如何将接收到的数据更新到UI?

解答:通过 HandlerrunOnUiThread 将数据传递到主线程。

runOnUiThread(() -> textView.setText("Received: " + message));
0