Я пытаюсь реализовать протокол UDP Stop-and-Wait. Мне удалось получить отправителя и получателя UDP успешно передать файл изображения. Сейчас я пытаюсь реализовать ACK.
Когда мой отправитель заканчивает отправку пакета, он ждет, пока получатель отправит ACK. Получатель отправляет ACK, как только он получил пакет от отправителя.
Вот код в отправителе, который ожидает ACK:
где seqNum
- это номер пакета, который отправитель только что отправил получателю, а sendPacket
- это только что отправленный пакет. Я добавляю это в качестве параметра на случай, если отправителю потребуется отправить его повторно.
private static void receiveACK(int seqNum, DatagramPacket sendPacket) throws IOException {
byte[] ack = new byte[2];
boolean received = false;
int recSeqNum = -1;
ByteArrayInputStream bais = new ByteArrayInputStream(ack);
DataInputStream dis = new DataInputStream(bais);
DatagramPacket receivePacket = new DatagramPacket(ack, ack.length);
while(!received) {
try {
clientSocket.setSoTimeout(50);
clientSocket.receive(receivePacket);
recSeqNum = dis.readShort();
System.out.println("ACK: " + ack );
} catch (SocketTimeoutException e) {
System.out.println("Timed out: Still waiting for ACK");
}
System.out.println(recSeqNum);
if(recSeqNum == seqNum) {
received = true;
} else {
clientSocket.send(sendPacket);
}
}
}
Вот код в приемнике, который отправляет ACK:
private static void sendACK(int seqNum, InetAddress returnAddress) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeShort(seqNum);
dos.flush();
System.out.println("send: " + seqNum);
byte[] sendArray = baos.toByteArray();
DatagramPacket sendPacket = new DatagramPacket(sendArray, sendArray.length, returnAddress, port );
receieverSocket.send(sendPacket);
}
Проблема в том, что получатель просто постоянно пытается отправить первый пакет, а отправитель просто отключается.
Отправитель и получатель находятся на одном компьютере.