socket servidor pgx example cliente java network-programming udp

java - servidor - sockets udp



Ignorando tus propias transmisiones UDP en Java (4)

En mi programa, envío transmisiones UDP y reacciono ante ellas. Necesito una forma de ignorar las transmisiones UDP que envío, pero reacciono a las que no son de mi máquina.

if (NetworkInterface.getByInetAddress(packet.getAddress()) != null) usar: if (NetworkInterface.getByInetAddress(packet.getAddress()) != null) pero esto generó IOExceptions en algunos casos (java.net.SocketException: ninguna interfaz de red está vinculada a dicha dirección IP)

Alguien tiene alguna idea?

Además: getInetAddress () en mi socket arroja una NullPointerException


¿No puedes hacer un equals() entre packet.getAddress() y un objeto Address para tu propio host?


Creo que hay una pequeña discrepancia entre el javadoc y la implementación real de NetworkInterface getByInetAddress() . El javadoc parece sugerir que getByInetAddress devolverá nulo si no se encontró una coincidencia, sin embargo, la implementación devuelve una coincidencia, o arroja una excepción SocketException.

JavaDoc

public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException

Devuelve: una NetworkInterface o null si no hay una interfaz de red con la dirección IP especificada .

Implementación

public static NetworkInterface getByInetAddress (InetAddress addr) throws SocketException { if (networkInterfaces == null) networkInterfaces = getRealNetworkInterfaces (); for (Enumeration interfaces = networkInterfaces.elements (); interfaces.hasMoreElements (); ) { NetworkInterface tmp = (NetworkInterface) interfaces.nextElement (); for (Enumeration addresses = tmp.inetAddresses.elements (); addresses.hasMoreElements (); ) { if (addr.equals ((InetAddress) addresses.nextElement ())) return tmp; } } throw new SocketException ( "no network interface is bound to such an IP address"); }

Sugiero capturar la excepción y tratarla como una respuesta de un tercero, ya sea volver a implementarla usando el método getNetworkInterfaces() .


Esta no es exactamente una respuesta a tu pregunta. Pero para manejar difusiones UDP debería echar un vistazo a JGroups :

JGroups es un conjunto de herramientas para la comunicación confiable de multidifusión. (Tenga en cuenta que esto no necesariamente significa IP Multicast, JGroups también puede usar transportes como TCP). Se puede usar para crear grupos de procesos cuyos miembros pueden enviarse mensajes entre ellos. Las principales características incluyen

  • Creación y eliminación de grupos. Los miembros del grupo se pueden distribuir a través de LAN o WAN
  • Unión y salida de grupos
  • Detección de membresía y notificación sobre miembros unidos / izquierdos / estrellados
  • Detección y eliminación de miembros bloqueados
  • Envío y recepción de mensajes de miembro a grupo (punto a multipunto)
  • Envío y recepción de mensajes de miembro a miembro (punto a punto)

La solución de "fortaleza industrial" para esto, por supuesto, sería generar un UUID aleatorio para cada servidor, e incluir este ID (podría ser un int o tal vez un largo) en cada paquete. Si ese ID coincide con el suyo, puede soltarlo.

No estoy enamorado de esta solución porque desperdicia una cantidad de bytes en cada paquete de datagramas. Pero es simple y efectivo.