servidor - ¿Enviando y recibiendo paquetes UDP usando Java?
socket udp en java (1)
El receptor debe configurar el puerto del receptor para que coincida con el puerto establecido en el paquete DatagramPacket. Para la depuración, intente escuchar en el puerto> 1024 (por ejemplo, 8000 o 9000). Los puertos <1024 generalmente los usan los servicios del sistema y necesitan acceso de administrador para vincularlos en dicho puerto.
Si el receptor envía un paquete al puerto codificado de forma rígida que está escuchando (por ejemplo, el puerto 57) y el remitente está en la misma máquina, debería crear un bucle de retorno al propio receptor. Utilice siempre el puerto especificado en el paquete y, en caso de que el software de producción necesite una verificación en cualquier caso para evitarlo.
Otra razón por la que un paquete no llega a destino es la dirección IP incorrecta especificada en el remitente. UDP, a diferencia de TCP, intentará enviar un paquete incluso si la dirección no está disponible y el remitente no recibirá una indicación de error. Puede verificar esto imprimiendo la dirección en el receptor como una precaución para la depuración.
En el remitente se establece:
byte [] IP= { (byte)192, (byte)168, 1, 106 };
InetAddress address = InetAddress.getByAddress(IP);
pero podría ser más sencillo usar la dirección en forma de cadena:
InetAddress address = InetAddress.getByName("192.168.1.106");
En otras palabras, establece el objetivo como 192.168.1.106. Si este no es el receptor, entonces no recibirá el paquete.
Aquí hay un receptor UDP simple que funciona:
import java.io.IOException;
import java.net.*;
public class Receiver {
public static void main(String[] args) {
int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
new Receiver().run(port);
}
public void run(int port) {
try {
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
String sendString = "polo";
byte[] sendData = sendString.getBytes("UTF-8");
System.out.printf("Listening on udp:%s:%d%n",
InetAddress.getLocalHost().getHostAddress(), port);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
while(true)
{
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData(), 0,
receivePacket.getLength() );
System.out.println("RECEIVED: " + sentence);
// now send acknowledgement packet back to sender
InetAddress IPAddress = receivePacket.getAddress();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
IPAddress, receivePacket.getPort());
serverSocket.send(sendPacket);
}
} catch (IOException e) {
System.out.println(e);
}
// should close serverSocket in finally block
}
}
He creado un programa para enviar paquetes UDP desde un cliente a un servidor. Aquí está el código del transmisor.
import java.io.IOException;
import java.net.*;
/**
*
* @author hp
*/
public class JavaApplication9 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws UnknownHostException, SocketException, IOException {
// TODO code application logic here
byte[] buffer = {10,23,12,31,43,32,24};
byte [] IP={-64,-88,1,106};
InetAddress address = InetAddress.getByAddress(IP);
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, address, 57
);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(packet);
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
La función del código del receptor es
public void run(){
try{
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
byte[] sendData = new byte[8];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData());
System.out.println("RECEIVED: " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
String sendString = "polo";
sendData = sendString.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}catch (Exception e){
}
}
He utilizado el programa WireShark. El paquete UDP se recibe en el programa WireShark en el receptor, pero el programa Java no lo reconocería, el programa sigue escuchando el puerto y no pasa nada.