Как написать Android SocketServer для прослушивания на Wi-Fi - PullRequest
6 голосов
/ 20 февраля 2011

Я написал поток, используя java.net.SocketServer для прослушивания определенного порта.Он прекрасно работает в симуляторе Android (с использованием переадресации портов).Я планирую подключиться через Wi-Fi к этому порту, когда приложение используется.Однако в документации SocketServer говорится, что если вы не предоставите InetAddress, сервер прослушивает localhost.

Правильно ли я понимаю, что если я не предоставлю адрес, я не смогуполучить соединение по Wi-Fi?Как я могу получить InetAddress соединения Wi-Fi для передачи на SocketServer?

Ответы [ 2 ]

17 голосов
/ 20 февраля 2011

При создании ServerSocket вы слушаете порт на localhost .Вам решать, хотите ли вы назначить свой собственный адрес локального хоста .

. Прочитайте эти две статьи:

Не забудьте иметь WiFi-блокировку и соответствующие разрешения.

0 голосов
/ 18 марта 2017

Вы можете попробовать следующий код.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

private String getIPAddress() throws SocketException {

        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();

        if (info == null || !info.isConnected()){
            return null;
        }

        switch (info.getType()) {
            case ConnectivityManager.TYPE_WIFI: {
                WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                if (wifi == null) break;
                WifiInfo wifi_info = wifi.getConnectionInfo();
                String ipAddress = intToIp(wifi_info.getIpAddress());
                return ipAddress;
            }
            case ConnectivityManager.TYPE_MOBILE: {
                Enumeration<NetworkInterface> interfaceEnumerations =  NetworkInterface.getNetworkInterfaces();
                while(interfaceEnumerations.hasMoreElements()){
                    NetworkInterface interfac = interfaceEnumerations.nextElement();
                    Enumeration<InetAddress> inetAddresses = interfac.getInetAddresses();
                    while(inetAddresses.hasMoreElements()){
                        InetAddress address = inetAddresses.nextElement();
                        if (!address.isLoopbackAddress() && !address.isLinkLocalAddress()) {
                            String addressIp = address.getHostAddress();
                            if(TextUtils.isEmpty(addressIp) || !addressIp.matches("(\\d{1,3}.){3}\\d{1,3}")) continue;
                            return addressIp;
                        }
                    }
                }
                break;
            }
        }

        return null;
    }
...