2017-05-15 31 views
0

我想在客戶端 - 服務器模型中創建應用。所以我寫了桌面服務器和移動客戶端庫。現在我遇到一些問題,從Android設備自動發現LAN網絡中的PC/Mac電腦。Android:客戶端 - 服務器使用TCP,並發現局域網上的PC/Mac(WiFi)

可能的解決方案:

  1. 獲得Android設備的IP地址,獲得子網掩碼,用org.apache.commons.net.util.SubnetUtilsgetInfo().getAllAddresses()和掃描它們全部採用InetAddress.isReachable(timout=1000ms)該解決方案的工作,但如果我們有樂觀的子網掩碼爲255.255.255.0,必須掃描254個地址,需要254秒=> 4分鐘。好吧,我可以使用線程,也許增加10個線程和分裂這個任務來檢查大約26個IP地址可以使其在< 45秒以下。但也可以有子網掩碼255.255.0.0(不太可能,但是...)。

  2. 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 ...」,這是我的無線路由器。

    enter image description here

    或在此顯示

    enter image description here

    回答

    0

    我認爲使用NSD(網絡服務發現)實現DNS-SD(服務發現)和MacOS的(也是Windows在我的計算機的名稱, iOS)Bonjour

    http://developer.apple.com/bonjour 
    

    將是在LAN中實現發現設備(由客戶端 - 服務器本地網絡軟件提供的服務)的最佳方式。您還可以獲取描述性名稱,例如在該計算機上運行的計算機名稱或服務器應用程序,以顯示最終用戶。在macOS的終端中有dns-sd命令行工具,您可以測試網絡中的服務註冊以及它們以後的發現。它工作得很好,而且速度很快。我的Android應用發現在macOS命令行工具中註冊的服務的示例屏幕截圖。

    enter image description here

    觀看更多: https://developer.apple.com/videos/play/wwdc2011/211/