27
1 SyncZone – Server Development Community Ver.1.0.0 ‘ 오오오오오 오오오’ C# 오오오오 오오오 SyncZone Issue Date : 2015-05- 26

오픈소스를 활용한 C# 채팅서버 만들기

  • Upload
    -

  • View
    2.369

  • Download
    4

Embed Size (px)

Citation preview

Page 1: 오픈소스를 활용한 C# 채팅서버 만들기

Ver.1.0.0

‘ 오픈소스를 활용한’

C# 채팅서버 만들기SyncZone

Issue Date : 2015-05-26

Page 2: 오픈소스를 활용한 C# 채팅서버 만들기

2SyncZone – Server Development Community

시작하기에 앞서… ^^;

SyncZone 에서는 ‘ Aegis’ 라는 무료 네트워크 모듈을 활용하여

C# 으로 보다 가벼운 접근으로 나에게 최적화된 서버를 구축할 수 있도록

다양한 개발정보와 Prototype 소스 등을 함께 나누고자 합니다 .

Aegis 네트워크 모듈은 ‘㈜엔티스피어’에서 개발하여 무료로 공개하고 있습니다 .

Aegis 네트워크 모듈은 Git Hub 를 통해 배포하고 있으며 ,

서버용 네트워크 모듈은 물론 클라이언트 (C#, Unity3D) 용 모듈까지 함께 제공하고

있습니다 .

Aegis 모듈은 아래 주소에서 다운로드 받으실 수 있습니다 .

https://github.com/SyncZone/Aegis

Page 3: 오픈소스를 활용한 C# 채팅서버 만들기

3SyncZone – Server Development Community

시작하기 전에01 단계

Page 4: 오픈소스를 활용한 C# 채팅서버 만들기

4SyncZone – Server Development Community

1. 목표

채팅서버는 간단해 보이면서도 서버에 필요한 내용들을 많이 포함하고 있습니다 .게임서버를 구성할 때 가장 많이 쓰이는 방식이기도 하죠 .

이번 문서는 소스코드 보다는 서버의 구성과 기능 중심으로 설명이 진행됩니다 .

채팅서버의 기능

기능과 역할을 분류하는 로직 설계

프로토콜과 패킷 정의

패킷을 처리하는 로직 시퀀스

Page 5: 오픈소스를 활용한 C# 채팅서버 만들기

5SyncZone – Server Development Community

2. 예제 소스와 함께 보세요

이 문서는 서버를 코딩하는 과정이 아닌 ,서버개발의 전반적인 부분을 다루고 있습니다 .

그래서 예제로 제공되는 소스코드와 같이 비교하면서 보신다면 더욱 좋습니다 .

Source Code 는 GIT HUB 에 있어요↓ ↓ ↓

https://github.com/SyncZone/SimpleChat

Page 6: 오픈소스를 활용한 C# 채팅서버 만들기

6SyncZone – Server Development Community

채팅 서버의 구조02 단계

Page 7: 오픈소스를 활용한 C# 채팅서버 만들기

7SyncZone – Server Development Community

1. 개요

프로그램을 만들기 전에 먼저 생각해야 하는 것이 있죠 .

- 무엇을 만들 것인가 ?

- 어떤 기능들이 필요한가 ?

첫 번째 질문에 대한 답은 이미 갖고 있습니다 .사용자들이 서로 대화를 주고받는 채팅서버를 만드는 것이죠 !

이번 단계에서는 두 번째 질문에 대한 정리를 해보겠습니다 .

Page 8: 오픈소스를 활용한 C# 채팅서버 만들기

8SyncZone – Server Development Community

2. 채팅서버의 기능

1. 로그인채팅에서 서로를 식별하기 위해서는 최소한 닉네임 정도의 식별자가 있어야겠죠 .우리는 닉네임을 입력 받아 사용자를 로비에 입장시켜 주는 로그인 과정이 필요합니다 .

2. 로비 - 룸 구조일상생활에서 모든 건물은 공용공간과 방으로 나누어져 있습니다 . 공용공간 즉 로비는 건물에 들어선 사람이 처음으로 접하는 공간이고 , 이 곳을 통해서 방으로 들어갈 수 있습니다 . 구조적으로 보면 방은 로비에 연결되어있는 시설인 것이죠 .우리 채팅서버 역시 이와 같은 로비 - 룸 구조를 갖습니다 .

3. 방 생성방은 채팅을 위한 공간입니다 . 물론 로비에서도 대화할 수 있지만 그러면 너무 혼잡해지지 않을까요 ?방을 생성해서 대화를 나누는 것이 에티켓이죠 ^^

4. 방 입장물론 , 다른 사람이 생성한 방에 입장할 수도 있어야 합니다 .

5. 채팅채팅은 방에 모인 사람들이 서로 대화를 주고 받는 과정입니다 .한 사람의 메시지를 방 안의 모든 사람들에게 전달하는 브로드캐스팅 (Broadcasting) 이 필요하죠 .

서로간에 메시지를 주고받는 기능에 초점을 맞추어 필수적인 기능만을 구성해 봤습니다 .

Page 9: 오픈소스를 활용한 C# 채팅서버 만들기

9SyncZone – Server Development Community

앞에서 정의한 채팅서버의 기능들을 논리적인 단위로 나누고 , 각 객체들의 역할을 만드는 과정입니다 .

보통 이 과정을 ‘설계'라고 할 수 있는데 ,여기서는 필수적인 내용과 흐름 정도만 점검해보겠습니다 .( 설계 수준으로 들어가면 너무 복잡해져서요 ^^;)

이제 채팅서버의 구성에 대해 이야기 해보죠 !

Page 10: 오픈소스를 활용한 C# 채팅서버 만들기

10SyncZone – Server Development Community

3. 로직 구성도

ClientSession User

Lobby Room

기능 구성은 두 가지로 분류해 볼 수 있습니다 .

① 유저관리

② 로비 - 룸

Page 11: 오픈소스를 활용한 C# 채팅서버 만들기

11SyncZone – Server Development Community

3. 로직 구성도 – Lobby-Room 구조

Lobby Room 1

이 구성은 채팅 뿐만 아니라 캐주얼 게임에서도 많이 쓰이는 기본적인 구조입니다 .대표적으로 한게임 (HanGame) 에서도 찾아볼 수 있으며 , 인던 (Instant Dungeon) 과도 흡사하죠 ! ^^

Room n

Room 2

Lobby 는 여러 개의 Room 을 관리하는 클래스이고 , 다음과 같은 기능들이 필요합니다 .

1. 방을 생성하고 , 생성된 방을 리스트로 갖는다 .

2. 인원이 0 명인 방은 삭제한다 .

3. 방에 대한 정보 ( 생성 , 삭제 , 인원 수 등 ) 가 변경되면 로비의 사용자들에게 변경된 내용을 즉시 전달한다 .

.

.

.

Page 12: 오픈소스를 활용한 C# 채팅서버 만들기

12SyncZone – Server Development Community

3. 로직 구성도 - 유저관리

ClientSession User

클라이언트 하나는 한 명의 사용자라고 볼 수 있습니다 . (1 Client = 1 User)

ClientSession 자체를 사용자로 정의하고 닉네임 등 유저 정보를 포함시켜 쓸 수도 있지만 , 여기에서는 사용자를 User 클래스로 정의해서 독립적으로 사용합니다 .

네트워크 작업을 위한 ClientSession 과 채팅의 요소인 User 는 엄연히 역할이 다르기 때문이죠 . 그래서 클래스는 분리시키되 서로가 1:1 연관을 갖게 합니다 .

Lobby

Room

Page 13: 오픈소스를 활용한 C# 채팅서버 만들기

13SyncZone – Server Development Community

4. Class Diagram

네트워킹을 위해 Aegis 의 Session 을 상속받아 ClientSession 을 구현합니다 .

ClientSession 과 User 는 서로가 연관을 갖습니다 .

Room 은 Lobby 에 종속적인 관계입니다 .

User 는 Lobby 와 Room 양쪽에 모두 위치할 수 있습니다 .

Page 14: 오픈소스를 활용한 C# 채팅서버 만들기

14SyncZone – Server Development Community

긴 설명을 Class Diagram 으로 정리해 봤습니다 . 서버 로직을 쉽게 이해 할 수 있도록… ^^;.

하지만 바로 개발하기에는 아직 2% 부족합니다 .보다 구체적인 흐름이 필요하고 , 가장 중요한 패킷 처리 ( 프로토콜 )에 대한 부분이 남아있으니까요 .

다음 단계에서는 프로토콜과 시퀀스에 대해 이야기 해보겠습니다 .

Page 15: 오픈소스를 활용한 C# 채팅서버 만들기

15SyncZone – Server Development Community

시퀀스 (Sequence)03 단계

Page 16: 오픈소스를 활용한 C# 채팅서버 만들기

16SyncZone – Server Development Community

1. 개요

서버는 클라이언트의 요청이 있어야 동작하는 프로그램이죠 .

그래서 클라이언트와 서버가 서로 통신하기 위한 규칙을 정의하는데 ,

이것을 프로토콜 (Protocol)이라고 합니다 .

서버가 패킷을 수신하면 정의한 규칙 (Protocol) 에 의해 패킷을 분석하고 , 그 내용을 로직에

보내 처리를 합니다 . 패킷 수신이 서버를 동작시키는 신호 (Signal) 라고 한다면 그 이후의 동작

과정을 흐름으로 그려볼 수 있습니다 .

이러한 흐름을 쉽게 확인해볼 수 있도록 Sequence Diagram 으로 설명을 진행합니다 .

Page 17: 오픈소스를 활용한 C# 채팅서버 만들기

17SyncZone – Server Development Community

2. 로그인 – 프로토콜 (Protocol)

Protocol 설명

CS_Hello_Ntf클라이언트가 서버에 접속하면 서버에서 클라이언트로 보내는 최초의 패킷입니다 .서버가 클라이언트와 네트워킹을 진행할 준비가 되었다는 의미입니다 .

CS_Login_Req 채팅서버에 로그인을 요청합니다 .

CS_Login_Res 로그인 처리를 마친 후 결과를 전송합니다 .

서버에 TCP/IP 연결이 되면 서버에서도 통신을 준비하기 위한 과정이 필요할 수도 있습니다 .그래서 서버도 준비가 다 되었다는 의미로 Hello 패킷을 보내죠 .

클라이언트는 CS_Hello_Ntf 를 받은 이후 부터 통신을 시작합니다 .

Page 18: 오픈소스를 활용한 C# 채팅서버 만들기

18SyncZone – Server Development Community

2. 로그인 – 시퀀스 (Sequence)

Login 요청이 오면 서버는 User객체를 생성하고 User 를 Lobby 에 입장시킵니다 .

클라이언트는 서버에 접속하면 Hello 패킷을 받습니다 .

Page 19: 오픈소스를 활용한 C# 채팅서버 만들기

19SyncZone – Server Development Community

3. 로비 – 프로토콜 (Protocol)

Protocol 설명

CS_Lobby_RoomList_Req 현재 생성되어있는 방 목록을 요청합니다 .

CS_Lobby_RoomList_Res 방의 목록과 각 방의 정보를 담은 응답패킷입니다 .

CS_Lobby_CreateRoom_Req 새로운 방 생성을 요청합니다 .

CS_Lobby_CreateRoom_Res 방을 생성하고 결과를 전달합니다 .

CS_Lobby_EnterRoom_Req 방에 입장을 요청합니다 .

CS_Lobby_EnterRoom_Res 방 입장을 처리하고 결과를 전달합니다 .

CS_Lobby_RoomStatus_Ntf방의 정보가 변경 ( 생성 , 인원 수 , 삭제 ) 되면 해당 방의 정보를 전달합니다 .

방의 정보가 변경되면 서버에서 클라이언트로 해당 정보를 전달합니다 .

Req-Res 와는 달리 Ntf(Notify) 패킷은 서버가 클라이언트로 일방적으로 전달하는 패킷입니다 .

Page 20: 오픈소스를 활용한 C# 채팅서버 만들기

20SyncZone – Server Development Community

3. 로비 – 방 생성 시퀀스 (Sequence)

방이 생성되면 생성자는 자동으로 방에 입장됩니다 .

생성된 방의 정보를 다른 클라이언트들에게 전달합니다 .

Page 21: 오픈소스를 활용한 C# 채팅서버 만들기

21SyncZone – Server Development Community

3. 로비 – 방 입장 시퀀스 (Sequence)

방 입장 패킷은 같은 방에 위치한 유저에게만 전달합니다 .

방 상태변경 패킷은 로비에 위치한 유저에게만 전달합니다 .

Page 22: 오픈소스를 활용한 C# 채팅서버 만들기

22SyncZone – Server Development Community

4. 룸 – 프로토콜 (Protocol)

Protocol 설명

CS_Room_EnterUser_Ntf 새로운 유저가 방에 입장했음을 클라이언트에 전달합니다 .

CS_Room_LeaveUser_Ntf 유저가 방에서 퇴장했음을 클라이언트에 전달합니다 .

CS_Room_Chat_Ntf 채팅 메시지를 전달합니다 .

CS_Room_UserList_Req 방에 있는 유저의 목록을 요청합니다 .

CS_Room_UserList_Res 방의 유저목록을 담아 전달합니다 .

CS_Room_Chat_Req 채팅 메시지를 다른 유저에게 전달할 것을 요청합니다 .

CS_Room_Chat_Res 채팅 메시지 처리결과를 전달합니다 .

CS_Room_Leave_Req 방에서 퇴장을 요청합니다 .

CS_Room_Leave_Res 퇴장의 처리결과를 전달합니다 .

Page 23: 오픈소스를 활용한 C# 채팅서버 만들기

23SyncZone – Server Development Community

4. 룸 – 채팅 시퀀스 (Sequence)

채팅 메시지는 방의 모든 유저에게 전달하는 Broadcast 입니다 .채팅 메시지의 처리결과를 전달합니다 .

Page 24: 오픈소스를 활용한 C# 채팅서버 만들기

24SyncZone – Server Development Community

5. 요약

이 단계에서는 다음의 내용이 주된 목표이니 ,이 내용을 상기하시면서 복습하신다면 내용을 더욱 잘 이해하실 수 있습니다 .

기능과 역할을 중심으로 클래스를 ClientSession, User, Lobby, Room 등 세분화하여 논리적 구성을 합니다 .

서버의 기능을 구성한 다음에는 필요한 프로토콜을 정의합니다 .이 때 시퀀스 다이어그램을 사용하면 설계과정을 보다 편리하게 진행할 수 있습니다 .

Req – Res 패킷은 요청 (Request) 과 응답 (Response) 을 의미합니다 .이 패킷은 클라이언트의 요청이 있을 때만 서버가 동작하고 , 그 결과를 전송하기 위한 구조입니다 .

Ntf 패킷은 클라이언트가 알아야 할 데이터를 서버가 즉시 보내기 위한 통지 (Notify) 패킷입니다 .이 패킷은 클라이언트의 요청 없이 서버가 능동적으로 전송합니다 .

Page 25: 오픈소스를 활용한 C# 채팅서버 만들기

25SyncZone – Server Development Community

정리하기04 단계

Page 26: 오픈소스를 활용한 C# 채팅서버 만들기

26SyncZone – Server Development Community

서버는 클라이언트 개발과는 달리 프로토콜에 대한 정리과정이 필요합니다 . 클라이언트의 요청 처리가 목적인 서버는 요청내용이 담긴 패킷을 처리하는 과정이 필수적이기 때문입니다 .

요구사항 분석 단계이기도 합니다 .서버에 어떤 기능들이 필요한지를 예상해보는 과정이죠 .

기능 리스트를 기반으로 필요한 클래스들을 정의하고 관계를 설정합니다 .객체지향 개발방법론의 일부죠 ^^

준비가 됐다면 이제 개발해야죠 ~?

1. 서버 개발의 흐름

수신된 패킷에서 가져온 데이터를 로직으로 전달하기 위한 인터페이스가 필요합니다 .쉽게 말해 , 패킷의 데이터를 전달할 함수를 정의하는 과정입니다 .

1. 필요한 기능 정의

2. 기능의 논리적 구성

3. 프로토콜 구상

4. 인터페이스 구상

5. 로직 개발

Page 27: 오픈소스를 활용한 C# 채팅서버 만들기

27SyncZone – Server Development Community

2. 꼭~! 한번 직접 해보시길~!!

문서와 소스코드를 눈으로 확인하고 이해하는 것 만으로는 항상 부족하죠 ?!직접 손으로 개발을 해봐야만 내 기술이 된다고 생각합니다 .

사실 , 맨땅에 프로젝트 생성부터 하나씩 하기에는 너무 재미 없죠 ! ^^;그래도 예제 소스에서 기능과 패킷을 하나씩 해나가다 보면 그래도 좀 해볼만 하지 않을까 합니다 !( 지극히 개인적인 생각임… ㅋㅋㅋ ㅠㅠ ; )

- 로그인 할 때 닉네임 중복검사

- 특정 유저에게 귓속말 보내기

- 로비의 유저를 방으로 초대하기

- 로비에서 채팅하기

- 방에 비밀번호 설정하기