๐ Packetํด๋์ค์ ์ฌ์ฉ๋ฒ
Packet ํด๋์ค์ ๊ฒฝ์ฐ packetId๋ฅผ ํตํด์ ์ด๋ค packet์ ๋ณด๋ด๋์ง ์๋ณํ๋ค.
ํ์ง๋ง ์ด๋ฌํ packetId๋ง์ ๊ฐ์ง๊ณ ๋ ๊ฐ๋ณ์ ์ธ ์ฌ์ด์ฆ๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด์ ์ฒ๋ฆฌํ๊ธฐ๊ฐ ํ๋ค๋ค. ๋ฐ๋ผ์ ํด๋น packet์ size ๋ํ ๊ฐ์ฒด์์ ๊ฐ์ง๊ณ ์๋ค.
class Packet
{
public ushort size;
public ushort packetId;
}
๐ PacketSession
์ด์ ํ์ฑ์ ํด์ฃผ๋ PacketSession์ ๋ง๋ค์ด ์ค ๊ฒ์ด๋ค.
ํ์ฑ์ด๋ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถํดํ๊ณ ์กฐ๋ฆฝํ์ฌ ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ก ๊ฐ๊ณตํ๋ ๊ฒ์ ๋งํ๋ค.
public abstract class PacketSession : Session
{
public sealed override int OnRecv(ArraySegment<byte> buffer)
{
return 0;
}
public abstract void OnRecvPacket();
}
override ํ์ ์๋ฅผ ํตํ์ฌ ์ถ์ํด๋์ค ์์๋ ๋ฉ์๋๋ฅผ ์ ์ ํ ์ ์๋ค.
๋ํ sealed ํ์ ์๋ฅผ ํตํ์ฌ ํด๋น ๋ฉ์๋๊ฐ ์์์ ํตํด์ ์ฌ์ ์ ๋๋ ๊ฒ์ ๋ง๊ณ ์๋ค.
๋ฐ๋ผ์ OnRecvPacket์ ํตํด์ Packet์ ๋ฐ๊ณ ๊ทธ ํ์ ์ฒ๋ฆฌ๋ PacketSession์ OnRecv์์ ์ฒ๋ฆฌํ๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค.
public abstract class PacketSession : Session
{
public static readonly int HeaderSize = 2;
public sealed override int OnRecv(ArraySegment<byte> buffer)
{
int processLen = 0;
while(true)
{
//์ต์ํ ํค๋๋ ํ์ฑํ ์ ์๋์ง ํ์ธ
if (buffer.Count < HeaderSize)
break;
//ํจํท์ด ์์ ์ฒด๋ก ๋์ฐฉํ๋์ง ํ์ธ
ushort dataSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset);
if (buffer.Count < dataSize)
break;
// ์ฌ๊ธฐ๊น์ง ์์ผ๋ฉด ํจํท ์กฐ๋ฆฝ ๊ฐ๋ฅ
OnRecvPacket(new ArraySegment<byte>(buffer.Array,buffer.Offset,dataSize));
processLen += dataSize;
buffer = new ArraySegment<byte>(buffer.Array, buffer.Offset + dataSize, buffer.Count-dataSize);
}
return processLen;
}
public abstract void OnRecvPacket(ArraySegment<byte> buffer);
}
OnRecv๋ฉ์๋๋ ๋ฐ์ ํจํท ํด๋์ค๋ฅผ ํ์ฑ์ ํ๋ ์ญํ ์ ํ๋ค.
์ธ์๋ก ํจํท์ด ๋ด๊ฒจ์๋ ๋ฐฐ์ด์ ๋ฐ์์ ์ด๋ฅผ ๋ถ์ํ๋ค.
if(buffer.Count < HeaderSize) ๋ถ๋ถ์ ์ต์ 2๋ฐ์ดํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ๋ถ์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ ๋ฐฐ์ ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์์ ํจํท์ ์ฌ์ด์ฆ์ ํด๋น์ด ๋๊ฒ๋ ๋ฐ์ดํฐ๊ฐ ์๋์ง๋ฅผ ํ์ธํ๋ ๋ถ๋ถ์ด๋ค.
ํ์ฌ ushort๋ก size ๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ BitConverter๋ฅผ 16๋นํธ ๋ฒ์ ์ผ๋ก ํ์ฌ size๊ฐ์ dataSize์ ์ ์ฅํ์๋ค.
ํด๋น dataSize์ ๊ฐ๋ณด๋ค buffer์ ํฌ๊ธฐ๊ฐ ์์์๋ ์๋๋ค.
์ฌ๊ธฐ๊น์ง ํ์ธ์ด ์๋ฃ๋๋ฉด ์ด์ OnRecvPacket์ด ๊ฐ๋ฅํ ์ํ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ์ ํจํท์ ๋ค์ฝ์๋ค๋ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์ํ์ฌ buffer๋ฅผ dataSize๋งํผ ์์ ์ ์ธํ๋ค.