일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Bucket
- 버킷
- 좌표
- 샘플링
- 시작하기
- lightsail
- Sharp
- streaming
- ProudNet
- 이미지서버
- resize
- multiparty
- AWS
- 화소
- S3
- 리사이즈
- 아날로그영상
- 노선
- nodejs
- 데이터
- 디지털영상
- 프라우드넷
- 튜토리얼
- 이미지
- Node
- 이미지프로세싱
- Thumbnail
- 스트리밍서버
- 게임서버
- 지하철역
- Today
- Total
Deep Studying
[프라우드넷] RPC 통신 이해하기(2) - PIDL 파일에 대해 본문
지난 포스트에서는 프라우드넷이 RMI라는 방식을 통해 통신한다는 것을 알았습니다. 구체적으로 프로젝트에서는 어떻게 구성되어있는지 알아보겠습니다.
이전 포스트: RPC 통신 이해하기(1) - 용어 및 개념 정의
처음 포스트에서 열어보았던 SimpleCSharp 예제의 구조입니다.
우선 차근 차근 설명하겠지만 RMI란 폴더에 있는 common, proxy, stub 세 가지 파일의 존재를 기억하고 설명을 들으시면 좋을 것 같습니다.
PIDL 파일
Simple.PIDL 파일을 열어보면 다음과 같은 내용이 적혀있습니다.
// P2P RMI function definitions.
global Simple 2000 // client-to-client RMI, first message ID = 2000
{
// Example that send chatting message to server
Chat([in] String a,[in] int b,[in] float c);
ShowChat([in] String a,[in]int b,[in]float c);
SystemChat([in] String txt);
P2PChat([in] String a,[in] int b, [in] float c);
}
사용할 수 있는 메서드들과 넣어주어야하는 파라미터들이 정의되있는 것을 확인할 수 있습니다.
ProudNet Documentation - Remote Method Invocation 사용방법
PIDL 파일의 문법에 대해서는 제가 설명드리기보단 위 링크에서 자세히 확인할 수 있습니다.
Common 프로젝트를 빌드하면 Simple.PIDL 파일도 자신의 규칙에 맞게 빌드됩니다.
Simple.PIDL 우클릭 -> 속성 ( Properties ) 에서 확인하시면
( 명령줄 ) 다음과 같이 PIDL.exe라는 프로그램을 실행시켜서
( 출력 ) Simple_proxy.cs, Simple_stub.cs, Simple_common.cs 라는 파일을 만들어냄을 알 수 있습니다.
Stub.cs 파일
Simple_stub.cs 코드입니다.
internal class Stub:Nettention.Proud.RmiStub
{
...
public delegate bool ChatDelegate(Nettention.Proud.HostID remote,Nettention.Proud.RmiContext rmiContext, String a, int b, float c);
public ChatDelegate Chat = delegate(Nettention.Proud.HostID remote,Nettention.Proud.RmiContext rmiContext, String a, int b, float c)
{
return false;
};
...
}
코드의 자세한 내용은 당장 확인하지 않더라도 Stub.Chat에 Default 값이 되는 delegate를 생성해서 붙이고 있습니다.
SimpleCSharpServer 프로젝트의 Program.cs를 열어봅시다.
static void InitStub()
{
g_Stub.Chat = (Nettention.Proud.HostID remote, Nettention.Proud.RmiContext rmiContext, String a, int b, float c) =>
{
Console.Write("[Server] chat message received :");
Console.Write(" a={0} b={1} c={2}\n", a, b, c);
// Echo chatting message which received from server to client.
g_Proxy.ShowChat(remote, RmiContext.ReliableSend, a, b + 1, c + 1);
return true;
};
}
여기서는 Stub.Chat에 다시 새로운 함수를 정의하여 연결하는 것을 볼 수 있습니다.
즉, Simple.PIDL파일이 만들어낸 Simple_stub.cs는 메서드를 먼저 선언해놓고 클라이언트가 실행할 때 오류가 나면 안되니 아무 동작하지 않은 로직을 먼저 붙여둡니다.
서버에서는 프로그램의 Init 단계에서 이를 적절하게 재정의하여 의미 있는 통신으로 만드는 것입니다.
Proxy.cs 파일
저번 포스트에서 열어봤던 Simple_proxy.cs 파일입니다.
public bool Chat(Nettention.Proud.HostID remote,Nettention.Proud.RmiContext rmiContext, String a, int b, float c)
{
// 1. Message 객체 생성
Nettention.Proud.Message __msg=new Nettention.Proud.Message();
__msg.SimplePacketMode = core.IsSimplePacketMode();
// 2. Message의 call type 정하기.
Nettention.Proud.RmiID __msgid= Common.Chat;
__msg.Write(__msgid);
// 3. Marshalling
Nettention.Proud.Marshaler.Write(__msg, a);
Nettention.Proud.Marshaler.Write(__msg, b);
Nettention.Proud.Marshaler.Write(__msg, c);
// 4. 호출하는 호스트의 정보를 넣는다.
Nettention.Proud.HostID[] __list = new Nettention.Proud.HostID[1];
__list[0] = remote;
// 5. 전송한다.
return RmiSend(__list,rmiContext,__msg,
RmiName_Chat, Common.Chat);
}
지난 포스트에서 설명했기 때문에 자세한 설명은 넘어가겠습니다.
코드를 작성해보기 전에 필요한 내용들은 얼추 정리가 된 것 같으니 다음 포스트에서부터는 코드를 작성하여 실제 서버와 클라이언트를 구성해보도록 하겠습니다.
'게임서버' 카테고리의 다른 글
[프라우드넷] 채팅 서버 만들기 (3) Marshaler 이용하기 (2) | 2022.01.12 |
---|---|
[프라우드넷] 채팅 서버 만들기(2) RMI 통신하기 (0) | 2022.01.11 |
[프라우드넷] 채팅 서버 만들기(1) 프로젝트 초기 설정하기 (0) | 2022.01.10 |
[프라우드넷] RPC 통신 이해하기(1) - 용어 및 개념 정의 (0) | 2022.01.09 |
[프라우드넷] 게임 서버 엔진 프라우드넷 시작하기 (4) | 2022.01.07 |