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)
- ¿Cómo leer la respuesta HTTP a través de sockets?
- Lo que puede causar un error socket () "Permiso denegado"?
- Android - Socket conectado aunque no pueda
- ¿Cuál es la diferencia entre DataOutputStream y ObjectOutputStream?
- Android - socket timeout mientras se conecta
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?
- Cómo crear conexión Socket en Android?
- Enviar texto a través de Bluetooth desde Java Server a Android Client
- InetAddress.getByName en Android
- La conexión Bluetooth falló "java.io.IOException: se ha producido un error en la lectura, el socket puede cerrarse o el tiempo de espera, leer ret: -1"
- Socket EADDRINUSE (Dirección ya en uso)
- Segunda conexión al socket del servidor rechazada en android
- Android: los sockets nativos no eliminan el modo de suspensión 3G en el primer intento
- Lea desde InputStream usando lectura contra IOUtils.copy
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"