Android se conecta al socket de conexión
Tengo 2 dispositivos androides, uno actúa como un servidor que está en el modo de conexión, y la aceptación de conexiones a un puerto. El otro dispositivo actúa como un cliente que se conecta al hotspot del servidor y establece una conexión al servidor a través de un puerto. (Todo se hace sin un enrutador en el medio).
El código del servidor se ve así: (Cuando el servidor androide ejecuta el código, el dispositivo está en modo de conexión)
- Sockets sin procesar en Android
- Apertura de tomas entre 2 teléfonos Android
- Cómo acceder a Android desde el navegador
- Android - socket timeout mientras se conecta
- Conexión Bluetooth de Android: falla en la detección del servicio
ServerSocket server = new ServerSocket(PORT); while (true) { Socket client; client = server.accept(); ClientThread com = new ClientThread(client, this); Thread t = new Thread(com); t.start(); }
El código de cliente se ve así: (cuando el cliente android ejecuta este código, el dispositivo está conectado al punto de acceso)
Socket client = new Socket(); int serverIP = wifiManager.getDhcpInfo().serverAddress; String stringIP = android.text.format.Formatter.formatIpAddress(serverIP); InetAddress address = InetAddress.getByName(stringIP); SocketAddress socketAddress = new InetSocketAddress(address, PORT); client.connect(socketAddress);
Tengo el siguiente error en el cliente
java.net.ConnectException: failed to connect to /192.168.43.1 (port 12345): connect failed: ENETUNREACH (Network is unreachable) at libcore.io.IoBridge.connect(IoBridge.java:114) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) at java.net.Socket.connect(Socket.java:842) at java.net.Socket.connect(Socket.java:785) at com.alternatewifimeshmessaging.HostManager.clientConnect(HostManager.java:283) at com.alternatewifimeshmessaging.HostManager.client(HostManager.java:189) at com.alternatewifimeshmessaging.HostManager.run(HostManager.java:59) at java.lang.Thread.run(Thread.java:856) Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable) at libcore.io.Posix.connect(Native Method) at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) at libcore.io.IoBridge.connectErrno(IoBridge.java:127) at libcore.io.IoBridge.connect(IoBridge.java:112) ... 8 more
El servidor no da errores.
Tengo el siguiente permiso establecido en el archivo de manifiesto android:
<uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission>
Idealmente necesitaría transferir algunos datos del servidor al cliente.
¿Qué estoy haciendo mal?
- Segunda conexión al socket del servidor rechazada en android
- Android - no se pudo instalar * smartsocket * listener
- Lea desde InputStream usando lectura contra IOUtils.copy
- RDP a través de Bluetooth
- Android: Conexión entre el servidor y el cliente
- Javax.net.ssl.SSLException: No certificado de servidor de confianza
- ¿Debo usar GCM para la comunicación en tiempo real entre dispositivos?
- InetAddress.getByName en Android
Al probar resulta que la conexión no se puede establecer en el dispositivo de anclaje.
Pero si invertimos el proceso y abrimos un serversocket en el cliente conectado. Y conectar con él desde el dispositivo de conexión, que funcionará.
Así que invertir la comunicación es la respuesta.
Lado del servidor
class ServerThread implements Runnable { public void run() { socket = new Socket(); try { serverSocket = new ServerSocket(SERVERPORT); } catch (IOException e) { e.printStackTrace(); } while (!Thread.currentThread().isInterrupted()) { try { socket = serverSocket.accept(); CommunicationThread commThread = new CommunicationThread(socket); new Thread(commThread).start(); } catch (IOException e) { e.printStackTrace(); } } } }
Lado del cliente
class ClientThread implements Runnable { @Override public void run() { try { socket = new Socket(); InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT); socket.connect(socketAddress); CommunicationThread commThread = new CommunicationThread(socket); new Thread(commThread).start(); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } }
En una conexión wifi atada, el proveedor de conexión no puede funcionar como un cliente. Por lo tanto, necesitamos implementar una conexión de socket tcp bidireccional. Utilice un socket de servidor con un número de puerto en el dispositivo que está en modo de conexión. Este dispositivo actúa como un servidor. En el dispositivo cliente, utilice socket para acceder al puerto cliente con dirección IP.
- Android: CursorLoader, LoaderManager, SQLite
- Android Studio Gradle proyecto "No se puede iniciar el proceso de daemon / inicialización de VM"