Android 局域网内的多设备通信方式有多种,其中常见的方式有:
- 基于 TCP/UDP 的 Socket 通信
- 基于 Bluetooth 的近场通信
- 基于 Wifi 的 Wi-Fi Direct 连接
- 基于第三方框架的通信,如 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", "客户端发送的数据是:"