소켓 통신으로 채팅 서버 구현하기[C, C++] - 2 (서버 기능 정리)

과제 제출을 끝낸 후에야 작업과정을 정리할 수 있게 되었다. 원래는 차례대로 빌드업한 과정을 업데이트하고 싶었는데, 코딩하는데 시간이 모자라서 매일 업데이트를 할 수 가 없었다.

그래서 완성된 프로젝트를 하나하나 나눠서 파트별로 설명하는게 나을 것 같다.
---------------------------------------------------

구현한 채팅서버가 할 수 있는 일은 다음과 같다:


1. 클라이언트와 소켓 통신 열기
2. 클라이언트로부터 정보(채팅서버에서 사용할 닉네임, 들어갈 채팅방 번호)를 전달받고, 서버쪽에서 관리하는 클라이언트 정보 테이블에 저장하기


3. 성공적으로 테이블에 저장한 후 채팅서버에 접속했다고 알리기. 이때 클라이언트는 최초로

"Hello 'Nickname'! This is room #'RoomNumber'"

라는, 본인이 요청한 Nickname과 RoomNumber로의 연결이 완료되었다는 메세지를 전송받는다.

이후에는 클라이언트 하나당 하나의 쓰레드를 열어서 패킷을 주고받는다.

4. 클라이언트로부터 온 패킷을 읽고 어떤 요청인지 파악한 다음, 요청에 따라 처리한다.


①. 채팅방에 있는 모든 유저(본인 제외)에게 메세지를 전달하고 싶다면, 

All : Message

의 식으로 패킷을 보내게 된다.

②. 채팅방에 있는 유저 중 특정 유저에게만 메세지를 전달하고 싶다면(귓속말),

Receiver1, Receiver2 : message

의 식으로 패킷을 보내게 된다.

③. 특정 유저에게 메세지를 N초후에 전달하고 싶다면,

Receiver1#N : message

의 식으로 패킷을 보내게 된다. 

④ 다른 N번째 채팅방으로 옮기고 싶다면, 

/join N

라는 패킷을 보내게 된다.

⑤ 현재 채팅방에 있는 유저들의 리스트를 받고 싶다면, 

/list

라는 패킷을 보내게 된다. 이때, 본인의 이름 옆에는 *로 표시한다.

⑥ 접속을 종료하고 싶다면,

/quit

라는 패킷을 보내게 된다.


위에 적은 기능들은 서버 입장에서의 기능들이다.
왜 서버 입장에서 적었냐면, 서버쪽에서 대부분의 일을 하고, 클라이언트에서는 직접 키보드에서 입력받은 내용에 따라 어떻게 패킷을 구성하는 일만 하게 되기 때문이다.

클라이언트는 위에서 보여주는대로

"./client 192.168.0.9:PORT RoomNumber Nickname

의 입력을 넣음으로 서버의 포트와 자신이 원하는 이름과 방번호를 주게 된다.이후의 과정은 위와 같다.

------------------------------------------------------------------------------------------------

이상하게 포스팅을 하려고 테스트를 하다 보면 자꾸 에러가 난다. 덕분에 문제를 더 고칠 수 있게 되었다. 과제 제출기간은 끝났지만...

모든 소스코드는 GitHub 에 올려놓았다.

앞으로 각 기능별로 포스팅을 해나갈 것이다.

댓글

  1. 기능별로 포스팅이 안되어있어서 스스로 알아내는 중입니다 ㅠㅠ

    답글삭제

댓글 쓰기