Как написать Android SocketServer для прослушивания Wi-Fi

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

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

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

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

  • Внедрение простого сервера Socket в Eclipse
  • Простая связь с использованием java.net.Socket

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

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

 <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; } в <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; } в <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; } 
Intereting Posts
SDK Samsung Pass (fingerprint) – не может использовать пароль как резерв на устройствах Galaxy 6 Использование Proguard для удаления неиспользуемых классов в библиотеке Google Play Services Как получить RotationMatrix от рыскания, подачи и рулона Текущий маркер местоположения Google Maps и оверлей точности Будет ли приоритетная папка, пригодная для определения плотности, или drawable-nodpi? Выход эмулятора Android Обновление виджета в полночь (12 часов утра) Изменение цвета текста переполнения действий в ActionBar Приложение Android не закрывается после вызова System.exit (0) Как добавить горизонтальную 1px белую линию под кнопкой в ​​относительной компоновке? AppCompatSpinner vs android.widget.Spinner для приложения с минимальным SDK версии 14 Где список псевдонимов типа авторизации Android для API Google? SetRetainInstance (true) + setCustomAnimations (…) = анимация для каждого изменения ориентации? Объект String to Date / Time в Android Как использовать Radial Pie Menu