如何在Android上将套接字绑定到本地wifi网络地址?

Sem*_*nko 4 java sockets android

我想将套接字绑定到本地 wifi 网络地址,以确保请求不会通过 3g 或其他网络运行。我试过这个代码:

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);
Run Code Online (Sandbox Code Playgroud)

它抛出: 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" />
Run Code Online (Sandbox Code Playgroud)

Lar*_*fer 5

没有超级用户访问权限,您无法绑定到 1024 以下的端口。所以Socket.bind()到端口 80 是引发异常的原因。选择一个大于 1024 的自定义端口。例如,大多数用户启动的 Web 服务器使用端口 8080。