Мне нужно реализовать надежную передачу данных с использованием контрольных сумм, ACK, порядковых номеров и таймеров обратного отсчета и реализовать следующие функции.
public static int compute_checksum(String message) {}
public static boolean isCorrupt(rdtPacket packet) {}
public static boolean isACK(rdtPacket packet) {}
public static boolean inOrder(rdtPacket packet, int seqno) {} // has_seq()
И добавить таймер обратного отсчета в сокет при ожидании ACK.
Кроме того, формат пакета будет:
порядковый номер контрольной суммы сообщения
Наконец, ACK будут отправлены с использованием сообщения "ACK"
Это то, что ядо сих пор:
import java.io.*;
import java.net.*;
class RDTClient {
private static DatagramSocket clientSocket;
private static InetAddress IPAddress;
private static final int serverPort = 9876;
public static void main(String args[]) throws Exception {
try {
String serverHostname = new String("127.0.0.1");
if (args.length > 0) {
serverHostname = args[0];
}
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
clientSocket = new DatagramSocket();
IPAddress = InetAddress.getByName(serverHostname);
System.out.println("Attemping to connect to " + IPAddress + ") via UDP port " + serverPort);
System.out.print("Enter Message: ");
String message = inFromUser.readLine();
rdt_send(message);
// String response = rdt_rcv();
// System.out.println("Received response: " + response);
clientSocket.close();
} catch (UnknownHostException ex) {
System.err.println(ex);
} catch (IOException ex) {
System.err.println(ex);
}
}
private static String make_pkt(String message) {
System.out.println("[RDTClient:make_pkt] " + message);
return message;
}
private static void rdt_send(String message) {
System.out.println("[RDTClient:rdt_send] " + message);
String packet = make_pkt(message);
udt_send(packet);
}
private static void udt_send(String message) {
// compute the message checksum and create the segment rdt_send and make_pkt
try {
byte[] sendData = new byte[1024];
sendData = message.getBytes();
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, serverPort);
clientSocket.send(sendPacket);
System.out.println("[RDTClient:udt_send] Message sent");
} catch (IOException ioe) {
System.out.println("Failed to send");
}
}
private static String rdt_rcv() {
try {
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.setSoTimeout(10000);
clientSocket.receive(receivePacket);
String message = new String(receivePacket.getData());
IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
System.out.println("[RDTClient:rdt_rcv] Received packet from: " + IPAddress + ":" + port);
return message;
} catch (IOException ioe) {
System.out.println("Failed to read from port");
}
return "";
}
}