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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_server);// 初始化 BluetoothAdapterbluetoothAdapter = 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() {@Overridepublic void run() {try {// 创建 BluetoothServerSocketserverSocket = 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", "客户端发送的数据是:" + data);// 发送响应给客户端BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));writer.write("服务端收到了数据[" + data + "]");writer.newLine();writer.flush();}} catch (IOException e) {e.printStackTrace();}}});acceptThread.start();}@Overrideprotected void onDestroy() {super.onDestroy();// 关闭服务端 Socketif (serverSocket != null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}// 停止监听线程if (acceptThread != null) {acceptThread.interrupt();}}
}
// 客户端代码
public class ClientActivity extends AppCompatActivity {private BluetoothAdapter bluetoothAdapter;private BluetoothDevice serverDevice;private BluetoothSocket socket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_client);// 查找蓝牙设备bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();for (BluetoothDevice device : devices) {if ("BluetoothServer".equals(device.getName())) {serverDevice = device;break;}}if (serverDevice == null) {Toast.makeText(this, "未找到配对设备", Toast.LENGTH_SHORT).show();return;}// 连接蓝牙服务端try {socket = serverDevice.createRfcommSocketToServiceRecord(UUID.randomUUID());socket.connect();Log.d("Client", "连接服务器成功:" + socket.getRemoteDevice().getName());// 获取输入输出流InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();// 向服务端发送数据BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));writer.write("Hello, World!");writer.newLine();writer.flush();// 读取服务端响应数据BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String data = reader.readLine();Log.d("Client", "服务端返回的响应:" + data);} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();// 关闭客户端 Socketif (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

在上面的代码中,我们使用了 BluetoothAdapter 和 BluetoothSocket 类来实现基于 Bluetooth 的近场通信。服务端通过创建蓝牙服务器 Socket 并等待客户端连接,客户端通过创建一个蓝牙 Socket 连接服务器。在每次通信时,我们都通过输入输出流来发送和接收数据。

3. 基于 Wifi 的 Wi-Fi Direct 连接

Wi-Fi Direct 是一种 P2P 网络连接方式,它使用 Wi-Fi 技术来实现设备之间的直接通信。如果设备支持 Wi-Fi Direct,我们可以使用 Android 提供的 WifiP2pManager 类并结合 WifiP2pManager.Channel 类来实现基于 Wi-Fi Direct 的通信。其主要优势是无需路由器就可以建立点对点连接,传输速度较快。缺点是目前有一定的兼容性限制,且Wi-Fi 信号干扰和距离限制较大。

以下是一个基于 Wi-Fi Direct 的数据传输示例,它使用 WifiP2pManager 和 WifiP2pManager.Channel 类来实现数据传输:

