我想在客戶端 - 服務器模型中創建應用。所以我寫了桌面服務器和移動客戶端庫。現在我遇到一些問題,從Android設備自動發現LAN網絡中的PC/Mac電腦。Android:客戶端 - 服務器使用TCP,並發現局域網上的PC/Mac(WiFi)
可能的解決方案:
獲得Android設備的IP地址,獲得子網掩碼,用
org.apache.commons.net.util.SubnetUtils
類getInfo().getAllAddresses()
和掃描它們全部採用InetAddress.isReachable(timout=1000ms)
該解決方案的工作,但如果我們有樂觀的子網掩碼爲255.255.255.0,必須掃描254個地址,需要254秒=> 4分鐘。好吧,我可以使用線程,也許增加10個線程和分裂這個任務來檢查大約26個IP地址可以使其在< 45秒以下。但也可以有子網掩碼255.255.0.0(不太可能,但是...)。Android沒有
arp -a
命令行工具,但它有類似/proc/net/arp
這樣的文件嗎?我正在閱讀這個文件,並且可以非常快速地在局域網中獲得一些IP地址,我可以拒絕沒有真正MAC的IP地址,但是00:00:00:00:00:00
。我也可以找到該設備的供應商也使用一些API,本地數據庫? 問題是,我讀過這個文件有一些缺陷,如包含不存在的設備(在他們斷開連接後)?並非所有設備實際連接?這樣對嗎?所以我可以繼續嗎?
以上兩種解決方案都只能查找IP地址,我的服務器應用的端口號是多少。好吧,我可以使用固定的端口號(但它可以被其他服務使用,然後會有問題)。也許嘗試從xxxx端口號如xxxx + 1,xxxx + 2,...等連續地址到我找到一些我可以更正的時刻。所以這個連接可能需要我花費合理的時間。
- 我已閱讀關於NSD或DNS-SD: https://developer.android.com/training/connect-devices-wirelessly/nsd.html 這似乎使能寄存器某些服務(在我的情況下我的服務器側應用程序)並使其在被發現本地網絡由其他設備?這在PC/MacOS服務器應用程序註冊發現的情況下是可用的,Android應用程序使用NSD找到此服務?
當我有IP地址時,我如何獲取設備的名稱: 即此處顯示的名稱「Play Internet 4G ...」,這是我的無線路由器。
或在此顯示