studio socket node ejemplo con android sockets networking chat

node - socket.io android ejemplo



Mensaje de error de Android DatagramSocket: EADDRINUSE(Dirección ya en uso) (3)

Desde que Sean pidió el código, he traducido la respuesta de Nikola al siguiente código, que es similar al que estoy usando en mi aplicación, en caso de que sea útil:

if (mSocket == null) { mSocket = new DatagramSocket(null); mSocket.setReuseAddress(true); mSocket.setBroadcast(true); mSocket.bind(new InetSocketAddress(BCAST_PORT)); }

Estoy tratando de escribir una aplicación de chat simple de Android. He creado una clase de servicio que maneja todas las comunicaciones de red. El enlace de DatagramSocket está en un hilo separado. Una vez que estoy recibiendo este error y la aplicación falla:

java.net.BindException: bind failed: EADDRINUSE (Address already in use) at libcore.io.IoBridge.bind(IoBridge.java:89) at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68) at java.net.DatagramSocket.createSocket(DatagramSocket.java:133) at java.net.DatagramSocket.<init>(DatagramSocket.java:78)

Y este es el código que lo produce. El error se produce en la línea con el nuevo DatagramSocket ¿Cómo puedo evitar este error? Gracias.

private class ComThread extends Thread { private static final int BCAST_PORT = 8779; DatagramSocket mSocket; InetAddress myBcastIP, myLocalIP; public ComThread() { try { myBcastIP = getBroadcastAddress(); if (D) Log.d(TAG, "my bcast ip : " + myBcastIP); myLocalIP = getLocalAddress(); if (D) Log.d(TAG, "my local ip : " + myLocalIP); if (mSocket == null) { mSocket = new DatagramSocket(BCAST_PORT); mSocket.setReuseAddress(true); mSocket.setBroadcast(true); } } catch (IOException e) { Log.e(TAG, "Could not make socket", e); } }


SO_REUSEADDR establecer SO_REUSEADDR antes de enlazar. No especifique el puerto en el constructor: cree un socket no vinculado en su lugar con DatagramSocket(null) , luego configure las opciones, luego bind() explícitamente.


Otra razón por la que me enfrenté,

En caso de que acceda a un método que use su socket desde un hilo externo, debe asegurarse de que el hilo no acceda al método más de una vez al mismo tiempo (o, en otras palabras, no creará el socket más de uno). y, a pesar de que los métodos de envío y recepción de DatagramSocket son seguros para subprocesos , la construcción del objeto DatagramSocket no lo es, por lo que debe sincronizar el método que es capaz de crear el socket DatagramSocket :

synchronized public void my_datagram_socket() throws Exception{ // create the socket // operations through the socket // whatever you want }