2012-05-11 19 views
16

ich ein Programm gemacht habe, ein UDP-Pakete von einem Client an einen Server hier senden ist der SendercodeSenden und Empfangen von UDP-Paketen mit 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()); 


    } 
} 

Die Empfänger Codefunktion ist

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){ 
    } 
} 

ich das Programm Wireshark verwendet habe. Das UDP-Paket wird im WireShark-Programm am Empfänger empfangen, aber das Java-Programm würde es nicht erkennen, das Programm hört einfach auf den Port und nichts passiert?

+0

Sind Sie sicher, dass der Server den richtigen Port lauscht? – elias

+0

Wenn 'address' nicht korrekt ist und' port' 57 ist, wird dieser Code beim ersten 'receive()' Aufruf blockiert. – EJP

+3

Stellen Sie IP-Adressen nicht als negative Zahlen dar. Es ist lächerlich. Schreiben Sie die tatsächlichen Oktettwerte und verwenden Sie Casts. – EJP

Antwort

28

Der Empfänger muss den Port des Empfängers so einstellen, dass er dem im Sender DatagramPacket eingestellten Port entspricht. Versuchen Sie beim Debuggen, Port> 1024 (z. B. 8000 oder 9000) zu hören. Ports < 1024 werden normalerweise von Systemdiensten verwendet und benötigen Administratorzugriff, um an einen solchen Port zu binden.

Wenn der Empfänger ein Paket an den hartcodierten Anschluss sendet, den es abhört (z. B. Anschluss 57) und der Sender sich auf demselben Computer befindet, dann würden Sie eine Rückschleife zum Empfänger selbst erstellen. Verwenden Sie immer den Port, der in dem Paket angegeben ist, und im Falle einer Produktionssoftware würde in jedem Fall eine Überprüfung erforderlich sein, um einen solchen Fall zu verhindern.

Ein weiterer Grund, warum ein Paket nicht zum Ziel gelangt, ist die falsche IP-Adresse, die im Absender angegeben ist. UDP wird im Gegensatz zu TCP versuchen, ein Paket zu senden, selbst wenn die Adresse nicht erreichbar ist und der Absender keine Fehleranzeige erhalten wird. Sie können dies überprüfen, indem Sie die Adresse im Empfänger als Vorsichtsmaßnahme zum Debuggen ausdrucken.

Im Sender Sie Folgendes einstellen:

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

aber könnte einfacher sein, die Adresse in String-Form zu verwenden:

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

Mit anderen Worten: Sie Ziel als 192.168.1.106 gesetzt. Wenn dies nicht der Empfänger ist, werden Sie das Paket nicht erhalten.

Hier ist ein einfaches UDP-Empfänger, die funktioniert:

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

Der einfache Weg, dies zu tun ist, das Anforderungs-Datagramm für die Antwort wiederzuverwenden, da es bereits die Peer-Adresse: port enthält. Setzen Sie die Daten einfach zurück. Der Absender wird in der Tat einen Fehler erhalten, wenn die Adresse falsch ist und der Socket verbunden ist. – EJP