2016-04-19 7 views
-2

Ich arbeite an meiner Aufgabe, UDP mit Java zuverlässig zu machen. Wie kann ich Timeout und erneute Übertragung hinzufügen, um verworfene Datengramme zu verarbeiten und Sequenznummern hinzuzufügen, damit der Client überprüfen kann, ob eine Antwort für die entsprechende Anfrage vorliegt?Zuverlässige UDP in Java

ist dieser Client-Code

import java.net.*; 
import java.io.*; 
public class EchoClient { 
// UDP port to which service is bound 
    public static final int SERVICE_PORT = 7; 


// Max size of packet 
public static final int BUFSIZE = 256; 
public static void main(String args[]){ 
       if (args.length != 1) 
       { 
         System.err.println ("Syntax - java EchoClient hostname"); 
         return; 
        } 
String hostname = args[0]; 
// Get an InetAddress for the specified hostname 
    InetAddress addr = null; 
     try 
     { 
      // Resolve the hostname to an InetAddr 
      addr = InetAddress.getByName(hostname); 
     } 
     catch (UnknownHostException uhe) 
     { 
      System.err.println ("Unable to resolve host"); 
      return; 
     } 

     try 
     { 
      // Bind to any free port 
      DatagramSocket socket = new DatagramSocket(); 

      // Set a timeout value of two seconds 
      socket.setSoTimeout (2 * 1000); 

      for (int i = 1 ; i <= 10; i++) 
      { 
       // Copy some data to our packet 
       String message = "Packet number " + i ; 
       char[] cArray = message.toCharArray();     
       byte[] sendbuf = new byte[cArray.length]; 
       for (int offset = 0; offset < cArray.length ; offset++) 
       { 
        sendbuf[offset] = (byte) cArray[offset]; 
       } 

       // Create a packet to send to the UDP server 
       DatagramPacket sendPacket = new DatagramPacket(sendbuf, cArray.length, addr, SERVICE_PORT); 

       System.out.println ("Sending packet to " + hostname); 

       // Send the packet 
       socket.send (sendPacket); 

       System.out.print ("Waiting for packet.... "); 

       // Create a small packet for receiving UDP packets 
       byte[] recbuf = new byte[BUFSIZE]; 
       DatagramPacket receivePacket = new DatagramPacket(recbuf, BUFSIZE); 

       // Declare a timeout flag 
       boolean timeout = false; 

       // Catch any InterruptedIOException that is thrown 
       // while waiting to receive a UDP packet 
       try 
       { 
        socket.receive (receivePacket); 
       } 
       catch (InterruptedIOException ioe) 
       { 
        timeout = true; 
       } 

       if (!timeout) 
       { 
        System.out.println ("packet received!"); 
        System.out.println ("Details : " + receivePacket.getAddress()); 

        // Obtain a byte input stream to read the UDP packet 
        ByteArrayInputStream bin = new ByteArrayInputStream (
         receivePacket.getData(), 0, receivePacket.getLength()); 

        // Connect a reader for easier access 
        BufferedReader reader = new BufferedReader ( 
         new InputStreamReader (bin)); 

        // Loop indefinitely 
        for (;;) 
        { 
         String line = reader.readLine(); 

         // Check for end of data 
         if (line == null) 
          break; 
         else 
          System.out.println (line); 
        }    
       } 
       else 
       { 
        System.out.println ("packet lost!"); 
       } 

       // Sleep for a second, to allow user to see packet 
       try 
       { 
        Thread.sleep(1000); 
       }catch (InterruptedException ie) {} 
      } 
     } 
     catch (IOException ioe) 
     { 
      System.err.println ("Socket error " + ioe); 
     } 
    } 
} 
+2

UDP wurde speziell eingerichtet, um unzuverlässig zu sein. Auf der anderen Seite ist TCP gebaut, um zuverlässig zu sein. Also, wenn Sie zuverlässig wollen, sollten Sie TCP – ControlAltDel

+0

@ControlAltDel verwenden, die nicht vollständig wahr ist. Die Benutzer nutzen oft den Leistungszuwachs bei UDP, indem sie zusätzlich einen eigenen Dienst erstellen. – flakes

+0

das ist in Ordnung, aber wir können einige Funktionen zum Client hinzufügen, um es zuverlässig wie Prüfsumme oder Sequenznummer und Timeout –

Antwort

0

Was können Sie tun, ist wie Sequenznummer Import TCP-Header hinzufügen, Fenster in den UDP-Nachrichtentext, um es wie TCP mehr zu machen. Hier ist die a solution, die Ihnen helfen könnte.