2013.07.05 11:29


어째뜬...

MFC를 이용한 채팅 프로그램 시작하기(클라이언트편)를 시작해 보도록 하겠습니다.

그럼 서버 프로그램에 이어서 클라이언트 프로그램을 만들어 서버와 클라이언트간의 동작을 확인해 보도록 하겠습니다.

클라이언트 프로그램은 다음의 작업을 수행하게 됩니다.

서버에 연결 요청을 하고 연결이 되면 서버와 데이터를 송수신합니다.


그럼 클라이언트 프로그램을 만들어 보도록 하겠습니다.

채팅 클라이언트 프로그램도 서버 프로그램과 마찬가지로 윈도우 소켓을 지원받는 대화상자 기반으로 프로젝트를 생성하겠습니다. (프로젝트명은 ChatClient로 하겠습니다.)

서버 프로그램과 마찬가지로 GUI를 구성하도록 하겠습니다.

클라이언트는 두개의 대화상자로 구성됩니다.

서버 프로그램과 비슷한 구조의 ChatClient와 서버에 접속을 요청하기 위한 IP주소를 입력받아 서버에 접속을 요청하는 대화상자로 구성됩니다.

아래 그림과 같이 채팅 클라이언트 GUI를 구성합니다.

ChatClient 대화상자의 구성이 완료되면 Connect Setting 버튼을 클릭하면 서버에 연결을 위한 IP주소를 세팅하는 대화상자를 추가하여 아래와 같이 GUI를 구성합니다.


서버와 연결을 위한 대화 상자 템플릿을 대화 상자 클래스(CConnectDlg)로 구현합니다.

서버에 연결하기 위해 서버의 IP주소를 입력받는데 입력받은 값을 저장하기 위한 변수를 선언합니다.

Connect 버튼을 누르면 호출되는 이벤트 처리기를 추가하여 서버와의 연결을 위한 서버 IP 주소를 저장합니다. 그리고 추가로 서버 IP주소를 매번 입력하지 않도록 OnInitDialog() 함수를 CConnectDlg 클래스에 재정의하여 초기화 합니다.

다음으로 ChatClient 대화 상자에서 Connect Setting 버튼을 누르면 Connect 대화상자를 호출하고 IP주소를 입력후 Connect 버튼을 눌렀을 때 서버에 연결을 요청하는 Connect함수를 호출하도록 OnBnClickConnect()와 OnBnClickedSend() 함수를 아래와 같이 재정의 합니다.

다음으로 서버와의 통신을 위해 연결 요청을 하고 데이터를 송수신하는 CSocket의 파생클래스로클라이언트 소켓을 정의 하도록 하겠습니다.

어플리케이션 클래스에 서버와의 접속을 위해서 접속을 요청하는 클라이언트 소켓을 위한 멤버 변수를 선언합니다.

생성자에 추가한 멤버 변수를 초기화 합니다.

다음으로 서버와 마찬가지로 접속과 데이터 송수신에 필요한 함수를 만들도록 하겠습니다.
필요한 함수는 다음과 같습니다.

void Connect()

서버 소켓으로 접속요청

void CleanUp()

소켓을 닫고 메모리 해제

void SendData(CString strData)

데이터 송신

void ReceiveData()

데이터 수신

void CloseChild()

자소켓 닫고 메모리 해제

함수는 아래와 같이 내용을 구현합니다.

다음으로 서버 프로그램과 마찬가지로 데이터 송수신을 위한 가상함수를 재정의 해야 합니다.
CClientSocket 클래스의 OnReceive()함수와 OnClose() 함수를 재정의 합니다.

수고하셨습니다. 모든 작업이 끝났습니다.^^
이제 프로그램을 실행시켜 서버와 클라이언트간에 접속과 데이터 송수신을 확인해 보도록 하겠습니다.
서버 프로그램이 대기 상태에 있어야 클라이언트가 접속할 수 있으니 서버 프로그램을 먼저 실행시킵니다.

서버 프로그램은 실행과 동시에 클라이언트의 요청을 기다리게 됩니다.
서버 프로그램이 정상적으로 동작하고 있으니 클라이언트 프로그램을 실행합니다.

클라이언트 프로그램을 실행하고 Connect Setting 버튼을 눌러 연결을 요청할 서버의 IP주소를 입력(루프백 주소를 사용하도록 하겠습니다.)하고 Connect 버튼을 누르면 클라이언트가 서버와 연결을 시도하게 됩니다.
서버와의 연결이 성공적으로 이루어 지면 아래와 같이 서버에 Accept Success 메시지가 나타납니다.

정상적으로 서버와 클라이언트가 연결되었습니다.
이제 서버와 클라이언트에서 메시지를 입력하고 Send 버튼을 눌러 데이터의 송수신이 이루어 지는지 확인합니다.

모든 것이 정상적으로 동작합니다.

확인하셨죠?^^

오랜시간 수고하셨습니다.
이상으로 소켓을 이용한 간단한 채팅 서버와 클라이언트를 구현해 보았습니다.




신고


Posted by injunech