当前位置:文档之家› 《网络应用程序设计》课程设计报告书

《网络应用程序设计》课程设计报告书

网络应用程序设计课程设计报告书题目:局域网多人聊天室班级:0991132学号:1099113202姓名:赵燃指导教师:宋毅、王家宁、徐红梅、姚璐周期:一周成绩:2011年12 月23 日一、课程设计的目的与要求((一)课程设计目的与任务(1)课程设计的目的:《网络高级程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习该课程后进行的一次较全面的综合练习。

其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用vc++语言进行面向对象设计的基本方法。

提高运用面向对象知识分析实际问题、解决实际问题的能力。

(2)课程设计任务:局域网多人聊天室该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。

客户端程序:可连接到服务器,并将消息发送到服务器端和接受服务器端发送来的信息。

服务器端程序:可将消息发送到客户端和接受客户端发送来的消息。

(二)题目要求该系统要求完成聊天室的全过程,包括客户端和服务器两大部分的编程及其连接。

服务器端聊天程序负责接收和发送来自客户端的聊天信息,客户端聊天程序负责建立和维护与服务器端的连接,想服务器发送本客户的聊天内容。

系统采用VISUAL C++语言程序设计编程实现。

并且按要求编写程序设计报告书,能正确编写分析、设计、编码、测试等技术文档。

二、设计正文1系统分析(1)服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。

(2)服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。

对于公共聊天室,服务器将把接受到的信息除源端外的所有客户发送过去。

(3)服务器还要监控这些连接的状态。

在客户主动离开或发生故障时从列表删除相应的表项,并及时更新连接表。

2功能详细描述及框图用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息,用户向服务器发送信息,服务器处理用户的数据,然后用户开始聊天,客户端的聊天分为对群聊天和私聊的信息,该信息应通过程序控制分别进行处理。

3、主要功能逻辑过程和实现算法(1)客户端是实现的主要算法:BOOL CMy13202Dlg::OnInitDialog(){CDialog::OnInitDialog();login dlg;int nResponse=dlg.DoModal();if (nResponse == IDOK){ unsigned long ulAddress;SOCKADDR_IN sin;ulAddress=inet_addr(dlg.m_ip);//字符型服务器地址m_name=dlg.m_name;//连接服务器sockServer=socket(AF_INET,SOCK_STREAM,0);sin.sin_family=AF_INET;sin.sin_addr.s_addr=ulAddress;sin.sin_port=htons(4009);int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr));// 通知套接口有请求事件发生WSAAsyncSelect(sockServer,m_hWnd,WM_SOCKET_READ,FD_READ);if(nConnect== -1){MessageBox("连接过程发生错误!\n请确保IP输入正确无误!",NULL,MB_OK);CDialog::OnCancel();}else{MessageBox("与服务器建立连接成功!",NULL,MB_OK);info myinfo;myinfo.type=0;LPCTSTR p=m_name;memcpy(,p,m_name.GetLength()+1);intnCharSend=send(sockServer,(char*)&myinfo,sizeof(myinfo),0);if(nCharSend==SOCKET_ERROR)MessageBox("发送过程中发生一个错误!",NULL,MB_OK);}}if (nResponse == IDCANCEL){CDialog::OnCancel();}// 将“关于...”菜单项添加到系统菜单中// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。

当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码CBitmap Bitmap;Bitmap.LoadBitmap(IDB_BITMAP1);HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();CButton *pButton=(CButton*)GetDlgItem(IDCANCEL);pButton->SetBitmap(hBitmap);return TRUE; // 除非将焦点设置到控件,否则返回TRUE}void CMy13202Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){ CAboutDlg dlgAbout;dlgAbout.DoModal();}else{ CDialog::OnSysCommand(nID, lParam);}}void CMy13202Dlg::OnOK(){/ TODO: 在此添加专用代码和/或调用基类CTime t=CTime::GetCurrentTime();CString strTime="(%m-%d %H:%M:%S)";strTime=t.Format(strTime);UpdateData();info sendinfo;//给XX发送信息m_list.GetLBText(m_list.GetCurSel(),toname);if(toname=="群聊天") //发送公共信息{ sendinfo.type=1;m_read=m_read+"\r\n"+strTime+"你群说:"+m_send+"\r\n";m_send=strTime+m_name+"对群说:"+m_send+"\r\n";}else{ sendinfo.type=2; //给某人发信息LPCTSTR q=toname;memcpy(,q,toname.GetLength()+1);m_read=m_read+"\r\n"+strTime+"你对"+toname+"说:"+m_send+"\r\n";m_send=strTime+m_name+"对你说:"+m_send+"\r\n"; }LPCTSTR s=m_send;memcpy(sendinfo.msg,s,m_send.GetLength()+1);//发送信息int nCharSend=send(sockServer,(char*)&sendinfo,sizeof(sendinfo),0);if(nCharSend==SOCKET_ERROR)MessageBox("发送过程中发生一个错误!",NULL,MB_OK);m_send="";UpdateData(FALSE);GetDlgItem(IDC_EDIT_SEND)->SetFocus();}服务器端实现的主要算法:LRESULT CMy13202ServerDlg::OnServerreadorclose(WPARAM wParam, LPARAM lParam){if (WSAGETSELECTEVENT(lParam) == FD_READ) //网络数据到达事件{ CString s;int i;for(i=0;(i<20)&&(SocketAccept[i]!=wParam);i++)}if(i==20) return 0;int BRead;sendinfo info;BRead=recv(SocketAccept[i], (char*)&info,sizeof(info), 0);if (BRead == SOCKET_ERROR)MessageBox(_T("接收到一个错误信息. "));switch(info.type){case 1:int j;for(j=0;j<20;j++){if(SocketAccept[j]!=INVALID_SOCKET&&j!=i)send(SocketAccept[j], (char*)&info,sizeof(info), 0);}break;case 2:int k;for(k=0;(k<20)&&(uinfo[k].username!=);k++){ }send(SocketAccept[k], (char*)&info,sizeof(info), 0);break;case 0:CTime t=CTime::GetCurrentTime();CString strTime="(%y-%m-%d %H:%M:%S)";strTime=t.Format(strTime);uinfo[i].username=;s=;s=strTime+s+"进入聊天室";LPCTSTR pq1=s;memcpy(info.msg,pq1,s.GetLength()+1);int j1;for(j1=0;j1<20;j1++){if(SocketAccept[j1]!=INVALID_SOCKET){send(SocketAccept[j1], (char*)&info,sizeof(info), 0);} }int n;for(n=0;n<20;n++){ if((uinfo[n].username!="")&&(n!=i)){ sendinfo namelist;namelist.type=0;LPCTSTR nlist=uinfo[n].username;CString nli;nli="";LPCTSTR nlis=nli;mcpy(,nlist,uinfo[n].username.GetLength()+1);memcpy(namelist.msg,nlis,nli.GetLength()+1);send(SocketAccept[i], (char*)&namelist,sizeof(namelist), 0); }}m_msg=m_msg+"\r\n"+strTime+"用户"+uinfo[i].username+"由ip"+uinfo[i].userip+"进入服务器";UpdateData(FALSE);Break;} }if (WSAGETSELECTEVENT(lParam) == FD_CLOSE) //客户端断开事件{CTime t=CTime::GetCurrentTime();CString strTime="(%y-%m-%d %H:%M:%S)";strTime=t.Format(strTime);int i;for(i=0;(i<20)&&(SocketAccept[i]!=wParam);i++) ;closesocket(SocketAccept[i]);SocketAccept[i] = INVALID_SOCKET;sendinfo closeinfo,closeinfo1;closeinfo.type=1;closeinfo1.type=3;CString sc;sc= strTime+uinfo[i].username+"退出聊天室";LPCTSTR pc=sc;LPCTSTR pcname=uinfo[i].username;memcpy(closeinfo.msg,pc,sc.GetLength()+1);memcpy(,pcname,uinfo[i].username.GetLength()+1);int jc;for(jc=0;jc<20;jc++){ if(SocketAccept[jc]!=INVALID_SOCKET){ send(SocketAccept[jc],(char*)&closeinfo,sizeof(closeinfo), 0);send(SocketAccept[jc],(char*)&closeinfo1,sizeof(closeinfo1), 0);} }m_msg=m_msg+"\r\n"+strTime+"用户"+uinfo[i].username+"由ip"+uinfo[i].userip+"退出服务器";uinfo[i].userip="";uinfo[i].username="";UpdateData(FALSE); }CEdit *pEdit;pEdit=(CEdit *)GetDlgItem(IDC_EDIT1);int i=pEdit->GetLineCount();pEdit->LineScroll(i,0);return 0L;}4、界面设计首先的界面是服务器运行的界面:5、系统测试(1)用户赵燃进入了聊天室。

相关主题