【发布时间】:2023-04-09 02:58:01
【问题描述】:
我的 PC 中有一个 TCP 服务器,我的安卓手机中有一个客户端。我希望手机每次都在同一个网络上时连接到计算机。 如何将所有连接的设备扫描到手机的同一个wifi网络并每次选择特定的PC? (我注意到我的 PC 的 IP 正在改变,所以我不能将地址用作常量) 谢谢!
【问题讨论】:
我的 PC 中有一个 TCP 服务器,我的安卓手机中有一个客户端。我希望手机每次都在同一个网络上时连接到计算机。 如何将所有连接的设备扫描到手机的同一个wifi网络并每次选择特定的PC? (我注意到我的 PC 的 IP 正在改变,所以我不能将地址用作常量) 谢谢!
【问题讨论】:
如果您已经编写了 PC 应用程序并且可以对其进行更新,那么您可以向其添加一个 UDP 套接字,该套接字侦听与 TCP 套接字相同的 NIC。然后,Android 客户端可以使用 WiFi 网络的子网广播 IP 将 UDP 数据包发送到 PC 的 UDP 端口。数据包将被发送到连接到子网的每个设备上的同一端口。如果 PC 应用程序收到数据包,它可以直接向发送者的 IP 发送回复。如果 Android 客户端收到回复,它将因此知道 PC 的 IP 并可以连接到它的 TCP 套接字。
要获取WiFi的子网广播IP,可以这样做:
private InetAddress getBroadcastAddress() throws IOException {
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
// handle null somehow
int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) (broadcast >> (k * 8));
return InetAddress.getByAddress(quads);
}
另一方面,如果您尚未编写 PC 应用程序和/或无法更新它,那么您将不得不:
制作一个单独的应用程序与 TCP 应用程序一起运行以处理 UDP 数据包。
【讨论】: