Programando en Java me he encontrado varios problemas para establecer conexión entre equipos tenemos dos opciones
Socket y
DatagramSocket , que uno es por medio de TCP y UDP. Haré un FAQ o una lista de problemas que me han surgido y su solución , también comentaré
DatagramPacket , que es para enviar los paquetes por el canal creado gracias al DatagramSocket :
Problema 1.- java.net.BindException: No se puede asignar la dirección solicitada
Solución asignar el puerto correcto yo por equivocación asigné el 58000 , pero había que asignar el 8080,
que por wikipedia podemos ver que esta sin asignación.
....
int port = 8080;
....
DatagramSocket dS = new DatagramSocket(null);
dS.setReuseAddress(true);
ds.bind(new InetSocketAddress(IP_emisor,port));
....
Problema 2.- java.net.BindException: Permiso denegado
Problema 3.- Java.net.BindException : Already bound
Estos problemas se solucionan poniendo de forma correcta la cosntrucción del DatagramSocket y DatagramPacket :
String IP_envio = "";
int port = 8080;
DatagramSocket dS = new DatagramSocket(null);
dS.setReuseAddress(true);
DatagramPacet dP = new DatagramPacket(buff,buff.length, InetAddress.getByName(IP_envio) ,port);
dS.send(dP);
Esto no está ordenado , pero en general quedaría de la siguiente manera :
try {
try {
DatagramSocket dS = new DatagramSocket(null);
dS.setReuseAddress(true);
DatagramPacket dP = null;
synchronized(recepcionNodos.class){
try {
dP = new DatagramPacket(tablaEnca , tablaEnca.length, InetAddress.getByName(IP_envio) , port);
dS.send(dP);
System.out.println("Paquete enviado");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
try {
dS.send(dP);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
Como crearlos
Nos encontramos que para instanciar estas classes en nuestros respectivos proyectos tenemos que hacer lo siguiente :
DatagramSocket dS = new DatagramSocket(null);
Esto lo que hace es crear el DatagramSocket por defecto , ya que podemos poner nosotros el puerto pero eso nos generará problemas innecesarios desde mi punto de vista.
dS.setReuseAddress(true);
Esto nos permitirá usar un socket por más de una conexión UDP , por ejemplo si tenemos varias IP's creadas en nuestra interfaz y en el programa solo queremos que use un puerto , pues con esto logramos que todas esas IP's credas usen dicho puerto UDP , sin problema y no nos comente , que el puerto ya esta en uso.
dP = new DatagramPacket(tablaEnca , tablaEnca.length, InetAddress.getByName(IP_envio) , port);
Sigue el formato de :
DatagramPacket dP = new DatagramPacket (buff , buff.length, IP , puerto);