Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)

Similar presentations


Presentation on theme: "Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)"— Presentation transcript:

1 Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 1371-1380쪽)

2 실습 목적 및 장비 실습 목적 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0) 소켓의 사용 방법
클라이언트-서버 구조의 표현 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0)

3 일대일 채팅 프로그램 프로그램 개요 다이얼로그 기반 애플리케이션 범용 소켓 클래스 응용
한 프로그램 안에 서버와 클라이언트 기능이 모두 포함되어 있음 실행 파일 ( CChatDlg CConnectDlg Edit (m_strAddress) List (m_ctrlListBox) [Sort] 속성 = False Edit (m_strEdit) [Multiline] = True

4 일대일 채팅 프로그램 – 준비 부분 Stdafx.h 끝에 다음 내용 추가 #include <afxsock.h>
소켓 관련 기능을 사용하기 위함 BOOL CChatApp::InitInstance() { if (!AfxSocketInit()) { AfxMessageBox(_T("소켓 초기화 실패")); return FALSE; } 소켓 사용 준비 void CChatDlg::OnOK() {} [Enter] 키를 누를 때 발생하는 IDOK로 인한 대화상자 종료를 방지

5 일대일 채팅 프로그램 – 범용 소켓 클래스 포함시키기
범용 소켓 클래스 파일 가져오기 범용 소켓 클래스 파일들을 현재 프로젝트 디렉터리에 복사 [Project | Add To Project | Files] 메뉴를 선택한 후 복사한 파일들을 프로젝트에 추가 Stdafx.h 끝에 다음 내용 추가 소켓 클래스 인스턴스들을 선언 #include "ServerSocket.h" #include "DataSocket.h" CServerSocket 및 CDataSocket 클래스를 사용하기 위함 class CChatDlg : public CDialog { CServerSocket m_ServerSocket; CDataSocket m_DataSocket; };

6 일대일 채팅 프로그램 – 서버 기능 구현 (1/2) 서버 소켓 초기화
접속 요청 받아들이기 준비 (UM_ACCEPT 메시지 처리기 선언) BOOL CChatDlg::OnInitDialog() { m_ServerSocket.Init(this, 2000); return TRUE; } class CChatDlg : public CDialog { afx_msg LRESULT OnAccept(WPARAM wParam, LPARAM lParam); }; BEGIN_MESSAGE_MAP(CChatDlg, CDialog) ON_MESSAGE(UM_ACCEPT, OnAccept) END_MESSAGE_MAP()

7 일대일 채팅 프로그램 – 서버 기능 구현 (2/2) 접속 요청 받아들이기
LRESULT CChatDlg::OnAccept(WPARAM wParam, LPARAM lParam) { // 연결을 받아들이고, 클라이언트와 m_DataSocket을 연결시켜 줌 if (!m_ServerSocket.Accept(m_DataSocket)) AfxMessageBox(_T("Accept 실패")); return 0L; } // 데이터 소켓 초기화 m_DataSocket.Init(this); m_ctrlListBox.AddString(_T("*** 연결되었습니다. ***")); 수신용 및 송신용 CArchive 객체 생성 CSocket, CSocketFile, CArchive 객체들을 연결

8 일대일 채팅 프로그램 – 접속 요청 void CChatDlg::OnConnect() {
CConnectDlg dlg; // IP 주소를 입력 받는 대화상자 출력 if(dlg.DoModal() != IDOK) return; if (!m_DataSocket.Create()) { // 클라이언트 소켓 생성 AfxMessageBox(_T("클라이언트 소켓 생성 실패")); return; } if (!m_DataSocket.Connect(dlg.m_strAddress, 2000)) { // 접속 요청 AfxMessageBox(_T("서버 접속 실패")); m_DataSocket.Init(this); // 클라이언트 소켓 초기화 m_ctrlListBox.AddString("*** 연결되었습니다. ***");

9 일대일 채팅 프로그램 – 데이터 송수신 (1/6) CData 클래스에 주고 받을 데이터 형식 설정
class CData : public CObject { public: virtual void Serialize(CArchive &ar); CString m_strData; }; void CData::Serialize(CArchive &ar) { if (ar.IsStoring()) { ar << m_strData; // 네트워크로 송신 } else { ar >> m_strData; // 네트워크에서 수신

10 일대일 채팅 프로그램 – 데이터 송수신 (2/6) 데이터 송신을 위한 Edit 컨트롤 서브 클래싱
Edit 컨트롤에서 [Enter] 키 누를 때 전송을 위해 이벤트 발생 필요 [Insert | New Class] 메뉴를 이용하여 CEdit에서 상속 받는 CEnterNotifyEdit라는 클래스를 만든다 WM_CHAR 메시지 처리기를 다음과 같이 재정의 리소스 심볼 ID_ENTERKEY 등록: ResourceView에서 최상위 항목 <Chat resources>에 대해 오른쪽 마우스 버튼을 클릭하여 나타나는 [Resource Symbols] 메뉴를 사용함 Edit 컨트롤에 Control형 멤버 변수를 연결(CEnterNotifyEdit 타입) void CEnterNotifyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_RETURN) GetParent()->SendMessage(WM_COMMAND, ID_ENTERKEY, 0); CEdit::OnChar(nChar, nRepCnt, nFlags); }

11 일대일 채팅 프로그램 – 데이터 송수신 (3/6) 데이터 송신 ([Enter] 키 누를 때마다 데이터 전송)
#include "EnterNotifyEdit.h" class CChatDlg : public CDialog { CEnterNotifyEdit m_ctrlEdit; afx_msg void OnEnterkey(); }; BEGIN_MESSAGE_MAP(CChatDlg, CDialog) ON_COMMAND(ID_ENTERKEY, OnEnterkey) END_MESSAGE_MAP()

12 일대일 채팅 프로그램 – 데이터 송수신 (4/6) 데이터 송신 (계속) void CChatDlg::OnEnterkey() {
UpdateData(TRUE); CData data; data.m_strData = m_strEdit; m_DataSocket << data; // 데이터 전송 // 전송된 문자열을 상단 윈도우에도 표시 m_ctrlListBox.AddString(m_strEdit); m_ctrlListBox.SetCurSel(m_ctrlListBox.GetCount()-1); m_ctrlListBox.SetCurSel(-1); m_strEdit.Empty(); // Edit 컨트롤 초기화 UpdateData(FALSE); } SetCurSel() 함수는 List Box 컨트롤에 텍스트가 가득 찼을 경우 스크롤하기 위함

13 일대일 채팅 프로그램 – 데이터 송수신 (5/6) 데이터 수신 ([Enter] 키 누를 때마다 데이터 전송)
class CChatDlg : public CDialog { afx_msg LRESULT OnReceive(WPARAM wParam, LPARAM lParam); }; BEGIN_MESSAGE_MAP(CChatDlg, CDialog) ON_MESSAGE(UM_DATARECEIVE, OnReceive) END_MESSAGE_MAP()

14 일대일 채팅 프로그램 – 데이터 송수신 (6/6) 데이터 수신 (계속)
LRESULT CChatDlg::OnReceive(WPARAM wParam, LPARAM lParam) { // 통신 버퍼에 있는 데이터를 전부 수신할 때까지... do { // 데이터 수신 CData data; m_DataSocket >> data; // 수신된 데이터 표시 m_ctrlListBox.AddString(data.m_strData); m_ctrlListBox.SetCurSel(m_ctrlListBox.GetCount()-1); m_ctrlListBox.SetCurSel(-1); } while (!m_DataSocket.m_pArchiveIn->IsBufferEmpty()); return 0L; }

15 추가 실습 사항 프르그램의 기능 확장 파일 전송 다중 사용자 간 채팅


Download ppt "Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)"

Similar presentations


Ads by Google