// 服务端代码
public class ServerActivity extends AppCompatActivity {private WifiP2pManager wifiP2pManager;private WifiP2pManager.Channel channel;private BroadcastReceiver receiver;private ServerSocket serverSocket;private Thread acceptThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_server);// 初始化 WifiP2pManagerwifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);if (wifiP2pManager == null) {Toast.makeText(this, "该设备不支持 Wi-Fi Direct", Toast.LENGTH_SHORT).show();return;}// 初始化 Channelchannel = wifiP2pManager.initialize(this, getMainLooper(), null);// 注册广播接收器receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {// Wi-Fi Direct 状态发生变化int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {Log.d("Server", "Wi-Fi Direct 已启用");} else {Log.d("Server", "Wi-Fi Direct 已停用");}} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {// 设备列表发生变化wifiP2pManager.requestPeers(channel, new WifiP2pManager.PeerListListener() {@Overridepublic void onPeersAvailable(WifiP2pDeviceList peers) {for (WifiP2pDevice device : peers.getDeviceList()) {Log.d("Server", "发现设备:" + device.deviceName + ", " + device.deviceAddress);// 开始连接设备if (device.deviceName.equals("client")) {WifiP2pConfig config = new WifiP2pConfig();config.deviceAddress = device.deviceAddress;wifiP2pManager.connect(channel, config, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {Log.d("Server", "连接设备成功");}@Overridepublic void onFailure(int reason) {Log.d("Server", "连接设备失败:" + reason);}});}}}});} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {// 连接状态发生变化NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);if (networkInfo.isConnected()) {// 建立连接Log.d("Server", "连接已建立");// 创建服务器 Sockettry {serverSocket = new ServerSocket(8888);Log.d("Server", "服务器 Socket 已创建");} catch (IOException e) {e.printStackTrace();}// 开启接收线程监听客户端连接acceptThread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {// 等待客户端连接final Socket socket = serverSocket.accept();Log.d("Server", "客户端已连接:" + socket.getInetAddress());// 读取客户端发送的数据BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String data = reader.readLine();// 发送响应给客户端BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));writer.write("服务端收到了数据[" + data + "]");writer.newLine();writer.flush();} catch (IOException e) {e.printStackTrace();}}}});acceptThread.start();} else {// 断开连接Log.d("Server", "连接已断开");if (serverSocket != null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}if (acceptThread != null) {acceptThread.interrupt();}}} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {// 本设备信息发生变化WifiP2pDevice device = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);Log.d("Server", "本设备信息发生变化:" + device.deviceName + ", " + device.deviceAddress);}}};IntentFilter filter = new IntentFilter();filter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);filter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);filter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);registerReceiver(receiver, filter);// 发现并连接设备wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {Log.d("Server", "开始查找设备");}@Overridepublic void onFailure(int reason) {Log.d("Server", "查找设备失败:" + reason);}});}@Overrideprotected void onDestroy() {super.onDestroy();// 关闭服务端 Socketif (serverSocket != null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}// 停止监听线程if (acceptThread != null) {acceptThread.interrupt();}// 注销广播接收器unregisterReceiver(receiver);}
}
// 客户端代码
public class ClientActivity extends AppCompatActivity {private WifiP2pManager wifiP2pManager;private WifiP2pManager.Channel channel;private BroadcastReceiver receiver;private WifiP2pDevice serverDevice;private Socket socket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_client);// 初始化 WifiP2pManagerwifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);if (wifiP2pManager == null) {Toast.makeText(this, "该设备不支持 Wi-Fi Direct", Toast.LENGTH_SHORT).show();return;}// 初始化 Channelchannel = wifiP2pManager.initialize(this, getMainLooper(), null);// 注册广播接收器receiver = new BroadcastReceiver() {@Overridepublic            void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {// Wi-Fi Direct 状态发生变化int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {Log.d("Client", "Wi-Fi Direct 已启用");} else {Log.d("Client", "Wi-Fi Direct 已停用");}} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {// 设备列表发生变化wifiP2pManager.requestPeers(channel, new WifiP2pManager.PeerListListener() {@Overridepublic void onPeersAvailable(WifiP2pDeviceList peers) {for (WifiP2pDevice device : peers.getDeviceList()) {Log.d("Client", "发现设备:" + device.deviceName + ", " + device.deviceAddress);// 记录服务端设备if (device.deviceName.equals("server")) {serverDevice = device;}}}});} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {// 连接状态发生变化NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);if (networkInfo.isConnected()) {// 建立连接Log.d("Client", "连接已建立");// 请求连接信息wifiP2pManager.requestConnectionInfo(channel, new WifiP2pManager.ConnectionInfoListener() {@Overridepublic void onConnectionInfoAvailable(WifiP2pInfo info) {if (info.groupFormed && info.isGroupOwner) {// 服务端不需要做额外处理Log.d("Client", "该设备为服务端");} else if (info.groupFormed) {// 客户端发起连接Log.d("Client", "该设备为客户端");try {socket = new Socket();socket.connect(new InetSocketAddress(serverDevice.deviceAddress, 8888), 5000);Log.d("Client", "连接服务器成功:" + socket.getInetAddress());// 向服务端发送数据BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));writer.write("Hello, World!");writer.newLine();writer.flush();// 读取服务端响应数据BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String data = reader.readLine();Log.d("Client", "服务端返回的响应:" + data);} catch (IOException e) {e.printStackTrace();}}}});} else {// 断开连接Log.d("Client", "连接已断开");if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {// 本设备信息发生变化WifiP2pDevice device = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);Log.d("Client", "本设备信息发生变化:" + device.deviceName + ", " + device.deviceAddress);}}};IntentFilter filter = new IntentFilter();filter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);filter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);filter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);registerReceiver(receiver, filter);// 扫描设备wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {Log.d("Client", "开始查找设备");}@Overridepublic void onFailure(int reason) {Log.d("Client", "查找设备失败:" + reason);}});}@Overrideprotected void onDestroy() {super.onDestroy();// 关闭客户端 Socketif (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}// 注销广播接收器unregisterReceiver(receiver);}
}

