




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告 课程名称:面向对象程序设计C+ 设计题目: 简易聊天程序设计 专 业:计算机科学与技术 姓 名:金文 学 号: 指导教师:李 晓 虹2015 年 1 月 10 日(一) 系统需求分析用户角度考察系统应具有哪些功能及非功能性需求。能实现用户注册、用户的登录、各客户端能连接起来,服务器能与客户端相连实现用户之间信息的发送与共享。(二)总体设计1、初始化socket,创建服务器端2、维护一个链表,保存所有用户的IP地址、端口信息3、接受用户传送来的聊天信息,然后向链表中的所用用户转发4、接受用户传送来的连接判断命令,并向用户发出相应命令根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。聊天系统客户端服务器用户登录用户注册建立连接监听客户用户数据操作聊天交互(三) 详细设计ChatClient:运行界面:连接服务器:类名变量名函数操作CLoginm_strImagem_strNamem_strSeverIPCLogin(CWnd* pParent /*=NULL*/)DoDataExchange(CDataExchange* pDX)IDD_SENDDLG:对话框名类名变量名相关函数IDD_SENDDLGCChatClientViewcfmAssertValid() constCChatClientView()CChatClientView()Dump(CDumpContext&dc) constGetDocument()OnColor()OnConnect()OnCreate(LPCREATESTRUCT lpCreateStruct)OnDestroy()OnDisconnect()OnFilter()OnInitialUpdate()OnPreparePrinting(CPrintInfo* pInfo)OnSend()PreCreateWindow(CREATESTRUCT& cs)TextOut(LPCTSTR lpszMessage, COLORREF clr)对话框名类名变量名相关函数IDD_ABOUTBOXCOlineListm_imgListAddItem(short i, char* name, char* text)COnlineList()COnlineList()OnCreate(LPCREATESTRUCT lpCreateStruct)OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)Remove(char *name)类名变量名相关函数COlineBarm_ListCtrlAddExStyle(DWORD dwNewStyle)COnlineBar()COnlineBar()OnCreate(LPCREATESTRUCT lpCreateStruct)类名变量名相关函数CMainFramem_wndOnlinem_wndSendm_wndSatusBarm_wndToolBarAssertValid() constCMainFrame()CMainFrame()CMainFrame:Dump(CDumpContext& dc) constOnAddMember(WPARAM wParam, LPARAM lParam)OnCreate(LPCREATESTRUCT lpCreateStruct)OnDblClickItem(WPARAM wParam, LPARAM lParam)OnRemoveMember(WPARAM wParam, LPARAM lParam)OnShowWindow(BOOL bShow, UINT nStatus)PreCreateWindow(CREATESTRUCT& cs)类名变量名相关函数CChatSocketm_pDocCChatSocket(CChatClientDoc* pDoc)CChatSocket()CChatSocket()OnReceive(int nErrorCode)类名变量名相关函数CChatClientViewm_bConnectedm_bFilterm_pArchivelnm_pArchiveOutm_pFilem_pSocketm_strHandlemsgAssertValid() constCChatClientDoc()CChatClientDoc()ConnectSocket(LPCTSTR lpszHandle, LPCTSTR lpszAddress, LPCTSTR m_strImage, UINT nPort)CreateClientItem(REOBJECT* preo) constDisconnect()DisplayMsg(LPCTSTR lpszText)DisplayRecMsg(int type, CString from, CString to,BOOL sec, CString str, COLORREF clr)Dump(CDumpContext& dc) constOnNewDocument()ProcessPendingRead()ReceiveMsg()SendMsg()Serialize(CArchive& ar)talk(int type, CString form, CString to, CString str, COLORREF clr)类名变量名相关函数CChatClientCntrItemAssertValid() constCChatClientCntrItem(REOBJECT* preo, CChatClientDoc* pContainer)CChatClientCntrItem()Dump(CDumpContext& dc) constCChatClientView* GetActiveView()CChatClientDoc* GetDocument()类名变量名相关函数CChatClientAppCChatClientApp()Initlnstance()OnAppAbout()重要代码:void CChatClientDoc:talk(int type, CString form, CString to, CString str, COLORREF clr)CChatClientView* pView = (CChatClientView*)GetView();if(form != m_strHandle & to != m_strHandle & m_bFilter)return;CString temp,to2,first,second;if(type 32 | type TextOut(LPCTSTR)form, RGB(0,0,255);pView-TextOut(LPCTSTR)first, RGB(0,0,0);pView-TextOut(LPCTSTR)to, RGB(0,0,255);pView-TextOut(LPCTSTR)second, RGB(0,0,0);pView-TextOut(LPCTSTR)str,clr);pView-TextOut(LPCTSTR)rn,clr);elsefirst=temp;second=: ;pView-TextOut(form,RGB(0,0,255);pView-TextOut(first,RGB(0,0,0);pView-TextOut(second,RGB(0,0,0);pView-TextOut(str,clr);pView-TextOut(rn,clr);void CChatClientDoc:Disconnect()msg.type = -2;msg.m_bClose = TRUE;msg.from = m_strHandle;msg.to = 所有人;msg.secret = FALSE;msg.m_strText =Hello;msg.color = RGB(0,136,255); SendMsg();m_bConnected = FALSE;msg.from = DUMP;GetView()-GetParent()-SendMessage(WM_ADDLIST + 1, (LPARAM)&(msg.from), msg.image);void CChatClientView:TextOut(LPCTSTR lpszMessage, COLORREF clr)cfm.cbSize=sizeof(cfm); / CHARFORMAT cfm cfm.crTextColor=clr;cfm.dwMask=CFM_COLOR;CString strTemp = lpszMessage;int len = GetWindowTextLength();GetRichEditCtrl().SetSel(len,len);GetRichEditCtrl().SetSelectionCharFormat(cfm);GetRichEditCtrl().ReplaceSel(strTemp);void CChatSocket:OnReceive(int nErrorCode)CSocket:OnReceive(nErrorCode);m_pDoc-ProcessPendingRead();void CChatClientCntrItem:Dump(CDumpContext& dc) constCRichEditCntrItem:Dump(dc);void CLogin:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CLogin)DDX_CBString(pDX, IDC_IMAGE, m_strImage);DDX_CBString(pDX, IDC_NAME, m_strName);DDX_Text(pDX, IDC_SERVER, m_strServerIP);/AFX_DATA_MAPBOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;cs.style &= WS_MAXIMIZEBOX;cs.style &= WS_SIZEBOX;cs.cx = 640;cs.cy = 480;return TRUE;CMessage:CMessage()image = 6;type = 0;secret = FALSE;color = RGB(0,136,255);m_bClose = FALSE;from = to = m_strText = _T();CMessage:CMessage()void CMessage:Serialize(CArchive &ar)if (ar.IsStoring()ar type;ar (WORD)m_bClose;ar m_strText;ar (WORD)secret;ar from;ar to;ar (DWORD)color;ar type;ar wd;m_bClose = (BOOL)wd;ar m_strText;ar wd;secret = (BOOL)wd;ar from;ar to;ar dwTmp;color = (COLORREF)dwTmp;ar image;/*m_msgList.Serialize(ar);fromlist.Serialize(ar);tolist.Serialize(ar);seclist.Serialize(ar);typelist.Serialize(ar);clrlist.Serialize(ar); */void CMessage:Reset()image = 6;type = 0;secret = FALSE;color = RGB(0,136,255);m_bClose = FALSE;from = to = m_strText = _T();/*m_msgList.RemoveAll();fromlist.RemoveAll();tolist.RemoveAll();seclist.RemoveAll();clrlist.RemoveAll(); typelist.RemoveAll();*/int COnlineBar:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDialogBar:OnCreate(lpCreateStruct) = -1)return -1;CRect rect;GetClientRect(&rect);rect.left += 8;rect.top += 15;rect.right -= 8;rect.bottom -= 8;m_ListCtrl = new COnlineList;if (!m_ListCtrl-Create(WS_CHILD | WS_VISIBLE | LVS_REPORT,rect, this, IDC_LISTBOX)TRACE0(Failed to create view for CMyBarLeftn);return -1;m_ListCtrl-ModifyStyleEx(0, WS_EX_CLIENTEDGE);AddExStyle(LVS_EX_FULLROWSELECT | LVS_OWNERDRAWFIXED);int i;LV_COLUMN lvc;lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;CStringstrTemp2 = 名称, IP;int size2 = 140,40;for(i = 0; i InsertColumn(i, &lvc);return 0;void COnlineBar:AddExStyle(DWORD dwNewStyle)DWORD dwStyle = :SendMessage (m_ListCtrl-m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);dwStyle |= dwNewStyle;:SendMessage (m_ListCtrl-m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);int COnlineList:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CListCtrl:OnCreate(lpCreateStruct) = -1)return -1;m_imgList.Create(IDB_IMAGE, 16, 1, RGB(0, 255, 0);HIMAGELIST him = m_imgList.m_hImageList;:SendMessage(this-m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL,(LPARAM)him);/:SendMessage(this-m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_NORMAL,(LPARAM)him);ImageList_SetBkColor(him,CLR_NONE);return 0;void COnlineList:AddItem(short i, char* name, char* text)LVITEMlvi;lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;lvi.iItem = GetItemCount(); lvi.iImage = i;lvi.iSubItem = 0;lvi.pszText = name;lvi.cchTextMax = 64;lvi.lParam = 0;InsertItem(&lvi);lvi.mask = LVIF_TEXT;lvi.pszText = text;lvi.cchTextMax = 32;lvi.iSubItem = 1;SetItem(&lvi);void COnlineList:OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CString str;int iSel = pNMListView-iItem;if (iSel = 0 )str = GetItemText(iSel,0);CWnd* pParentWnd = GetParent();while (pParentWnd != NULL) if (pParentWnd-IsFrameWnd()break;pParentWnd = pParentWnd-GetParent();if (pParentWnd != NULL) pParentWnd-SendMessage(WM_DBCLICKITEM, 0, (LPARAM)&str);*pResult = 0;void COnlineList:Remove(char *name)CString str;for(int i = 0; i Abort();delete m_pArchiveOut;m_pArchiveOut = NULL;void CClientSocket:SendMsg(CMessage* pMsg)if (m_pArchiveOut != NULL)pMsg-Serialize(*m_pArchiveOut);m_pArchiveOut-Flush();void CClientSocket:ReceiveMsg(CMessage* pMsg)pMsg-Serialize(*m_pArchiveIn);/ CClientSocket Overridable callbacksvoid CClientSocket:OnReceive(int nErrorCode)CSocket:OnReceive(nErrorCode);m_pDoc-ProcessPendingRead(this);BOOL CClientSocket:HasConnectionDropped( void )BOOL bConnDropped = FALSE;INT iRet = 0;BOOL bOK = TRUE;struct timeval timeout = 0, 0 ;fd_set readSocketSet;FD_ZERO( &readSocketSet );FD_SET( m_hSocket, &readSocketSet );iRet = :select( 0, &readSocketSet, NULL, NULL, &timeout );bOK = (iRet 0);if(bOK)bOK = FD_ISSET( m_hSocket, &readSocketSet );if( bOK )CHAR szBuffer1 = ;iRet = :recv( m_hSocket, szBuffer, 1, MSG_PEEK );bOK = ( iRet 0 );if( !bOK )INT iError = :WSAGetLastError();bConnDropped = ( ( iError = WSAENETRESET ) |( iError = WSAECONNABORTED ) |( iError = WSAECONNRESET ) |( iError = WSAEINVAL ) |( iRet = 0 ) ); /Graceful disconnect from other side.return( bConnDropped );/ CSocket ImplementationCClientSocket:CClientSocket()if (m_pArchiveOut != NULL)delete m_pArchiveOut;if (m_pArchiveIn != NULL)delete m_pArchiveIn;if (m_pFile != NULL)delete m_pFile;#ifdef _DEBUGvoid CClientSocket:AssertValid() constCSocket:AssertValid();void CClientSocket:Dump(CDumpContext& dc) constCSocket:Dump(dc);/ CSocket ImplementationCListeningSocket:CListeningSocket()#ifdef _DEBUGvoid CListeningSocket:AssertValid() constCSocket:AssertValid();void CListeningSocket:Dump(CDumpContext& dc) constCSocket:Dump(dc);LRESULT CMainFrame:WindowProc(UINT message, WPARAM wParam, LPARAM lParam) LRESULT result = CFrameWnd:WindowProc(message, wParam, lParam);if(wParam = SC_MINIMIZE)ShowWindow(SW_HIDE);return result;void CMainFrame:OnClose() Shell_NotifyIcon(NIM_DELETE, &pnid);CFrameWnd:OnClose();void CMainFrame:OnRestore() void CMainFrame:OnKickout() CServerDoc* pDoc = (CServerDoc*)GetActiveDocument();pDoc-Clean();void CMessage:Serialize(CArchive &ar)if (ar.IsStoring()ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论