2012-05-11 17 views
16

he hecho un programa para enviar un paquetes UDP de un cliente a un servidor aquí es el código del transmisorenviando y recibiendo paquetes UDP usando Java?

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 de código de 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 reconoce, el programa simplemente escucha el puerto y no sucede nada.

+0

¿Seguro el servidor está escuchando el puerto correcto? – elias

+0

A menos que 'address' sea correcto y' port' es 57 este código se bloqueará en la primera llamada 'receive()'. – EJP

+3

No represente las direcciones IP como números negativos. Es ridículo. Escriba los valores de octeto reales y use moldes. – EJP

Respuesta

28

El receptor debe configurar el puerto del receptor para que coincida con el puerto configurado en el emisor DatagramPacket. Para la depuración intente escuchar en el puerto> 1024 (por ejemplo, 8000 o 9000). Los puertos < 1024 son típicamente utilizados por los servicios del sistema y necesitan acceso de administrador para vincularse a dicho puerto.

Si el receptor envía un paquete al puerto codificado que está escuchando (por ejemplo, el puerto 57) y el remitente está en la misma máquina, entonces crearía un bucle invertido en el receptor. Utilice siempre el puerto especificado del paquete y en el caso de software de producción necesitaría un control en cualquier caso para evitar dicho caso.

Otra razón por la que un paquete no llega al 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 es inalcanzable y el remitente no recibirá una indicación de error. Puede verificar esto imprimiendo la dirección en el receptor como medida de precaución para la depuración.

En el emisor se establece:

byte [] IP= { (byte)192, (byte)168, 1, 106 }; 
InetAddress address = InetAddress.getByAddress(IP); 

pero podría ser más fácil de usar la dirección en forma de cadena:

InetAddress address = InetAddress.getByName("192.168.1.106"); 

En otras palabras, se establece como objetivo 192.168.1.106. Si este no es el receptor, entonces no recibirá el paquete.

Aquí es un simple receptor UDP 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]; 

     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(); 
       String sendString = "polo"; 
       byte[] sendData = sendString.getBytes("UTF-8"); 
       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 
    } 
} 
+0

La manera más fácil de hacerlo es volver a utilizar el datagrama de solicitud para la respuesta, ya que ya tiene la dirección de igual: puerto en ella. Simplemente restablece los datos. El remitente recibirá un error si la dirección es incorrecta y el socket está conectado. – EJP

Cuestiones relacionadas