一、Android 獲取本機Mac 地址方法:java
須要在AndroidManifest.xml文件中添加權限: android
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> shell
Java代碼服務器
public String getLocalMacAddress() { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); return info.getMacAddress(); }
二、Android 獲取本機IP地址方法網絡
public String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf .getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e("WifiPreference IpAddress", ex.toString()); } return null; }
--------------------------------------------------tcp
實現網絡五子棋時用到了兩個設備間的Socket通訊,若是使用真機調試比較麻煩,用兩個模擬器之間進行通訊會比較方便。oop
首先要得到的模擬器的IP地址spa
在本機上啓動兩個模擬器,emulator-5554,emulator-5556查看模擬器ip命令行
在命令行窗口輸入命令調試
adb –s emulator-5554 shell
getprop
找到一下兩行:
[net.eth0.dns1]: [10.0.2.3]
[net.gprs.local-ip]: [10.0.2.15]
能夠發現兩個模擬器的IP地址徹底同樣,都爲10.0.2.15,DNS都爲10.0.2.3,因此要實現兩個模擬器之間的通訊,使用模擬器的IP地址是辦不到的。
模擬器提供了一個特殊的IP,這個IP地址爲10.0.2.2,這個IP地址能夠說等同於PC本機的IP地址127.0.0.1,因此,經過這個特殊的IP地址能夠進行PC與模擬器之間的通訊。
考慮模擬器做爲主機的狀況:
須要把模擬器的端口映射到PC的端口,經過鏈接PC端的端口來把請求重定向發送給,模擬器。
1)PC做爲客戶端,模擬器1爲主機
2)模擬器2爲客戶端,模擬器1爲主機
映射PC端口到模擬器端口的命令以下:
>adb –semulator-5554 forward tcp:6665 tcp:6666
映射成功後,鏈接模擬器的端口6666就要經過鏈接PC的端口6665進行鏈接,客戶端鏈接的IP必須爲環路IP,不能使用本機IP,如192.168.1.102,由於本機IP跟環路IP沒有映射關係,因此發送到本機IP(192.168.1.102)的鏈接請求沒法映射到127.0.0.1的環路IP上,使用PC端程序做爲客戶端時,環路IP必須使用127.0.0.1,使用模擬器做爲客戶端時,環路IP使用10.0.2.2,雖然二者是同一個環路IP,可是PC只能識別127.0.0.1,模擬器只能識別10.0.2.2。
3)若是要實現兩個模擬器之間的相互通訊,就必須每一個模擬器都既爲Server又爲Client,並在PC機上映射爲不一樣的端口。結構圖以下
因爲PC的本機IP(192.168.1.102)沒有映射到環路IP,因此不能在Android真機與模擬器之間或者運行在兩臺PC的模擬器之間進行Socket通訊,若是要實現鏈接,必須在做爲服務器的PC上,運行一個用於數據中繼的後臺程序,進行數據的轉發。