개발자 승학

MFC 소켓 프로그래밍 - 채팅 프로그램(서버, 클라이언트) 본문

it/MFC

MFC 소켓 프로그래밍 - 채팅 프로그램(서버, 클라이언트)

유승학 2019. 10. 11. 10:14

서버관련 예제는 이전 글을 확인하시면 됩니다.

 

[클라이언트 예제]

 

1.

프로젝트 이름 ChatClient

대화상자 기반으로 생성합니다. 생성방법은 서버예제 글에 사진첨부 하였습니다.

 

 

상단에 List Box를 배치하고 m_List로 변수추가합니다.

 

밑에 Edit Control과 전송 버튼을 배치합니다.

 

2.

CSocket 클래스를 상속받는 CConnectSocket 클래스를 추가합니다.

 

솔루션 탐색기 우클릭 -> 추가 -> 클래스 -> MFC클래스

 

 

3.

[CChatClientDlg.h]

 

// ChatClientDlg.h : 헤더 파일
//

#pragma once
#include "afxwin.h"
#include "ConnectSocket.h"

// CChatClientDlg 대화 상자
class CChatClientDlg : public CDialogEx
{
// 생성입니다.
public:
	CChatClientDlg(CWnd* pParent = NULL);	// 표준 생성자입니다.
	CConnectSocket m_Socket;

 

ConnectSocket.h를 포함하고 CConnectSocket 클래스 객체를 멤버로 등록합니다.

 

 

4.

[CConnectSocket.cpp]

 

클래스뷰 -> CConnectSocket우클릭 -> 속성 -> 재정의(초록색 아이콘) -> OnClose 재정의

 

void CConnectSocket::OnClose(int nErrorCode)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	ShutDown();
	Close();

	CSocket::OnClose(nErrorCode);

	AfxMessageBox(L"ERROR: Disconnected from server!");
	::PostQuitMessage(0);

}

 

 

5.

[CConnectSocket.cpp]

 

클래스뷰 -> CConnectSocket우클릭 -> 속성 -> 재정의(초록색 아이콘) -> OnReceive 재정의

 

void CConnectSocket::OnReceive(int nErrorCode)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	TCHAR szBuffer[1024];
	::ZeroMemory(szBuffer, sizeof(szBuffer));

	if (Receive(szBuffer, sizeof(szBuffer)) > 0)
	{
		CChatClientDlg* pMain = (CChatClientDlg*)AfxGetMainWnd();
		pMain->m_List.AddString(szBuffer);
		pMain->m_List.SetCurSel(pMain->m_List.GetCount() - 1);
	}

	CSocket::OnReceive(nErrorCode);
}

 

CChatClientDlg 클래스를 참조하기 위해 #include "ChatClientDlg.h"를 상단에 추가합니다.

 

 

6.

[CChatClientDlg.cpp]

 

// CChatClientDlg 메시지 처리기

BOOL CChatClientDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	m_Socket.Create();
	if (m_Socket.Connect(L"127.0.0.1", 21000) == FALSE)
	{
		AfxMessageBox(L"ERROR: Failed to connect server");
		PostQuitMessage(0);

		return FALSE;
	}
	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

 

서버에 접속하는 코드를 추가합니다.

 

 

7.

[CChatClientDlg.cpp]

 

void CChatClientDlg::OnBnClickedButton1()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	UpdateData(TRUE);
	m_Socket.Send((LPVOID)(LPCTSTR)m_strMessage, m_strMessage.GetLength() * 2);

	m_strMessage = L"";
	UpdateData(FALSE);
}

 

전송버튼 클릭 이벤트입니다.

 

서버 프로젝트와 클라이언트 프로젝트를 실행하여 채팅을 전송하면 결과를 확인하실 수 있습니다.

'it > MFC' 카테고리의 다른 글

MFC 소켓 프로그래밍 - 채팅 프로그램(서버, 클라이언트)  (2) 2019.10.11
Comments