C# Rookiss Part4 ๊ฒ์์๋ฒ : PacketGenerator
๐โโ๏ธPacketGenerator
ํจํท ์์ฑ๊ธฐ
๐ช๋ถ์
- Packet Generator 1
- Packet class
- Size packetId๋ ํค๋์ ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ด์ง๋ง ์ค์ง์ ์ผ๋ก ์ฌ์ฉํ์ง ์์
- Packet class๋ฅผ ์ ๊ฑฐํ๊ณ ์์์ ์ ๊ฑฐํจ
- ์์ฑ์๋ก ๊ฐ์ ๋ฃ๋๊ฒ์ด ์๋๋ผ ๋ง๋ฐ๋ก ๋ฃ์
- PacketGenerator
- ์๋ณธ์ ๋ํ ์ ์๊ฐ ํ์
- ํจํท ์ ์๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ ์ง ์ ์ ํด์ผ๋๋ค (json, xml)
- PDL(PacketDefinitionList) - xml
- ํค๋์ xml์๋ํ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ
- ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค -
<PDL> </PDL>
<long name="playerId"/>
์ด๋ฐ์์ผ๋ก ๋ฐ๋ก ๋ซ์์ ์๋ค- packet long string ๋ฑ๋ฑ์ ์ ํด์ง ์ด๋ฆ์ด ์๋๋ผ ํ์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ง์ถฐ์ฃผ๋ ์ด๋ฆ์ด๋ค
- ๊ธฐ๋ณธ์ ์ธ๊ฒ๋ค์ ์๋ฉด ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์์ ์๊ณ ์ด๋ฅผ ์ด์ฉํด ์๋ํ ํด์ ๋ง๋ ๋ ๊ฒ!
- xml์ ๋์นญ์ ์ธ ๊ตฌ์กฐ์์ ํธํ๊ณ ์ด์ค ๋ฆฌ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค
- cpp์์๋ ๊ณต์๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ xml์ ํ์ฑํ๋ ๊ฒ์ด ์์ง๋ง cs์๋ ์์ (XmlReader)
- Packet class
<?xml version="1.0" encoding="utf-8" ?>
<PDL>
<packet name="C_PlayerInfoReq">
<byte name="testByte"/>
<long name="playerId"/>
<string name="name"/>
<list name="skill">
<int name="id"/>
<short name="level"/>
<float name="duration"/>
<list name="attribute">
<int name="att"/>
</list>
</list>
</packet>
<packet name ="S_Text">
<int name="testInt"/>
</packet>
</PDL>
- XmlReader
- PacketGenerator Program
- XmlReader๋ก Xml๋ฅผ ์ฝ์ ์ ์๊ณ Create๋ก ํ์ผ๊ณผ ์ต์ ์ ๋ฃ์ ์ ์๋ค
XmlReader r = XmlReader.Create("PDL.xml", settings);
- ์ด๋ settings๋ XmlReaderSettings๋ฅผ ๋ฐํํ๋๋ฐ ์จ๊ฐ ์ค์ ์ด ๊ฐ๋ฅ!
IgnoreComments = true
- ์ฃผ์์ ๋ฌด์IgnoreWhitespace = true
- ์คํ์ด์ค๋ฅผ ๋ฌด์
XmlReaderSettings settings = new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true };
- XmlReader๊ฐ ํ์ฑ์ ์๋ฃํ ๋ค์๋
r.Dispose();
๋ก ๋ซ์์ฃผ๋ ์์ ์ ํด์ผ๋จ - using() {}์ ์ฌ์ฉํ๋ฉด ๋ง์น ๋ ์๋์ผ๋ก Dispose()๋ฅผ ํด์ค
r.MoveToContent();
๋ฅผ ํ๋ฉด PDL์์ ํค๋๊ฐ์ ๋ถ๋ถ์ ๊ฑด๋๋ฐ๊ณ ํต์ฌ์ ์ด ๋ด์ฉ์ผ๋ก ๋ฐ๋ก ๊ฐr.Read()
๋ ํ์ฑ์ ํ๋ ๊ฒ์ผ๋ก Stream๋ฐฉ์ ์ฆ, ํ์คํ์ค ์ฝ์
using (XmlReader r = XmlReader.Create(pdlPath, settings)) { r.MoveToContent(); while (r.Read()) { Console.WriteLine(r.Name + " " + r["name"]); } }
Console.WriteLine(r.Name + " " + r["name"]);
- `r[โnameโ]์ name์ด๋ผ๋ ํ๋กํผํฐ๋ฅผ ์ฝ๋ ๊ฒr.Name
- packet (ํ์ ) ,r["name"]
- PlayerInfoReq (๋ด์ฉ๋ฌผ)-
</packet> </PDL>
๋ ํ์ฑ์ํจ -pakcet PDL
- ๋ฐ๋ก PacektGenerator๋ฅผ ๋น๋ํ๋ฉด ์๋ฌ๊ฐ ๋จ
- ์คํํ์ผ์ด ์๋ ์์น์์ ์ฝ๊ธฐ ๋๋ฌธ์ PDLํ์ผ์ ์คํํ์ผ์ด ์๋ ํด๋์ ๋ฃ์ด์ฃผ์ด์ผ ๋จ!
- PacketGenerator Program
static void Main(string[] args)
{
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true,
IgnoreWhitespace = true
};
using (XmlReader r = XmlReader.Create(settings))
{
r.MoveToContent();
while (r.Read())
{
if (r.Depth == 1 && r.NodeType == XmlNodeType.Element)
{
ParsePacket(r);
}
//Console.WriteLine(r.Name + " " + r["name"]);
}
}
}
- packet์ฝ๊ธฐ
if(r.Depth == 1 && r.NodeType == XmlNodeType.Element)
๋ฉด ParsePacket(r);
์ ์คํ
r.Depth
๋ PDL์ packet์ ๊น์ด๊ณ ` r.NodeType == XmlNodeType.Element๋ถ๋ถ์
</packet> </PDL>`์ ํ์ฑํ์ง ์๊ฒ ์์ํ๋ ๋ถ๋ถ๋ง ์ฝ์
- ParsePacket
public static void ParsePacket(XmlReader r)
{
if (r.NodeType == XmlNodeType.EndElement)
return;
if (r.Name.ToLower() != "packet")
{
Console.WriteLine("Invalid packet node");
return;
}
string packetName = r["name"];
if (string.IsNullOrEmpty(packetName))
{
Console.WriteLine("Packet without name");
return;
}
ParseMembers(r);
}
if (r.NodeType == XmlNodeType.EndElement) return;
์ผ๋ก ๋ซํ๋ ๋ถ๋ถ์ด๋ฉด returnif (r.Name.ToLower() != "packet") { Console.WriteLine("Invalid packet node"); return; }
์ผ๋ก packet๊ณผ ์ด๋ฆ์ด ๋ค๋ฅด๋ฉด return,r.Name.ToLower()
์r.Name
์ ์๋ฌธ์๋ก ๋ฐ๊ฟstring packetName = r["name"];
๋ก packet์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ ธ์ดif (string.IsNullOrEmpty(packetName)) { Console.WriteLine("Packet without name"); return; }
๋ก ๋น์ด์๋ค๋ฉด return
์ฌ๊ธฐ๊น์ง ์ค๋ฉด packet์ธ๊ฒ์ด ๋ถ๋ช ํ๋ packet๋ด์ Member๋ค์ ์ฝ์ด์ผํ๋ฏ๋ก ParseMember(r)๋ก ์ด๋
- ParseMembers
public static void ParseMembers(XmlReader r)
{
string packetName = r["name"];
int depth = r.Depth + 1;
while (r.Read())
{
if (r.Depth != depth)
break;
string memberName = r["name"];
if (string.IsNullOrEmpty(memberName))
{
Console.WriteLine("Member without name");
return;
}
string memberType = r.Name.ToLower();
switch (memberType)
{
case "byte":
case "sbyte":
case "bool":
case "short":
case "ushort":
case "int":
case "long":
case "float":
case "double":
case "string":
case "list":
default:
break;
}
}
}
int depth = r.Depth + 1;
์ฆ depth๊ฐ +1 ์ผ ๋๊น์ง ๋ฃจํ๋ฅผ ๋๋๊น
<int name="id"/>
<short name="level"/>
<float name="duration"/>
๋ฅผ ๋ค ํ์ฑํ๊ณ ๋น ์ ธ๋์ด
string memberType = r.Name.ToLower();
๋ก ๋งด๋ฒ๋ค์ ํ์
์ ์ฒดํฌ
์ค์์น๋ฌธ์ ๋๋ฉด์ ๊ฐ ํ์ ๋ง๋ค ์ด๋ค ๊ฐ์ ๋ฃ์์ง๋ฅผ ์ ํจ
๐ชPacketFormat
public static string packetFormat = @"";
ํ์
@โโ;์ ์ฌ๋ฌ์ค์ ๋ฌธ์์ด์ ๋ฃ์ ๋ ์ฌ์ฉํจ
๊ณ ์ ์ ์ธ๊ฒ์ ๊ทธ๋๋ก ๋๋๊ณ ๊ฐ๋ณ์ ์ธ ๊ฒ๋ค์ {0} {1} {2} โฆ ์์ผ๋ก ๊ต์ฒดํ๋ค
- ๊ฐ๋ณ์ ์ธ ๊ฒ๋ค
- ํ์ฑํ xml์์ ๋ด์ฉ์ด ๋ค์ด๊ฐ์ผ ํ๋ ๊ฒ๋ค - ๋ฉค๋ฒ ๋ณ์๋ค
- ํจํท ์ด๋ฆ๋ฑ PDL์ ์ ์๋ ๊ฒ๋ค - ํจํท ์ด๋ฆ
- ์ค์ง์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ ๋ถ๋ถ - ๋ฉค๋ฒ ๋ณ์ Read
- ๋ณ์ ํ์, ๋ณ์ ์ด๋ฆ ๋ฑ๋ฑ