课程设计简易聊天程序设计.docx
- 文档编号:18369885
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:34
- 大小:259.54KB
课程设计简易聊天程序设计.docx
《课程设计简易聊天程序设计.docx》由会员分享,可在线阅读,更多相关《课程设计简易聊天程序设计.docx(34页珍藏版)》请在冰点文库上搜索。
课程设计简易聊天程序设计
课程设计报告
课程名称:
面向对象程序设计C++
设计题目:
简易聊天程序设计
专业:
计算机科学与技术
姓名:
金文指导教师:
李晓虹
2015年1月10日
(一)系统需求分析
用户角度考察系统应具有哪些功能及非功能性需求。
能实现用户注册、用户的登录、各客户端能连接起来,服务器能与客户端相连实现用户之间信息的发送与共享。
(二)总体设计
1初始化socket,创建服务器端
2、维护一个链表,保存所有用户的IP地址、端口信息
3、接受用户传送来的聊天信息,然后向链表中的所用用户转发
4、接受用户传送来的连接判断命令,并向用户发出相应命令
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程
可以分为三个步骤:
服务器监听,客户端请求,连接确认。
建立服务器
显示本机IP地址建立连接
提示连接成功
J#*"""-
在另一台机器上运行聊天程序
Jr.
进行聊天
输入服务器IP地址
清除聊天
输入名子建立聊天
关闭服务器
提示连接成功或失败
提示有某个服务器正在连接,是否连接
进行聊天退出
清除聊天内容
断开连接
退岀
(三)详细设计
ChatClient:
运行界面:
连接服务器:
名I金文珍T
..I
服务127.0.0,1!
鬧疋
■nn
去|6勺取消
类名
变量名
函数操作
CLogin
m_strlmagem_strNamemstrSeverIP
CLogin(CWnd*pParent/*=NULL*/)
DoDataExchange(CDataExchange*pDX)
IDD_SENDDLG
对话框名
类名
'变量名
相关函数
IDD_SENDDLG
CChatClientView
cfm
AssertValid()const
CChatClientView()
~CChatClientView()
Dump(CDumpContext&dc)const
GetDocument()
OnColor()
OnConnect()
OnCreate(LPCREATESTRUCTlpCreateStruct)
OnDestroy()
OnDisconnect()
OnFilter。
OnlnitialUpdate()
OnPreparePrinting(CPrintlnfo*plnfo)
OnSend()
PreCreateWindow(CREATESTRUCT&
cs)
TextOut(LPCTSTRlpszMessage,
COLORREFclr)
对话框名
类名
变量名
相关函数
IDD_ABOUTBOX
COlineList
m」mgList
AddItem(shorti,char*name,char*text)
COnlineList()
~COnlineList()
OnCreate(LPCREATESTRUCTlpCreateStruct)
OnDblclk(NMHDR*pNMHDR,LRESULT*
pResult)
Remove(char*name)
类名
变量名
相关函数
COlineBar
m_ListCtrl
AddExStyle(DWORDdwNewStyle)
COnlineBar()
~COnlineBar()
OnCreate(LPCREATESTRUCTlpCreateStruct)
类名
变量名
相关函数
CMainFrame
m_wndOnlinem_wndSendm_wndSatusBarm_wndToolBar
AssertValid()const
CMainFrame()
~CMainFrame()
CMainFrame:
:
Dump(CDumpContext&dc)const
OnAddMember(WPARAMwParam,
LPARAMlParam)
OnCreate(LPCREATESTRUCTIpCreateStruct)
OnDblClickltem(WPARAMwParam,
LPARAMlParam)
OnRemoveMember(WPARAMwParam,LPARAMlParam)
OnShowWindow(BOOLbShow,UINTnStatus)
PreCreateWindow(CREATESTRUCT&cs)
类名
变量名
相关函数
CChatSocket
m_pDoc
CChatSocket(CChatClientDoc*pDoc)CChatSocket()
~CChatSocket()
OnReceive(intnErrorCode)
类名
变量名
相关函数
CChatClientView
m_bConnectedm_bFilterm_pArchivelnm_pArchiveOutm_pFilem_pSocketm_strHandlemsg
AssertValid()const
CChatClientDoc()
~CChatClientDoc()
ConnectSocket(LPCTSTRlpszHandle,
LPCTSTRlpszAddress,LPCTSTR
m_strImage,UINTnPort)
CreateClientltem(REOBJECT*preo)constDisconnect()
DisplayMsg(LPCTSTRlpszText)DisplayRecMsg(inttype,CStringfrom,CStringto,BOOLsec,CStringstr,COLORREFclr)
Dump(CDumpContext&dc)const
OnNewDocument()
ProcessPendingRead()
ReceiveMsg()
SendMsg()
Serialize(CArchive&ar)
talk(inttype,CStringform,CStringto,CStringstr,COLORREFclr)
类名
变量名
相关函数
CChatClientCntrltem
AssertValid()const
CChatClientCntrltem(REOBJECT*preo,CChatClientDoc*pContainer)~CChatClientCntrItem()
Dump(CDumpContext&dc)const
CChatClientView*GetActiveView()CChatClientDoc*GetDocument()
类名
变量名
相关函数
CChatClientApp
CChatClientApp()InitInstance()
OnAppAbout()
重要代码:
voidCChatClientDoc:
:
talk(inttype,CStringform,CStringto,CStringstr,COLORREFclr)
{
CChatClientView*pView=(CChatClientView*)GetView();
if(form!
=m_strHandle&&to!
=m_strHandle&&m_bFilter)return;
CStringtemp,to2,first,second;
if(type>32||type<0)
return;
temp.LoadString(IDS_TALKO+type);
inti=temp.Find(",");
if(i!
=-1){
first=temp.Left(i);
if(i!
=temp.GetLength()-1){
second=temp.Mid(i+1);second+="";
}
else{second="";
}
pView->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)"\r\n,,,clr);
}
else{
first=temp;second=":
";pView->TextOut(form,RGB(0,0,255));pView->TextOut(first,RGB(O,O,O));pView->TextOut(second,RGB(0,0,0));
pView->TextOut(str,clr);pView->TextOut("\r\n",clr);
}
}
voidCChatClientDoc:
:
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);
}
voidCChatClientView:
:
TextOut(LPCTSTRlpszMessage,COLORREFclr)
{
cfm.cbSize=sizeof(cfm);//CHARFORMATcfmcfm.crTextColor=clr;cfm.dwMask=CFM_COLOR;CStringstrTemp=lpszMessage;
intlen=GetWindowTextLength();
GetRichEditCtrl().SetSel(len,len);
GetRichEditCtrl().SetSelectionCharFormat(cfm);
GetRichEditCtrl().ReplaceSel(strTemp);
}
voidCChatSocket:
:
OnReceive(intnErrorCode)
{
CSocket:
:
OnReceive(nErrorCode);
m_pDoc->ProcessPendingRead();
}
voidCChatClientCntrItem:
:
Dump(CDumpContext&dc)const
{
CRichEditCntrItem:
:
Dump(dc);
}
voidCLogin:
:
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_MAP
}
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs){
if(!
CFrameWnd:
:
PreCreateWindow(cs))returnFALSE;
cs.style&=~WS_MAXIMIZEBOX;
cs.style&=~WS_SIZEBOX;
cs.cx=640;
cs.cy=480;
returnTRUE;
}
CMessage:
:
CMessage()
{
image=6;
type=0;
secret=FALSE;
color=RGB(0,136,255);
m_bClose=FALSE;
from=to=m_strText=_T("");
}
CMessage:
:
~CMessage()
{
}voidCMessage:
:
Serialize(CArchive&ar){
if(ar.IsStoring()){
ar< ar<<(WORD)m_bClose;ar< ar<<(WORD)secret;ar< ar< ar<<(DWORD)color; ar< } else{ WORDwd; DWORDdwTmp; 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); */}voidCMessage: : 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(); */} intCOnlineBar: : OnCreate(LPCREATESTRUCTlpCreateStruct) { if(CDialogBar: : OnCreate(lpCreateStruct)==-1)return-1; CRectrect; GetClientRect(&rect); rect.left+=8; rect.top+=15; rect.right-=8; rect.bottom-=8; m_ListCtrl=newCOnlineList; if(! m_ListCtrl->Create(WS_CHILD|WS_VISIBLE|LVS_REPORT,rect,this,IDC_LISTBOX)) { TRACE0("FailedtocreateviewforCMyBarLeft\n");return-1; } m_ListCtrl->ModifyStyleEx(0,WS_EX_CLIENTEDGE);AddExStyle(LVS_EX_FULLROWSELECT|LVS_OWNERDRAWFIXED); inti; LV_COLUMNlvc; lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;CStringstrTemp[2]={"名称","IP"}; intsize[2]={140,40}; for(i=0;i<2;i++) {lvc.iSubItem=i;lvc.pszText=(char*)(LPCTSTR)strTemp[i];lvc.cx=size[i]; lvc.fmt=LVCFMT_LEFT;m_ListCtrl->InsertColumn(i,&lvc); } return0; }voidCOnlineBar: : AddExStyle(DWORDdwNewStyle){ DWORDdwStyle=: : SendMessage(m_ListCtrl->m_hWnd,LVM_GETEXTENDEDLISTVIEWSTYLE,0,0); dwStyle|=dwNewStyle; : : SendMessage(m_ListCtrl->m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,0,dwStyle); } intCOnlineList: : OnCreate(LPCREATESTRUCTlpCreateStruct) { if(CListCtrl: : OnCreate(lpCreateStruct)==-1)return-1; m_imgList.Create(IDB_IMAGE,16,1,RGB(0,255,0)); HIMAGELISThim=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); return0; } voidCOnlineList: : AddItem(shorti,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); } voidCOnlineList: : OnDblclk(NMHDR*pNMHDR,LRESULT*pResult) { NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; CStringstr; intiSel=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; } voidCOnlineList: : Remove(char*name) { CStringstr; for(inti=0;i str=GetItemText(i,0);if(strcmp(str,name)==0){DeleteItem(i);break; } } } Charsrv: r菜单设计(IDR_MAINFRAME) 对话框设计: IDDABOUTBOX 对话框名 类名 相关变量 相关函数 IDDABOUTBOX CAboutDIg DoDataExchange() IDD_CLEANSB 对话框名 类名 相关变量 相关函数 IDD_CLEANSB CCleanDlg m_cleanlistm_cleanname On1nitDialog() DoDataExchange() CCleanDlg() '请畴簧矚出聊天室的人名 类名 相关变量 相关函数 CClientSocket Imagem_nMsgCountm_pArchiveOutm_pDocm_pFilenameneeddel Abort() AssertValid() CClientSocket(constCClientSocket&rSrc) CClientSocket(CServerDoc*m_pDoc) ~CClientSocket() Dump(CDumpContext&dc) HasConnectionDropped() Init() IsAborted() OnReceive(intnErroeCode) Operator=(constCClientSocket&rSrc) ReceiveMsg(CMessage*pMsg) SendMsg(CMessage*pMsg) 类名 相关变量 相关函数 CListeningSocket m_pDoc AssertValid() CListeningSocket(constCListeningSocket&rSrc)CListeningSocket(CS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 简易 聊天 程序设计