基于 P2P 技术的 Android 局域网内设备通信实践

本文介绍了Android设备间进行局域网通信的常见方式,包括基于TCP/UDP的Socket通信、基于Bluetooth的近场通信和基于Wi-FiDirect的直接连接。每种方式都有其优劣势,如Socket适合高效传输,Bluetooth适用于短距离通信,Wi-FiDirect则提供无需路由器的点对点连接。文章提供了每种通信方式的Java代码示例,并提到了云服务提供商如阿里云在远程通信中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 局域网内的多设备通信方式有多种,其中常见的方式有:

  1. 基于 TCP/UDP 的 Socket 通信
  2. 基于 Bluetooth 的近场通信
  3. 基于 Wifi 的 Wi-Fi Direct 连接
  4. 基于第三方框架的通信,如 MQTT、Websocket 等

每种方式都有其适用范围,下面分别介绍一下它们的示例代码、优劣势。

1. 基于 TCP/UDP 的 Socket 通信

Socket 是 TCP/UDP 套接字的抽象,通常用于实现网络上的应用程序通信。基于 Socket 的通信方式可以实现高效的传输,支持实时数据处理,其主要缺点是需要进行网络编程和网络拓扑发现。

下面是一个基于 TCP 的 Socket 通信示例,它通过创建一个服务器 Socket 和客户端 Socket 实现简单的数据传输:

// 服务器端代码
public class Server {
   
    public static void main(String[] args) throws Exception {
   
        // 创建一个服务器 Socket,绑定到指定的端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器已启动,等待客户端连接...");

        // 等待客户端连接
        Socket socket = serverSocket.accept();
        System.out.println("客户端已连接[" + socket.getInetAddress().getHostAddress() + "]");

        // 获取输入输出流
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        // 循环读取客户端发送的数据
        while (true) {
   
            String data = reader.readLine();
            System.out.println("客户端发送了消息:" + data);

            // 发送响应消息给客户端
            writer.write("服务端收到了消息[" + data + "]");
            writer.newLine();
            writer.flush();
        }
    }
}
// 客户端代码
public class Client {
   
    public static void main(String[] args) throws Exception {
   
        // 创建一个 Socket 连接服务器
        Socket socket = new Socket("localhost", 8888);

        // 获取输入输出流
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        // 循环向服务器发送数据
        while (true) {
   
            // 发送消息给服务器
            writer.write("Hello, World!");
            writer.newLine();
            writer.flush();

            // 接收服务器响应消息
            String data = reader.readLine();
            System.out.println("服务器返回了响应消息:" + data);

            Thread.sleep(1000);
        }
    }
}

在上面的代码中,我们使用 Java 中的 ServerSocket 和 Socket 类来实现基于 TCP 的 Socket 通信。服务器端通过创建一个服务器 Socket 并等待客户端连接,收到连接请求后可以使用输入输出流来实现数据传输。客户端通过创建一个 Socket 向服务器发起连接,并使用输入输出流发送和接收数据。

2. 基于 Bluetooth 的近场通信

Bluetooth 是一种典型的无线短距离通信技术,它可以在近距离范围内实现设备之间的通信。Android 提供了 BluetoothAdapter 和 BluetoothSocket 等 API 来支持基于 Bluetooth 的通信,它们可以实现设备之间的数据传输、文件传输等功能。其主要缺点是受制于蓝牙信号的干扰和距离限制。

以下是一个基于 Bluetooth 的数据传输示例,它通过使用 BluetoothSocket 类实现数据传输:

// 服务端代码
public class ServerActivity extends AppCompatActivity {
   
    private static final int REQUEST_ENABLE_BT = 123;
    private BluetoothAdapter bluetoothAdapter;
    private BluetoothServerSocket serverSocket;
    private Thread acceptThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_server);

        // 初始化 BluetoothAdapter
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
   
            Toast.makeText(this, "该设备不支持蓝牙", Toast.LENGTH_SHORT).show();
            return;
        }

        // 开启蓝牙
        if (!bluetoothAdapter.isEnabled()) {
   
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, REQUEST_ENABLE_BT);
        }

        // 服务端开启监听线程
        acceptThread = new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                try {
   
                    // 创建 BluetoothServerSocket
                    serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("BluetoothServer", UUID.randomUUID());

                    while (true) {
   
                        // 等待客户端连接
                        BluetoothSocket clientSocket = serverSocket.accept();
                        Log.d("Server", "客户端已连接:" + clientSocket.getRemoteDevice().getName());

                        // 获取输入输出流
                        InputStream inputStream = clientSocket.getInputStream();
                        OutputStream outputStream = clientSocket.getOutputStream();

                        // 读取客户端发送的数据
                        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                        String data = reader.readLine();
                        Log.d("Server", "客户端发送的数据是:"
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值