import java.io.
*;
import java.net.*;
public class SlidingReceiver {
  public static void main(String[] args) throws Exception {
    DatagramSocket socket = new DatagramSocket(9876);
    byte[] buffer = new byte[1024]; // Increased buffer size to receive packet data
    int expectedPacket = 0; // Track the next expected packet
    boolean[] receivedPackets = new boolean[256]; // Array to track received packets
    while (true) {
       DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
       socket.receive(packet);
       String receivedData = new String(packet.getData(), 0, packet.getLength());
       // Split the received data into sequence number and character
       String[] parts = receivedData.split(":");
       int seqNum = Integer.parseInt(parts[0]) ; // Convert to 0-based index
       char receivedChar = parts[1].charAt(0);
       // Print received character and its sequence number
     System.out.println("Received packet: " + receivedChar + " (Received Sequence Number: " +
seqNum + ")");
       // Check if the packet was already received
       if (!receivedPackets[seqNum]) {
         receivedPackets[seqNum] = true; // Mark this packet as received
         // Send ACK for the received packet
         byte[] ackData = new byte[1];
                ackData[0] = (byte) expectedPacket; // Acknowledgment number
        DatagramPacket ackPacket = new DatagramPacket(ackData, ackData.length,
packet.getAddress(), packet.getPort());
                socket.send(ackPacket);
                System.out.println("Sent ACK: " + expectedPacket);
                expectedPacket++; // Move to the next expected packet
            } else {
                System.out.println("Duplicate packet received: " + receivedChar);
import java.io.*;
import java.net.*;
public class SlidingSender {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        InetAddress receiverAddress = InetAddress.getByName("localhost");
        int receiverPort = 9876;
        int windowSize = 4;
        String message = "Hello, Sliding Window!";
        byte[] data = message.getBytes();
        int base = 0;
        boolean[] sentPackets = new boolean[data.length]; // Track sent packets
        while (base < data.length) {
            // Send packets in the current window
            for (int i = base; i < base + windowSize && i < data.length; i++) {
                if (!sentPackets[i]) { // Only send if not already sent
                    // Create a packet with sequence number and character
                    String packetData = i + ":" + (char) data[i]; // Sequence number:character
          DatagramPacket packet = new DatagramPacket(packetData.getBytes(),
packetData.length(), receiverAddress, receiverPort);
                    socket.send(packet);
                    sentPackets[i] = true; // Mark this packet as sent
                    System.out.println("Sent packet: " + packetData);
            // Wait for ACK
            byte[] ackBuffer = new byte[1];
            DatagramPacket ackPacket = new DatagramPacket(ackBuffer, ackBuffer.length);
            socket.receive(ackPacket);
            int ack = ackBuffer[0];
            System.out.println("Received ACK: " + ack);
            if (ack >= base) {
                base = ack + 1; // Move the base forward
        socket.close();