제가 설명했던 배열을 이용한 원형큐 예제입니다
솔직히 기대를 많이 했었는데 아직 아무도 제대로 구현을 못하신듯하여 예제로 남김니다.
원랜 안올리려다가 제가 구현 불가능한걸 설명한게 아니라는걸 확인시켜 드리기 위해서
예제로 만들었습니다. 구현 시도해보셨던분들은 본인 소스랑 이소스랑 비교해보시기
바람니다. . 한국 최근 옵이 아니라면 4byte 보다 작은 패킷은 본적이 없습니다.
소스자체를 올린게 몇년만인지 모르겟네요 ..
import l1j.server.server.utils.IntRange;
public class CircleArray {
private byte[] data;
private int size = 0;
private int read_loc = 0;
private int write_loc = 0;
private int total_write_length = 0;
public CircleArray(int _size){
size = _size;
data = new byte[_size];
}
/**
* 패킷 데이터 삽입
* @param packet
*/
public void insert(byte[] packet,int _size){
int temp_length = IntRange.ensure(_size, 0,size - write_loc);
System.arraycopy(packet, 0, data, write_loc, temp_length);
write_loc = (write_loc + temp_length) % size;
if((_size - temp_length) > 0){
System.arraycopy(packet, temp_length, data, write_loc, _size - temp_length);
write_loc += _size - temp_length;
}
total_write_length += _size;
}
/**
* length 만큼 패킷 취득
* @param length
* @return
*/
public byte[] Pull(int length){
byte[] packet = new byte[length];
int temp_length = IntRange.ensure(length, 0,size - read_loc);
System.arraycopy(data, read_loc, packet, 0, temp_length);
read_loc = (read_loc + temp_length) % size;
if((length - temp_length) > 0){
System.arraycopy(data, read_loc, packet, temp_length, length - temp_length);
read_loc += length - temp_length;
}
total_write_length -= length;
return packet;
}
/**
* 다음 패킷 존재 및 완성 여부
* @return
*/
public int isPacketPull(){
int readsize = PacketSize();
if(readsize != -1 && readsize <= total_write_length){
return readsize;
}
return -1;
}
/**
* 읽어야할 패킷 길이
* @return
*/
public int PacketSize() {
if(4 > total_write_length)return -1;
int length = data[read_loc] & 0xff;
length |= data[(read_loc+1) % size] << 8 & 0xff00;
return length;
}
}
짤은 그냥 .. 우리 니니 ~ @
[출처] 제가 설명했던 배열을 이용한 원형큐 예제입니다. (비공개 카페)

준희미니 님의 최근 댓글
rt 2021 05.25 ㄳ 2021 05.11 ㄳ 2021 05.11 rt 2021 05.09 rt 2021 04.25