2011-12-19 13 views
5

Tengo que enviar un paquete UDP y obtener una respuesta del servidor UDP. Aunque pensé que UDP era análogo a java.net.DatagramPacket en Java, pero la documentación para DatagramPacket parece ser que envías un paquete pero no recuperas nada, ¿es esto lo correcto o debo usar java? net.SocketNecesito enviar un paquete UDP y recibir una respuesta en Java

+2

UDP es datagrama. No recuperas nada a menos que el receptor devuelva algo. Es lo mismo con un socket tcp. Si nos dices lo que quieres hacer, tal vez? – Erik

+0

Ok el servidor ya existe (no escrito por mí) debería enviar algo a cambio cuando le envío un paquete, pero ¿cómo consigo el paquete que envía de vuelta? –

+0

primera pregunta es: ¿el servidor envía udp? Si es así, debe leer desde su propio socket UDP a través del método Datagram.receive(). – Erik

Respuesta

10

Ejemplo de datagramas UDP envío y recepción (source):

import java.io.*; 
import java.net.*; 

class UDPClient 
{ 
    public static void main(String args[]) throws Exception 
    { 
     BufferedReader inFromUser = 
     new BufferedReader(new InputStreamReader(System.in)); 
     DatagramSocket clientSocket = new DatagramSocket(); 
     InetAddress IPAddress = InetAddress.getByName("localhost"); 
     byte[] sendData = new byte[1024]; 
     byte[] receiveData = new byte[1024]; 
     String sentence = inFromUser.readLine(); 
     sendData = sentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); 
     clientSocket.send(sendPacket); 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     clientSocket.receive(receivePacket); 
     String modifiedSentence = new String(receivePacket.getData()); 
     System.out.println("FROM SERVER:" + modifiedSentence); 
     clientSocket.close(); 
    } 
} 
+0

Esto se ve bien, pero parece que no hay una longitud de paquete definida para el servidor, es decir, no creo que la longitud del paquete devuelto por el servidor sea siempre la misma, así que solo necesito asegurarme de que receiveData el búfer es lo suficientemente grande como para manejar el mayor tamaño de paquete posible. –

+0

Sí. UDP no es un protocolo confiable, y rara vez se usa para enviar grandes cantidades de datos sobre él. Sin embargo, después de recibir el paquete, puede leer la cantidad real de bytes contenidos en 'DatagramPacket.getLength()'. – bezmax

+2

'receivePacket.getData()' no solo contiene los datos recibidos. Contiene la parte no utilizada del búfer, también. Para obtener una Cadena con los datos recibidos use 'new String (receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8)' y ajuste el juego de caracteres a lo que espera. –

2

Debe utilizar un DatagramPacket y un DatagramSocket. Cuando envía un paquete, solo envía un paquete. Sin embargo cuando se recibe un paquete se puede obtener un paquete que fue enviado desde otro programa (por ejemplo, los servidores responden)

http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

Socket es sólo para las conexiones TCP.

Cuestiones relacionadas