我正在开发一个应用程序,每秒钟从C ++程序接收数据。该应用程序有时也需要将数据发送到C ++程序。 是否适合使用套接字作为两个实例之间的通信? 对于每个实例,它是否必须同时运行套接字服务器和客户端?
答案 0 :(得分:2)
我认为根据所需的时序行为会有不同的方法来实现这一点(设备是否必须同步接收消息,如果无法及时传递的消息被缓存,直到可以交付等),公共可达性Android设备(如果它们通过移动网络连接,它们在许多移动网络中位于NAT后面)并且设备是否可以进入待机模式。
使用流套接字(TCP)如果移动设备始终处于唤醒状态或处理必须始终同步发生。
在这种情况下,一端必须是"服务器"并且一端是"客户"。由于移动设备倾向于进入待机模式,我使用C ++程序(如果它在非移动设备上运行)作为服务器 - 这将是创建套接字,绑定它然后使用listen的结束等待传入的连接。每当客户端连接到服务器时,它必须接受连接,然后可以通过使用相同的发送和接收句柄双向使用。
然后移动设备将创建一个套接字并连接到服务器并可以向其传输数据(它不必绑定或监听)。通过相同的连接,设备可以从服务器接收数据。
如果服务器需要向移动设备发送数据,即使移动设备尚未建立连接且移动设备能够进入待机模式,也可以定期唤醒设备并轮询服务器或使用firebase云消息传递系统甚至是短消息服务,或者 - 如果设备无法进入待机模式 - 只需创建一个接收来自C ++应用程序的传入连接的侦听套接字。
使用数据报套接字(UDP)
在这种情况下,C ++应用程序和Android应用程序都会创建套接字并将其绑定到特定端口。然后,他们都可以简单地将数据包(不可靠)发送到其他客户端,甚至通过向其发送多播地址在局域网中进行多播。当然,移动设备会丢失在C ++应用程序处于待机模式期间从C ++应用程序发送的数据包,而C ++应用程序在数据包未运行期间会丢失数据包。
使用消息队列(如果移动设备可能进入待机模式并且必须异步接收消息)
在这种情况下,如果队列是持久的,则两个程序不必同时运行,但消息代理必须(例如RabbitMQ)。 C ++应用程序可以简单地将消息推送到队列中,任何订阅的移动设备都会立即接收它们,或者在设备连接到服务器时(对于持久性队列)接收它们。
如果不需要同步行为,或者通过传统的Web服务甚至套接字,也可以通过消息队列实现从移动设备到服务器的消息传递。