如何在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); 
        
  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...