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);
}
}
}
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
@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
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 –