您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 基于Visual-C++的聊天室程序设计报告
题目:基于VisualC++的聊天室程序设计姓名:学号:班级:指导教师:专业:计算机网络课程设计1.引言计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《TCP/IP协议与网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。1.1聊天室程序的开发背景近年来,互连网发展日新月异,网络使空间的距离不再成为人们沟通的障碍,世界各个角落的人们可以通过Internet收发邮件、实时聊天、获取最新的资讯。因此本次毕业设计以“面向连接的Winsock网络会话程序开发”为题,制作一个C/S聊天室程序,通过制作该程序还能更好的学习网络socket编程的相关知识。1.2聊天室的设计目标本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为:服务器端功能:1、初始化socket,创建服务器端。2、维护一个链表,保存所有用户的IP地址、端口信息。3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。4、接受用户传送来的连接判断命令,并向用户发出响应命令。客户端功能:客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。当按下“发送”按钮时将信息发送给服务器。通过本课题的毕业设计,可以比较深入的了解和掌握WINSOCK控件基本属性、方法和事件,理解网络聊天通信的概念,输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。2.总体设计2.1功能要求支持多个客户端的连接,在服务器和多个客户端之间进行数据传输;接收客户端发送的消息,并显示在一个列表框中;在用户连接上后有提示,显示出连接的用户名字;发送信息时可以显示聊天的所有记录;2.3系统主要功能和主要功能描述:服务器端聊天程序必须能够做3件事情:(1)服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2)服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。(3)服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的,因此需要一个列表来记录。MFC的CPtrList类就能实现这种功能。客户端聊天程序需要完成以下几个功能:(1)客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。(2)客户端聊天程序要把用户输入的信息及时发送到聊天服务器。一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息发送出去,才能及时地满足用户的交互需求。(3)要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,让用户及时看到对方的响应。(4)在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能。3.详细设计3.1设计流程图启动登陆等待客户端登陆客户端用户创建子套接字MessageCListenSocketCClientSocketMessage登陆成功连接上发送message显示找到客户端并显示登陆失败发送ID和IP3.2客户端的实现(1)首先启动VisualC++6.0,利用MFCAppWizard[EXE]建立一个新的MFC工程,工程名为tcpclient,在MFCAppWizardStep1的时候选择Dialogbased即基于对话框,在Step4时勾选WindowsSockets选项(如图3.11),其他默认值下一步。图3.11MFC的设置(2)客户端主要分为三个窗口,第一个是连接窗口,需要输入连接到服务器的相关设置信息;第二个是聊天信息显示窗口,该窗口显示登录服务器以来发送和接收到的消息;第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送。新建一个对话框,并添加各种控件(见控件表3.1)如下图:图3.12聊天窗口布局表3.1控件类型及各自ID标题控件类型控件ID连接StaticIDC_STATIC信息区StaticIDC_STATIC我的ID:StaticIDC_STATIC服务器ID:StaticIDC_STATIC端口号(默认520)StaticIDC_STATIC连接服务器ButtonIDC_connet发送(回车)ButtonIDC_send编辑框1EditIDC_EDIT1编辑框2EditIDC_EDIT2编辑框3EditIDC_EDIT3编辑框4EditIDC_EDIT4编辑框5EditIDC_EDIT5其中编辑框1:服务器IP;编辑框2:端口号;编辑框3:消息显示区;编辑框4:消息编辑区;编辑框5:我的ID。(3)服务器IP编辑框控件IDC_EDIT1对应的成员变量为OnChangeEdit1端口号编辑框控件IDC_EDIT2对应的成员变量为OnChangeEdit2消息显示区编辑框控件IDC_EDIT3对应的成员变量为OnChangeEdit3消息编辑区编辑框控件IDC_EDIT4对应的成员变量为OnChangeEdit4我的ID编辑框控件IDC_EDIT5对应的成员变量为OnChangeEdit5(4)下面重点介绍一下单击连接服务器按钮时的处理网络连接的函数。代码设置如下:voidCTcpclientDlg::Onconnet(){//TODO:Addyourcontrolnotificationhandlercodehereif(clconect)clconect.Close();CStringipstr,portstr;intport;GetDlgItemText(IDC_EDIT1,ipstr);GetDlgItemText(IDC_EDIT2,portstr);GetDlgItemText(IDC_EDIT5,clientname);portstr.TrimLeft();portstr.TrimRight();port=atoi(portstr);if(port0&&port9999){clconect.Create();//cslisten.Bind(port);if(clconect.Connect(ipstr,port)){clconect.setp(this);CWnd*cw=GetDlgItem(IDC_EDIT1);cw-EnableWindow(false);cw=GetDlgItem(IDC_EDIT2);cw-EnableWindow(false);cw=GetDlgItem(IDC_connet);cw-EnableWindow(false);cw=GetDlgItem(IDC_EDIT5);cw-EnableWindow(false);SetDlgItemText(IDC_EDIT3,已设名字+clientname+\r\n连接服务器成功);CStringenterinfo=clientname+进入聊天室;intlen=enterinfo.GetLength();clconect.Send(enterinfo,len);}else{clconect.Close();MessageBox(连接失败,请检查IP与端口是否与服务器一致!或者服务器没打开,连接错误,MB_ICONERROR);}}else{MessageBox(端口或IP输入有误,请重新输入);}}设计步骤:①创建字符串ipstr(保存IP),portstr(保存端口),clientname(用户名),整型port(端口号)。②利用GetDlgItemText将各个编辑框中的信息赋给相应的变量。③监视端口号和IP格式并设置相应错误提示(如下图)。图3.13连接错误提示图3.14端口或IP错误提示④创建套接字clconect,设置成功创建后相关控件为只读(避免误操作)。⑤设置建立连接后相应提示。(5)接下来就是对话框中的发送(回车)按钮的函数,代码设置如下:voidCTcpclientDlg::Onsend(){CStringstr;GetDlgItemText(IDC_EDIT4,str);str=clientname+:+str;intlen=str.GetLength();if(clconect.Send(str,len)1)SetDlgItemText(IDC_EDIT4,);}定义字符串str用于保存输入的消息,调整格式后使用CSocket的操作函数send将消息发送到服务器。(6)要显示客户端接收到来自服务器其他用户的信息,代码设置如下:voidCTcpclientDlg::onrev(){CStringstr,str1;charss[256];for(intj=0;j256;j++)ss[j]='\0';clconect.Receive(ss,256);if(ss!=)str.Format(%s,ss);GetDlgItemText(IDC_EDIT3,str1);str=str1+\r\n+str;SetDlgItemText(IDC_EDIT3,str);CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT3));ce-LineScroll(ce-GetLineCount()-1);;}设计步骤:①创建字符串str、str1,字符数组ss。②接受来自服务器套接字的信息数据保存到ss中,调整格式后将其打印到消息区。(7)当与服务器断开连接时弹出警告,如下图:图3.15失去连接提示代码设置如下:voidCTcpclientDlg::oncl(){MessageBox(失去连接或者找不到服务器);CWnd*cw=GetDlgItem(IDC_EDIT1);cw-EnableWindow(true);cw=GetDlgItem(IDC_EDIT2);cw-EnableWindow(true);cw=GetDlgItem(IDC_connet);cw-EnableWindow(true);cw=GetDlgItem(IDC_EDIT5);cw-EnableWindow(true);}当失去与服务器的连接后,重新将连接服务器设置编辑框启用等待下次连接。(8)在退出程序时的提示,如下图:图3.16退出确认代码设置如下:voidCTcpclientDlg::OnClose(){intconfirm=MessageBox(确定退出吗,请确定,MB_YESNO|MB_ICONQUESTION);if(confirm==IDYES){CStringenterinfo=clientname+退出了聊天室;intlen=enterinfo.GetLength();c
本文标题:基于Visual-C++的聊天室程序设计报告
链接地址:https://www.777doc.com/doc-5059055 .html