【发布时间】:2018-05-01 17:08:27
【问题描述】:
我的分布式应用程序,有不同的主机,需要在同一个局域网内找到本地服务器。
我使用 NsdManager 检测本地服务器的成功有限,这是一种可行的方法,但通常,服务器仍然未被检测到。我正在寻找更好的解决方案,更可靠的解决方案。
然后我尝试多播 UDP 数据包,从同一进程中检测到这些数据包没有问题。 (我的单元测试同时使用客户端和服务器实例)。这很好用。相同的类将不允许我的客户端检测我在同一设备上运行的服务器(客户端和服务器是单独的进程应用程序)。
然后我使用广播地址改变了我的方法,再次,在同一个进程中,单元测试很好,但是在两个不同的进程中,没有找到服务器。
正如我所说,代码在同一个进程中运行良好,但在两个不同的进程中运行时,或者在同一 LAN 中的两个不同的客户端/服务器主机上运行时它们不起作用。
注意:我的局域网是高端WiFi rooter,没有特殊设置。
有人知道可能是什么问题吗?
请注意,我的清单包括客户端和服务器应用程序的以下设置:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
请注意,为了让我的客户端检测在同一主机上运行的服务器,我已经在使用 TCP 套接字,但我需要检测局域网中的任何服务器。
【问题讨论】:
-
问题出在您的代码中。编辑您的 Q w.r.t mcve。 UDP 通信不能依赖于任何类型的进程。
-
我的代码工作得很好,包括多播和广播的 UDP 数据包,只要它在我的单元测试中,客户端和服务器都在同一个进程中运行。当运行两个单独的客户端和服务器应用程序时,因此是两个单独的进程,我的代码无法读取任何数据报。
-
当服务器和客户端都在同一个进程中时,完全相同的代码可以很好地读取数据报。问题在于两个应用程序都在不同的主机和应用程序中运行。
标签: java android udp broadcast multicast