2016-07-05 102 views
1

我想綁定一個套接字到本地wifi網絡地址,以確保請求不通過3g或其他網絡運行。我想這樣的代碼:如何將套接字綁定到Android上的本地wifi網絡地址?

public static String getIpAddress(WifiManager wifiManager) { 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    int ipAddress = wifiInfo.getIpAddress(); 
    return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff), 
      (ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff)); 
} 

Socket socket = new Socket(); 
String localIpAddress = getIpAddress(wifiManager); 
socket.bind(new InetSocketAddress(localIpAddress, 80)); 
socket.connect(new InetSocketAddress(serverHostname, serverPort), (int) timeoutMs); 

而且它拋出: java.net.BindException: bind failed: EACCES (Permission denied) 我在清單檢查權限。看起來所有需要的權限都被授予:

<!-- Uses: show 'disconnected' message when not connected to the internet --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

<!-- Uses: record wifi network name when setting up a device --> 
<!-- Uses: device wifi setup --> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

<!-- Uses: device wifi setup --> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
<uses-permission android:name="android.permission.INTERNET" /> 

回答

1

如果沒有超級用戶訪問權限,您無法綁定到低於1024的端口。所以到端口80的Socket.bind()是拋出異常。選擇一個高於1024的自定義端口。例如,大多數用戶啓動的Web服務器使用端口8080.

相關問題