이전 파트

2024.09.06 - [공부/채팅 서버] - 채팅 서버 + DB - Part1 Receive,Send

 

채팅 서버 + DB - Part1 Receive,Send

구버전2024.06.18 - [공부] - 채팅 서버 이번엔 전에 만들었던 야매 채팅 서버를 어느정도 잘 짜여진 구조로 만들어 보았다. 구조는 Rookis 님의 C# 게임 서버 구조를 가져와서 변형하여 사용하였다. Ses

ggms-gukhyun.tistory.com

 

이번엔 저번 글에 이어서 채팅 서버의 DBManager, Listener, Connector에 대해 설명하도록 하겠다.

DBManager

DBManager가 하는 역할은 DB의 ip 중복 검사, ip에 맞는 이름 제공, 클라이언트 정보 입력 세가지가 있다.

일단 먼저 데이터베이스와 연결을 해주고 연결할 테이블의 이름을 저장한다.

MySqlConnection은 DB와 연결을 해주는 클래스이고 MySqlDataReader는 명령어를 실행시켜 주는 클래스이다.

SearchDuplication

ip 를 입력받아서 테이블에 중복이 있는지 검사한 후 결과를 리턴해준다.

InsertClientInfo

ip, name 을 입력받아서 데이터베이스에 Insert 해준다. 

만약 테이블이 닫히지 않았다면 닫아준다.

GetClientName

이것도 역시 테이블이 닫히지 않았다면 닫아주고 ip를 받아서 ip에 맞는 이름을 가져온 후 리턴한다.

Listener

Listener 클래스는 서버가 클라이언트를 Accept 하는 작업을 도와주는 클래스이다.

Init

Listener에서는 처음에 끝점과 세션을 받는Func, 세션을 보내는 Action, 이름을 받았는지 확인하는 Func를 받아준다.

클라이언트들을 받아줄 listenSocket을 생성해주고 비동기로 Accept 해줄 것이기 때문에 SocketAsyncEventArgs도 생성해준다.

Accept 역시 Receive와 동일하게 언제 클라이언트들이 서버에 연결할지 모르니 계속 받아주는 상태를 유지해준다.

RegisterAccept

전에 받아줬던 소켓이 남아있을 수 있으니 AcceptSocket, clientSocket을 null로 설정 해준 후 비동기로 받아준다.

OnAcceptCompleted

완료시 실행되는 함수에선 에러가 안났는지 확인 후 새로운 Session을 받아준다. new 로 해주지 않는 이유는 서버를 보면 알 것이다.

clientSocket을 AcceptSocket 으로 설정해주고 우리는 ip마다 이름을 DB에 저장해준 후 가져와주기 때문에 이름이 제대로 가져와 졌는지 확인해준다.

이름이 가져와 졌다면 방금 받아왔던 Session을 init 해주고 Session을 다시 서버에 보내준다. 이러는 이유는 서버에서 연결되어있는 클라이언트들에게 BroadCast를 날리기 위해서 이다.

그 이후 다시 Accept를 받는 상태로 돌아간다.

Connector

Connector 클래스는 Listener와 반대로 클라이언트의 서버 연결을 도와주는 클래스이다.

Connector도 Listener와 같이 끝점과 Session을 반환받는 Func를 Init때 받아준다.

Listener와 다르게 RemoteEndPoint와 UserToken이라는 것이 나온다.

RemoteEndPoint는 비동기 작업을 할때 연결하는 끝점을 나타내고 UserToken은 넘겨주고 싶은 개체를 저장한다.

 저장해둔 Socket을 비동기로 연결해주는데 이때 연결되는 끝점이 RemoteEndPoint이다.

오류가 나지 않았다면 Session개체를 생성해주고 Init 해준다. 그리고 클라이언트에서도 사용할 수 있도록 public으로 된 session변수에 저장해준다.

 Connect는 한번만 해주는 작업이기 때문에 완료가 되면 다시 RegisterConnect 함수를 다시 호출해주지 않는다.

이번 글을 마치며

2달간 학교 수학 공모전 프로젝트를 하느라 블로그 글을 정말 쓰지 못했다.. 블로그가 너무 띄엄띄엄 올라오더라도 놀고 있다고 생각하지 않아줬으면 한다..

다음 파트까지 정리를 마치면 Rokiss 님의 강의를 마저 들은 후 게임 서버를 직접 구현하여 멀티 게임을 만들어 블로그에 정리하는 것을 목표로 하고 있다. 아직까지 한번도 올리지 않은 잡담 글도 그때쯤이면 올리지 않을까 싶다.(엔진 팀프가 존재하지만..) 지금까지 하지 못했던 개인적인 고찰이나 생각들도 점점 올리기 시작하겠다.

 

2024/10/14

Client 와 Server 에서 아주 큰 문제를 발견했다..

현재 서버랑 리스너에서 이름을 가져오는 부분이 멀티쓰레드 환경에서 아주 큰 문제를 발생시킬 수 있는 문제가 발견되었다. 이걸 만들 적에는 패킷을 배우기 전이어서 이름을 구분하는 게 없다.. 그래서 이름을 받아오는 부분을 좀 이상하게 코드를 짰는데 고칠 방도가 도저히 생각나지 않아 이 채팅 서버는 여기서 마무리 해야할 것 같다.

아마 기말고사가 모두 끝난 12월 즈음에 윈폼을 사용하여 정말 제대로된 채팅 서버를 만들어 볼 것 같다. 물론 게임 서버를 만드는 것을 최우선으로 끝낸 뒤 말이다.

정말 죄송합니다.. 

'공부 > 채팅 서버' 카테고리의 다른 글

채팅 서버 + DB - Part1 Receive,Send  (0) 2024.09.09
채팅 서버  (0) 2024.06.18

+ Recent posts