C#/네트워크 27

[c#][서버] Command 패턴 / JobQueue

Command 패턴 개념지금까지는클라이언트 세션이 요청패킷 핸들러에서 함수를 호출해 작업 수행게임 룸에 접근하여 브로드캐스팅주방에 직접 들어가 주문을 하는 것과 비슷직원이 서빙, 요리 다함 -> 그런데 엄청 많은 직원주문하려는 손님이 몰리고, 직원도 좁은 주방에 들어가 있는 상태일이 밀리면, 직원만 더 늘어남직원의 업무를 분담시켜서 직원 수를 가장 최적화시켜야 한다서빙 담당이 주문서를 만들어 주방에 전달하게 하자한 명의 주방장만 주문을 처리하게 하자Command 패턴은, 캡슐화(주문서 만들기) 하는 작업을 하는 것주문을 받는것과 처리하는 것을 분리하는 것이 가능손님이 주문을 바꾸는 경우에도, 쉽게 처리 가능(UNDO) Command 패턴 구현(JobQueue)namespace ServerCore{ ..

C#/네트워크 2024.06.14

[c#][서버] PacketGenerator (3)

파일 참조 자동화지금까지는 파일이나 xml을 만들고 수동으로 반영을 했어야 했다.이제 경로를 설정하여 생성된 파일을 자동으로 참조하도록 해보자.bat 파일 작성.bat파일을 생성하고 각자 경로에 맞게 다음과 같이 수정START ../../PacketGenerator/bin/Debug/PacketGenerator.exe ../../PacketGenerator/PDL.xmlXCOPY /Y GenPackets.cs "../../DummyClient/Packet"XCOPY /Y GenPackets.cs "../../Server/Packet"뒤쪽에 있는 인자가 main의 args에 들어가서 실행되게 된다.XCOPY는 파일을 복사해서 넣는다는 것이고/Y 옵션을 넣으면 동일 파일 존재할 시 덮어쓰기 이다생성 bat파..

C#/네트워크 2024.06.12

[c#][서버] Packet Generator - 코드 작성 자동화

자동화지금까지 string, list 등 자료형의 처리에 대한 함수를 짜두었다.이를 자동화 하도록 하나로 합쳐보는 작업을 한다무언가 멤버가 하나 더 생길때마다 클래스에 찾아가서 한줄씩 추가하는 작업을 없애보자Packet 정의Packet이 어떻게 이뤄져 있는지 정의가 필요하다.Xml로 해보자/*class PlayerInfoReq{ public long playerId; public string name; public struct SkillInfo { public int id; public short level; public float duration; } public List skills = new List();} //이거를 아래처럼 x..

C#/네트워크 2024.06.09

[c#][서버] Serialization (2)

string이나 list같은 가변크기의 패킷을 어떻게 처리하나?1. string 처리앞에 2바이트를 이 문자열의 크기로 정하고뒤에를 내용으로 채우면 된다.//string -> len[2b], byte[내용] 로 보내면 되지 않을까Span s = new Span(segment.Array, segment.Offset, segment.Count);ushort nameLen = (ushort)Encoding.Unicode.GetBytes(this.name, 0, name.Length, segment.Array, segment.Offset + count + sizeof(ushort));success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), ..

C#/네트워크 2024.06.09

[c#][서버] Unicode & Encoding / UTF8 vs UTF16

Ascii 코드1바이트로 문자를 표현ex) A = 0x41(65), ! = 0x21(33)UniCode다른 나라의 언어도 표현하기 위해 2바이트를 사용해 문자를 표현그럼에도 표현하지 못하는 문자는 3바이트를 사용ex) ㅎ = 0x001112, A = 0x000041Encoding가변적인 방법으로 컴퓨터에게 문자를 어떻게 매핑할지 결정하는 것매번 최대 바이트로 사용하면 낭비가 심하기 때문에 분류를 해둔 것UTF-8한글이 속한 분류영문은 1byte, 한글은 3byte로 사용UTF-16BMP까지는 2바이트(한글, 영문 모두), 다음은 4바이트BMP = 많이 쓰는 언어, 해당 범위를 넘어가면 음악기호같은 잘 안쓰는 부분대부분의 디폴트는 UTF16

C#/네트워크 2024.06.09

[c#][서버] PacketSession

패킷 조립그냥 byte 배열을 보내는 것이 아닌, Size, packetId등을 가진 패킷을 조립해서 넘겨보자namespace Server{ class Packet { //최대한 크기를 작게 보내자 public ushort size; //2 Byte public ushort packetId; } class GameSession : PacketSession { //OnRecv가 PacketSession에서 sealed가 됐으므로, 재정의 불가 //abstract OnRecvPacket을 정의하여 사용 public override void OnRecvPacket(ArraySegment buffer) ..

C#/네트워크 2024.06.07