java - 如何在 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);
}
解决方案
推荐阅读
- php - 尝试在一个 php 函数中加入来自两个不同表的两个 mysql 查询时出现问题
- java - 如何在 Java 中捕获 Material 下拉菜单选择的值?
- excel - 设置 DestSht = ThisWorkbook.Worksheets(folderPath & "\LoaderNew.xlsx") 下标超出范围
- flutter - 为什么打印不等待异步函数的结果?
- javascript - i18next 检查未使用的翻译
- drupal - 修复 Drupal 7 中的“文件系统中缺少以下主题”错误
- node.js - 如何修复 TypeError:无法使用 Nestjs cronjob 在 Axios 上读取未定义的属性“帖子”
- android - 像亚马逊这样的电子商务应用程序如何知道用户点击了哪个商品
- java - 从字符串文件中提取一个值并使用 Java 将其转换为 int
- laravel - 如何在 Laravel 中使用 PHPWord 在同一页面中下载 2 个文档