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

更新时间:2024-01-09 12:34:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机应用技术系课程设计报告书

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

题目: 局域网多人聊天室 班级: 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 // 通知套接口有请求事件发生

WSAAsyncSelect(sockServer,m_hWnd,WM_SOCKET_READ,FD_READ); if(nConnect== -1)

sockaddr));

计算机应用技术系课程设计报告书

{

MessageBox(\连接过程发生错误!\\n请确保IP输入正确无误!\,NULL,MB_OK); CDialog::OnCancel(); }

else {

MessageBox(\与服务器建立连接成功!\,NULL,MB_OK); info myinfo; myinfo.type=0; LPCTSTR p=m_name;

memcpy(myinfo.name,p,m_name.GetLength()+1); int

nCharSend=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=\; strTime=t.Format(strTime); UpdateData();

info sendinfo;

//给XX发送信息

m_list.GetLBText(m_list.GetCurSel(),toname); if(toname==\群聊天\) //发送公共信息

{ sendinfo.type=1; m_read=m_read+\+strTime+\你群说:\+m_send+\;

m_send=strTime+m_name+\对群说:\+m_send+\;

} else

{ sendinfo.type=2; //给某人发信息

LPCTSTR q=toname;

memcpy(sendinfo.name,q,toname.GetLength()+1); m_read=m_read+\+strTime+\你对\+toname+\说:

计算机应用技术系课程设计报告书

\+m_send+\;

m_send=strTime+m_name+\对你说:\+m_send+\; } LPCTSTR s=m_send; memcpy(sendinfo.msg,s,m_send.GetLength()+1);

//发送信息

int nCharSend=send(sockServer,(char*)&sendinfo,sizeof(sendinfo),0); }

服务器端实现的主要算法:

LRESULT CMy13202ServerDlg::OnServerreadorclose(WPARAM wParam, LPARAM lParam) {

if (WSAGETSELECTEVENT(lParam) == FD_READ) //网络数据到达事件 if(nCharSend==SOCKET_ERROR)

MessageBox(\发送过程中发生一个错误!\,NULL,MB_OK); m_send=\;

UpdateData(FALSE);

GetDlgItem(IDC_EDIT_SEND)->SetFocus();

{ 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!=info.name);k++) { }

send(SocketAccept[k], (char*)&info,sizeof(info), 0); break;

case 0:

CTime t=CTime::GetCurrentTime();

CString strTime=\;

strTime=t.Format(strTime); uinfo[i].username=info.name;

s=info.name;

s=strTime+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), 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 pq1=s;

0);} }

LPCTSTR nlis=nli;

mcpy(namelist.name,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+\+strTime+\用户\+uinfo[i].username+\由ip\+uinfo[i].userip+\进入服务器\;

UpdateData(FALSE);

Break;} }

if (WSAGETSELECTEVENT(lParam) == FD_CLOSE) //客户端断开事件

{

计算机应用技术系课程设计报告书

CTime t=CTime::GetCurrentTime(); CString strTime=\; 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;

CString sc;

sc= strTime+uinfo[i].username+\退出聊天室\;

closeinfo1.type=3;

LPCTSTR pc=sc;

LPCTSTR pcname=uinfo[i].username;

memcpy(closeinfo.msg,pc,sc.GetLength()+1);

memcpy(closeinfo1.name,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+\+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)用户赵燃进入了聊天室。如图所示:

(2)用户gg进入了聊天室,如图所示:

计算机应用技术系课程设计报告书

(3)服务器提示有两个用户进入了聊天室,如图所示:

(4)用户赵燃对用户gg发起会话:如图所示:

(5)用户gg对用户赵燃发起会话,如图所示:

计算机应用技术系课程设计报告书

(6)赵燃对群里发起会话,如图所示:

三、小组成员分工说明

(写上谁负责哪一部分,比如谁负责系统分析,谁负责系统编程、谁撰写的报告等,若是单独完成,写独立完成) 独立完成

四、课程设计总结或结论

1 课程设计过程中出现的技术难点和解决方法:

技术难点:譬如可以运行,但是就是无法出现连接的显示和状态,

解决方法:在老师和同学的帮助下,才知道是服务器端有了错误,没有设置自己的IP地址,然后对于客户端进行一番修改,才终于出现了上述的结果。虽然没有彻底的做出来,但是还是比较开心,因为自己知道了那里不足,那里不可以,可以在以后多多的做练习来充实自己。 2 课程设计期间的主要收获:

在课程设计过程中,收获知识,提高能力的同时,我也学会了很多人生的哲理,懂得怎么样区制定计划,怎样去实现这个计划,并掌握了在执行过程中怎么样区克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。

以后我还是需要多多的练习,这样才有可能让自己有信心,有动力,让自己不至于懂得太少而怯场,因为不懂而不会做。

计算机应用技术系课程设计报告书

(6)赵燃对群里发起会话,如图所示:

三、小组成员分工说明

(写上谁负责哪一部分,比如谁负责系统分析,谁负责系统编程、谁撰写的报告等,若是单独完成,写独立完成) 独立完成

四、课程设计总结或结论

1 课程设计过程中出现的技术难点和解决方法:

技术难点:譬如可以运行,但是就是无法出现连接的显示和状态,

解决方法:在老师和同学的帮助下,才知道是服务器端有了错误,没有设置自己的IP地址,然后对于客户端进行一番修改,才终于出现了上述的结果。虽然没有彻底的做出来,但是还是比较开心,因为自己知道了那里不足,那里不可以,可以在以后多多的做练习来充实自己。 2 课程设计期间的主要收获:

在课程设计过程中,收获知识,提高能力的同时,我也学会了很多人生的哲理,懂得怎么样区制定计划,怎样去实现这个计划,并掌握了在执行过程中怎么样区克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。

以后我还是需要多多的练习,这样才有可能让自己有信心,有动力,让自己不至于懂得太少而怯场,因为不懂而不会做。

本文来源:https://www.bwwdw.com/article/d99o.html

Top