首页 > 解决方案 > 如何在 UDP 中实现循环缓冲区?

问题描述

我不太确定如何将环形缓冲区与 UDP 数据包一起使用。我有一个名为 enqueue() 的方法,它将数据添加到缓冲区,但 socket.receive() 应该将数据添加到缓冲区。那么,当我们从客户端接收到数据包时,如何使用 enqueue 而不是 socket.receive() 呢?还是不应该这样使用?

我的环形缓冲区类:

private static int front, rear;
private int[] nums;

public RingBuffer(int initialSize) {
    this.front = this.rear = -1;
    this.nums = new int[initialSize];
}

public void enqueue(int data) {
    if(isFull()) {
        resize();
    } else if(isEmpty()) {
        front++;
    }
    
    rear = (rear+1) % nums.length;
    nums[rear] = data;
}

public int dequeue() {
    if(isEmpty()) {
        throw new NoSuchElementException();
    }
    
    int temp = nums[front];
    
    if(front == rear) {
        front = rear = -1;
    } else {
        front = (front + 1) % nums.length;
    }
    
    return temp;
}

private void resize() {
    
    int[] tempArr = new int[nums.length * 2];
    int i = 0;
    int j = front;
    
    do {
        tempArr[i++] = nums[j];
        j = (j + 1) % nums.length;
    }while(j != front);
    
    front = 0;
    rear = nums.length - 1;
    nums = tempArr;
}

private int peek() {
    if(isEmpty()) {
        throw new NoSuchElementException();
    }
    
    return nums[front];
}

private boolean isEmpty() {
    
    return front == -1;
}

private boolean isFull() {
    
    return (rear + 1) % nums.length == front;
}

服务器:

public Server() throws IOException {
    

    datagramSocket = new DatagramSocket(9022);
    
    byte[] receiveData = new byte[10];
    DatagramPacket packet = new DatagramPacket(receiveData, receiveData.length);
    
while(true) {
        datagramSocket.receive(packet);
    
        
        InetAddress inetAddress = packet.getAddress();
        int clientPort = packet.getPort();

        String messageReceived = new String(receiveData, 0);
        
        DatagramPacket datagramPacket = new DatagramPacket(messageReceived.getBytes(), 
        messageReceived.getBytes().length, 
                inetAddress, clientPort);
        datagramSocket.send(datagramPacket); 
        
  }

标签: javanetworkingudpcircular-buffer

解决方案


推荐阅读