在上面的代码中,我们使用了 WifiP2pManager 和 WifiP2pManager.Channel 类来实现基于 Wi-Fi Direct 的通信。服务端通过创建服务器 Socket 并等待客户端连接,客户端通过创建一个 Socket 连接服务器。在每次通信时,我们都通过输入输出流来发送和接收数据。

至此,我们介绍了 Android 中常见的几种局域网通信方式,并给出了示例代码。不同的通信方式有不同的适用场景和特点,开发者可以根据实际需求选择合适的通信方式进行开发。除了局域网通信,如果需要进行远程通信,可以使用云服务提供商的 API,比如阿里云、腾讯云、AWS 等。这些云服务提供商提供了丰富的服务和 API,可以满足不同的需求,比如对象存储、云数据库、虚拟机、消息队列等等。

以阿里云为例,可以使用阿里云的移动推送服务,实现消息的推送和设备间的通信。例如,我们可以使用阿里云移动推送 SDK 将消息推送给指定的设备或者设备群组,也可以使用自定义消息进行设备间的通信。推送服务的使用需要先在阿里云控制台创建应用,并配置相关参数,然后在客户端集成移动推送 SDK,根据文档进行 API 调用即可。

此外,阿里云还提供了多种云计算服务,可以用于搭建云服务器、存储数据、处理数据等等。比如,我们可以使用阿里云的云服务器 ECS 来搭建一个 Web 服务器,将自己的应用部署到云服务器上,并使用域名解析服务进行域名解析,实现较为稳定和可靠的远程通信。

