Android和C 套接字通信

Android and C++ Socket Communication

本文关键字:通信 套接字 Android      更新时间:2023-10-16

我正在开发一个应用程序,每秒从C 程序接收数据。该应用有时还需要将数据发送到C 程序。是否适合将插座用作两种实例之间的通信?对于每个实例,是否必须同时运行套接字服务器和客户端?

我认为,根据所需的时序行为会有不同的方法来完成此操作(设备是否必须同步接收消息,如果无法及时传递的消息被缓存,直到他们可以被纳交付等),Android设备的公共可及性(如果它们通过移动网络连接到许多移动网络中的NAT,则设备是否可以进入待机模式。

使用流插座(TCP)如果移动设备一直保持清醒,或者必须同步进行处理。

在这种情况下,一端必须是"服务器",而一端是"客户端"。因为移动设备倾向于进入待机模式,所以我会使用C 程序(如果在非移动设备上运行)作为服务器 - 这将是创建套接字,绑定它然后使用Listing的终点用于传入的连接。每当客户端连接到服务器时,都必须接受连接,然后通过使用相同的句柄发送和接收。

然后,移动设备将创建一个套接字并连接到服务器并可以将数据传输到它(它不必绑定或聆听)。通过相同的连接设备可以从服务器接收数据。

即使没有建立连接的服务器,服务器也需要将数据发送到移动设备,并且移动设备能够进入待机模式,则可以定期唤醒设备并进行轮询或使用服务器或使用该服务器Firebase Cloud Messaging System甚至简短的消息服务,或者 - 如果设备无法进入待机模式 - 也只需创建一个从C 应用程序中接受传入连接的收听套接字。

使用数据报插座(UDP)

在这种情况下,C 应用程序和Android应用程序都将创建并将套接字绑定到特定端口。然后,他们都可以通过向其他客户发送多播地址来将数据包(不可靠)发送给其他客户端,甚至可以在局域网中进行多播。当然,移动设备将错过在待机模式下从C 应用程序发送的数据包,并且C 应用程序在不运行的时间内会错过数据包。

使用消息队列(如果移动设备可以转到待机模式并且必须异步接收消息)

在这种情况下,如果队列持续存在,两个程序都不必同时运行,但是消息代理必须(例如RabbitMQ)。C 应用程序可以简单地将消息推入队列,任何订阅的移动设备都会立即接收它们,或者(对于持续的队列)以后在设备连接到服务器时。

如果不需要同步行为或传统的WebService甚至插座,也可以通过消息队列实现从移动设备到服务器的消息传递。