public class JNetPacket { //================ // 변수들. //================ //정수형 데이터 private final static int INTEGER = 899; // 타입들 public static final short DEFAULT = 999; public static final short LOGIN = 10; public static final short LOGININFOR = 11; public static final short DISCONNECT = 12; public static final short RESEND = 13; public static final short CHAT = 20; public static final short WHISPER = 21; public static final short FIGHT = 30; public static final short TESTPACKET = 41; public static final short GROUPWAIT = 50; public static final short GROUPSEND = 51; private int Size = 1000; private static ByteBuffer Buf; // 받을때 처리 메시지 public static String RecvMsg = ""; //패킷 처리 public static boolean RecvSucess = true; // 선언시 ByteBuffer 사이즈와 초기화 public JNetPacket() { Buf = ByteBuffer.allocate(Size); Buf.clear(); }
// 사이즈 직접 조정하기 public JNetPacket(int CSize) { Size =CSize; Buf = ByteBuffer.allocate(Size); Buf.clear(); } //사이즈 public int Size(){ return Size; } // 데이터의 타입 설정 public void Type(short Type) { // short 사이즈/ byte사이즈가 현재 버퍼를 사용한것보다 작을시에는 데이터 못넣게 Error if (Buf.remaining() > Short.SIZE / Byte.SIZE) { Buf.putShort(Type); } else { OverPacket(); } }
// 데이터 삽입 public void Add(String Data) { int Size = Data.getBytes().length; if (Buf.remaining() > (Size + Integer.SIZE / Byte.SIZE)) { Buf.putInt(Size); Buf.put(Data.getBytes()); } else { OverPacket(); } } public void Add(int _Data) { int IntegerSize = INTEGER; if (Buf.remaining() > (Integer.SIZE * 2) / Byte.SIZE) { Buf.putInt(IntegerSize); Buf.putInt(_Data); } else { OverPacket(); } } public ByteBuffer getBuf() { //포지션 초기화 Buf.rewind(); return Buf; } //버퍼사이즈보다 클경우 초기화후 이벤트처리 public boolean OverPacket() { Buf.clear(); return false; } public void Clear() { Buf.flip(); Buf.clear(); } //데이터 변환 버퍼->문자열 public static String RecvOut(ByteBuffer RecvBuf) { RecvMsg = ""; RecvSucess = true; int trySize = RecvBuf.getInt(); switch (trySize) { case INTEGER: RecvMsg += RecvBuf.getInt(); break; default: byte[] StrBuf = new byte[trySize]; RecvBuf.get(StrBuf); RecvMsg += new String(StrBuf); break; } return RecvMsg; } //추가적으로 암호화 추가할 예정... }
사용법은 정말 간단합니다. 제가 워낙 간단한걸 좋아하다보니 ㅋ_ㅋ
"//타입들" 이라고 해서 여러가지 변수들이 있습니다.
사용자에 따라서 타입을 수정하거나 추가 하실 필요가 있습니다.
하지만, 몇가지 유의사항이 있습니다.
1 . 저 옆에 보이는 숫자는 중복되어선 안됩니다.
2. 항상 양식은 public static final short 로 값이 변하지 않고, 어디서든 사용해야 하며, Short 형이어야 합니다.
3. 범위는 -32768 ~ 32767 까지 입니다. 그안에 타입들의 수를 정하시면 되겠습니다.
사용법은
JNetPacket RecvPacket = new JNetPacket();
생성후,
RecvPacket.Type()
RecvPacket.Add()
RecvPacket.Add()
이런식으로 패킷을 처음에 타입을 정한후, 데이터를 추가하시면 되겠습니다.
그리고, 패킷의 문자열을 뽑고싶다?
그러면
문자열.. =JNetPacket.RecvOut(ByteBuffer 형태);
이렇게 하시면 문자열.. 에 ByteBuffer 형태를 문자열로 변환해 줍니다.
이상 설명은 끝났습니다.
나중에 패킷을 저만의 방식으로 암호화,복호화를 만들어서 "2.1Version" 으로 찾아뵙도록 하겠습니다.
서버&클라이언트 패킷 송수신 간에 패킷 암호화는 정말이지 중요한 부분이라서 꼭 만들어야 하는 부분입니다.