当然,不同的云服务提供商提供的服务和 API 也有所不同,开发者可以根据需求进行选择。但无论是局域网通信还是云服务通信,都需要进行网络编程和安全认证,具有一定的复杂性。因此,建议在开发前仔细阅读文档,并根据需求进行合理的设计和实现。

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

  1. 计算机网络校园局域网课题,毕业论文基于VLAN技术的校园局域网建设word文档_全文免费在线阅读(推荐阅读)...

    <[毕业论文]基于VLAN技术的校园局域网建设.doc>由会员分享,可免费在线阅读全文,更多与<[毕业论文]基于VLAN技术的校园局域网建设(word文档)_全文免费在线阅读> ...

  2. Android与物联网设备通信-自定义报文与字节序

    前几节我们把网络通信中的基础都过了一遍,今天真正开始秀操作了.本节主要讲解如何在应用层上去定义报文的结构体.良好的报文设计会让今后的业务扩展变得轻松.顺带会讲解一下字节序. 可以发现最近的章节都把两个 ...

  3. Android与物联网设备通信 - 字节报文组装与解析

    工作调动.暂时停更了一段时间.续上一篇我们学习了如何去自定义一组报文,今天我们接着解析和组装报文. 前面我们讲过在物联网通信中实际上不论我们使用什么方式作为通信介质,其本质就是字节.所以我再一次对本章 ...

  4. UDP之广播搜索局域网内设备信息

    文章目录 UDP是什么? UDP核心API DatagramSocket构造方法介绍 DatagramSocket常用方法 DatagramPacket的构造方法 DatagramPacket的常用方 ...

  5. 利用SMB协议实现局域网内设备文件的共享

    文章目录 参考资料 说明 步骤1:[windows]开启SMB协议 步骤2:[windows]创建新的用户账号 步骤3:[windows]共享文件夹 属性-共享-共享 属性-共享-高级共享 步骤4:[ ...

  6. 网关,路由,局域网内的通信及不同的网络间通信实现的原理剖析

    百度百科定义网关: 网关(Gateway)又称网间连接器.协议转换器.网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连.网关既可以用于广域网互连,也可以用于局域网 ...

  7. 基于nfc技术的android移动支付终端的设计与实现,基于Android的NFC移动应用平台的设计与实现...

    摘要: 近年来,NFC作为一种安全,快速,低功耗的近距离非接触无线通信技术,受到了广泛关注.然而,尽管Android操作系统上已经集成了NFC技术及相关协议,NFC在移动端的应用仍然未能普及,已有的应 ...

  8. Hyper-V虚拟Openwrt软路由拨号后局域网内设备访问上级光猫的方法

    在笔者的另一篇文章<Hyper-V安装lede软路由历程及注意事项>中详细叙述了我在Hyper-V中安装lede(openwrt)软路由的经历.当时部署是通过dhcp方式从上级路由获取ip ...

  9. Java基于socket编程实现局域网内简单通信

    运行客户端程序将创建一个客户端套接字,并与指定的服务器建立连接,接收了服务端发来的消息后关闭连接.服务端启动后会循环接收客户端连接,在接收到连接后,向该客户端发送 "Hello World! ...

最新文章

  1. 如果你是PM,想转PM,拿走
  2. 她们,在字节跳动写代码
  3. 用Python制作一个简易的抽奖程序
  4. 表格隔行变色_CSS实现鼠标悬停高亮
  5. 阿里云发布多款云管工具,任何角色都可以轻松完成云上运维
  6. 飞鸽传书绿色版 为什么比较多人用?
  7. 重建SYSVOL和NETLOGON共享
  8. mysql 索引越界_mysql隐式转换造成索引失效的事故总结
  9. excel制作录入和查询系统_叮咚!您有一份Excel人员信息查询系统,请您查收~
  10. 如何看到并删除电脑的操作记录
  11. 浏览器保存图片时,将jfif改为jpg格式
  12. H.264编码实验--JM18.6H264Visa
  13. android仿微信录制短视频,拍照,自动聚焦,手动聚焦,滑动缩放功能(Camera+TextureView+rxjava实现)
  14. 蓝牙技术|蓝牙标准将迈向 6GHz 频段,蓝牙技术迈向新台阶
  15. docker pull redis 镜像
  16. 【Python 实战基础】如何绘制树状图展示Python数据分析师的知识结构
  17. 51单片机模拟串口发送接收数据(不使用SBUF)
  18. xmanager显示linux7桌面,Xmanager 5远程连接CentOS7图形化界面
  19. JMS入门(一)--JMS基础
  20. 管理储备与应急储备的区别--建群网培PMP

热门文章

  1. 解决 rsync IO input / output error , failed verification — update discarded
  2. python如何打包,实现pip install
  3. 特征点检测之SURF
  4. Android面试指南:说说你对组件化/模块化的理解
  5. 黑盒测试方法---理论
  6. CE中搜索汉字 + VB 转换汉字Unicode码
  7. python写入excel公式有哪些库_Python读写Excel文件第三方库汇总,你想要的都在这儿!...
  8. 【Proteus仿真】【51单片机】空调温度控制系统设计
  9. E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? (
  10. RGB图像转灰度图像的原理