您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页(完整word版)QQ模拟聊天系统实验报告

(完整word版)QQ模拟聊天系统实验报告

来源:五一七教育网


题 目 :Q Q 模 拟 聊 天 系 统 学 院 : 软件学院 班 级 : 10级网络工程3班 指 导 教 师 : 钱 鸽 姓 名 : 谢 昊 天

学 号 : 1215134046

学年 、学期 : 2012~2013学年第一学期

- 1 -

目录

1.引言...................................................................................................................................................................3 1.1 需求分析....................................................................................................................................................3 1.2聊天室程序的开发背景..........................................................................................................................3 1.3聊天室的设计目标.................................................................................................................................. 4

2.总体设计..........................................................................................................................................................4 2.1 功能要求................................................................................................................................................... 4 2.2系统主要功能和主要功能描述:.........................................................................................................5

3.详细设计..........................................................................................................................................................6 3.1设计流程图..................................................................................................................................................6 3.2客户端的实现.................................. ..........................................................................................................7 3.3服务端的实现..........................................................................................................................................14

4.运行结果....................................................................................................................................................... 21 4.1 客户端.......................................................................................................................................................21 4.2 服务器端................................................................................................................................................22 4.3 客户端登陆到服务器端....................................................................................................................22 4.4 进行对话................................................................................................................................................23 4.5 退出服务器端与客户端....................................................................................................................23

5.心得体会...................................................................................................................................................... 26 6.参考文献..................................................................................................................................................... 26

- 2 -

1. 引言

计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《TCP/IP协议与网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。

1.1 需求分析:

当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。

在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。

聊天室适用于网上会议或闲聊的一些场合。聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。

1.2 聊天室程序的开发背景

近年来,互连网发展日新月异,网络使空间的距离不再成为人们沟通的障碍,世界各个角落的人们可以通过Internet收发邮件、实时聊天、获取最

- 3 -

新的资讯。因此本次毕业设计以“面向连接的Winsock网络会话程序开发”为题,制作一个C/S聊天室程序,通过制作该程序还能更好的学习网络socket编程的相关知识。

1.3 聊天室的设计目标

本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为: 服务器端功能:

1、 初始化socket, 创建服务器端。

2、 维护一个链表,保存所有用户的IP地址、端口信息。 3、 接受用户传送来的聊天信息,然后向链表中的所用用户转发。 4、 接受用户传送来的连接判断命令,并向用户发出响应命令。 客户端功能:

客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。当按下“发送”按钮时将信息发送给服务器。

通过本课题的实训设计,可以比较深入的了解和掌握WINSOCK控件基本属性、方法和事件,理解网络聊天通信的概念,输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。

2. 总体设计

2.1 功能要求

1、 支持多个客户端的连接,在服务器和多个客户端之间进行数据传输; 2、 接收客户端发送的消息,并显示在一个列表框中;

- 4 -

3、 在用户连接上后有提示,显示出连接的用户名字; 4、 发送信息时可以显示聊天的所有记录;

2.2系统主要功能和主要功能描述: 服务器端聊天程序必须能够做3件事情: 1、

服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并

且需要维护一个客户连接表,以记录所有成功的连接。 2、

服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把

这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。 3、

服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列

表中删除相应的表项,并及时更新连接表。

这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的,因此需要一个列表来记录。MFC的CPtrList类就能实现这种功能。

客户端聊天程序需要完成以下几个功能:

1、 客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的

设置尝试与服务器的连接,并且随时检测连接的状态。

2、 客户端聊天程序要把用户输入的信息及时发送到聊天服务器。一般情

况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行

- 5 -

信息发送出去,才能及时地满足用户的交互需求。

3、 要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,

让用户及时看到对方的响应。

4、 在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前

通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。

客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能。

3. 详细设计

3.1设计流程图

- 6 -

CListenSocket 启动 CClientSocket 登陆 等待客户端登陆 发送ID和IP 登陆成功 登陆失败 创建子套接字 连接上 客户端用户 发送message 显示Message 找到客户端并显示 Message

3.2客户端的实现

(1)首先启动Visual C++ 6.0,利用MFC AppWizard[EXE]建立一个新的MFC工程,工程名为:QQ模拟聊天系统,在MFC AppWizard Step1的时候选择Dialog based 即基于对话框,在Step4时勾选Windows Sockets选项(如图),其他默认值下一步。

- 7 -

MFC的设置

(2)客户端主要分为三个窗口,第一个是连接窗口,需要输入连接到服

务器的相关设置信息;第二个是聊天信息显示窗口,该窗口显示登录服务器以来发送和接收到的消息;第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送。

新建一个对话框,并添加各种控件,如下图:

- 8 -

聊天窗口布局

表3.1 控件类型及各自ID 标题 我的名字: 服务器IP: 端口号: 连接服务器 发送(回车) 编辑框1(服务器IP) 编辑框2(端口号) 编辑框3 编辑框4 编辑框5(我的名字)

- 9 -

控件类型 Static Static Static Button Button Edit Edit Edit Edit Edit 控件ID IDC_STATIC IDC_STATIC IDC_STATIC IDC_connet IDC_send IDC_EDIT1 IDC_EDIT2 IDC_EDIT3 IDC_EDIT4 IDC_EDIT5

其中编辑框1:服务器IP;编辑框2:端口号;编辑框3:消息显示区;编辑框4:消息编辑区;编辑框5:我的名字。

(3)服务器IP编辑框控件IDC_EDIT1对应的成员变量为OnChangeEdit1 端口号编辑框控件IDC_EDIT2对应的成员变量为OnChangeEdit2 消息显示区编辑框控件IDC_EDIT3对应的成员变量为OnChangeEdit3 消息编辑区编辑框控件IDC_EDIT4对应的成员变量为OnChangeEdit4

我的名字编辑框控件IDC_EDIT5对应的成员变量为OnChangeEdit5 (4)单击连接服务器按钮时的处理网络连接的函数。代码设置如下:

void CTcpclientDlg::Onconnet() {

// TODO: Add your control notification handler code here if(clconect) clconect.Close();

CString ipstr,portstr; //创建字符串ipstr(保存IP)portstr(保存端口), int port;

GetDlgItemText(IDC_EDIT1,ipstr); GetDlgItemText(IDC_EDIT2,portstr); GetDlgItemText(IDC_EDIT5,clientname); portstr.TrimLeft(); portstr.TrimRight(); port=atoi(portstr); if(port>0&&port<9999){ 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连接服务器

- 10 -

成功\"); //设置对话框的文本和标题

CString enterinfo=clientname+\"进入聊天室\"; int len=enterinfo.GetLength(); clconect.Send(enterinfo,len); } else{

clconect.Close();

MessageBox(\"连接失败,请检查IP与端口是否与服务器一致!或者服务器没打开\连接错误\

} } else{

MessageBox(\"端口或IP输入有误,请重新输入\"); } }

设计步骤:

①创建字符串ipstr(保存IP),portstr(保存端口),clientname(用户名),整型port(端口号)。

②利用GetDlgItemText将各个编辑框中的信息赋给相应的变量。 ③监视端口号和IP格式并设置相应错误提示(如下图)。

连接错误提示

端口或IP错误提示

- 11 -

④创建套接字clconect,设置成功创建后相关控件为只读(避免误操作)。 ⑤设置建立连接后相应提示。

(5)接下来就是对话框中的发送(回车)按钮的函数,代码设置如下:

void CTcpclientDlg::Onsend() {

CString str;

GetDlgItemText(IDC_EDIT4,str); str=clientname+\":\"+str; int len=str.GetLength();

if(clconect.Send(str,len)>1)SetDlgItemText(IDC_EDIT4,\"\"); }

定义字符串str用于保存输入的消息,调整格式后使用CSocket的操作函数send将消息发送到服务器。

(6)要显示客户端接收到来自服务器其他用户的信息,代码设置如下:

void CTcpclientDlg::onrev() {

CString str,str1; char ss[256];

for(int j=0;j<256;j++) ss[j]='\\0';

clconect.Receive(ss,256); if(ss!=\"\")

str.Format(\"%s\

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中,调整格式后将其打印到消息区。

- 12 -

(7)当与服务器断开连接时弹出警告,如下图:

图3.15 失去连接提示

代码设置如下:

void CTcpclientDlg::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 退出确认

代码设置如下:

void CTcpclientDlg::OnClose()

- 13 -

{

int confirm=MessageBox(\"确定退出吗\请确定\ if(confirm==IDYES){

CString enterinfo=clientname+\"退出了聊天室\"; int len=enterinfo.GetLength(); clconect.Send(enterinfo,len); CDialog::OnClose(); } }

设计步骤:

①当退出程序时,弹出确认对话框。

②当选择“是”时,将用户退出信息发送至服务器并关闭对话框。

3.3服务端的实现

(1)和客户端一样,仍然建立一个基于对话框的工程,工程名为tcpserver,同样,注意一定不要忘记在Step4时勾选Windows Sockets选项。其他默认下一步。

(2)客户端主要分为三个窗口,第一个是服务器信息设置窗口,需要输入服务器的相关设置信息;第二个是聊天信息显示窗口,该窗口显示启动服务器以来发送和接收到的消息;第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送。

新建一个对话框,并添加各种控件如下图:

- 14 -

图 3.21

表3.2 控件类型及各自ID 标题 服务器名称: 端口: 启动服务器 发送(回车) 编辑框1 编辑框2 编辑框3 编辑框4

- 15 -

控件类型 Static Static Button Button Edit Edit Edit Edit 控件ID IDC_STATIC IDC_STATIC IDC_listen IDC_send IDC_EDIT1 IDC_EDIT2 IDC_EDIT3 IDC_EDIT4 其中编辑框1:消息显示区;编辑框2:消息编辑区;编辑框3:服务器名称;编辑框4:端口号。

(3)消息显示区编辑框控件IDC_EDIT1对应的成员变量为OnChangeEdit1 消息编辑区编辑框控件IDC_EDIT2对应的成员变量为OnChangeEdit2 服务器名称编辑框控件IDC_EDIT3对应的成员变量为OnChangeEdit3 端口号编辑框控件IDC_EDIT4对应的成员变量为OnChangeEdit4 (4)单击启动服务器按钮时的处理网络连接的函数。代码设置如下:

void CTcpseverDlg::Onlisten() {

// Beep(2000,100); CString ipstr,portstr;

int port;

GetDlgItemText(IDC_EDIT3,ipstr); severname=ipstr;

GetDlgItemText(IDC_EDIT4,portstr); portstr.TrimLeft(); portstr.TrimRight(); port=atoi(portstr); if(port>0&&port<9999){

if(cslisten.Create(port)){

// cslisten.Bind(port); cslisten.Listen(); cslisten.setp(this,csnum); cslisten.Listen();

CWnd *cw=GetDlgItem(IDC_EDIT3); cw->EnableWindow(false); cw=GetDlgItem(IDC_EDIT4);

- 16 -

cw->EnableWindow(false); cw=GetDlgItem(IDC_listen); cw->EnableWindow(false); cw=GetDlgItem(IDC_EDIT1);

cw->SetWindowText(\"服务器名:\"+severname+\"\\r\\n等待用户连接,监听端

口:\"+portstr+\"...\"); }

} else{

MessageBox(\"端口输入有误,请重新输入\"); } else{ }

MessageBox(\"设置监听端口失败,端口可能被其它程序占用\"); cslisten.Close();

}

设计步骤:

①创建字符串ipstr(保存IP),portstr(保存端口),整型port(端口号)。

②利用GetDlgItemText将各个编辑框中的信息赋给相应的变量。 ③监视端口号和IP格式并设置相应错误提示(如下图)。

图 3.22 图 3.23

④设置建立连接后相应提示。

- 17 -

(5)接下来就是对话框中的发送(回车)按钮的函数,代码设置如下:

void CTcpseverDlg::Onsend() {

CString str,history;

GetDlgItemText(IDC_EDIT1,history); GetDlgItemText(IDC_EDIT2,str); str=severname+\":\"+str; int len=str.GetLength(); int sended;

for(int i=1;i<=csnum;i++) if(csrev[i])

SetDlgItemText(IDC_EDIT2,\"\");SetDlgItemText(IDC_EDIT1,history+\"\\r\\n\"+str); }

CEdit *ce=((CEdit*)GetDlgItem(IDC_EDIT1)); ce->LineScroll(ce->GetLineCount()-1);;} if( sended=csrev[i].Send(str,len)) {

定义字符串str用于保存输入的消息,调整格式后使用CSocket的操作函数send将消息发送到各个客户端。

(6)要显示服务器接收到来自客户端其他用户的信息,代码设置如下:

void CTcpseverDlg::onrev(int mynum) {

CString str,str1;int i; char ss[100];

for(int j=0;j<100;j++) ss[j]='\\0';

csrev[mynum].Receive(ss,100); str.Format(\"%s\

- 18 -

for(i=1;i<=csnum;i++)if(csrev[i])

if(csrev[i]) csrev[i].Send(str,100);

GetDlgItemText(IDC_EDIT1,str1); str=str1+\"\\r\\n\"+str;

SetDlgItemText(IDC_EDIT1,str);

CEdit *ce=((CEdit*)GetDlgItem(IDC_EDIT1));

ce->LineScroll(ce->GetLineCount()-1);;

}

设计步骤:

①创建字符串str、str1,字符数组ss。

②接受来自服务器套接字的信息数据保存到ss中,调整格式后将其打印到消息区。

(7)当有新用户进入时,显示“XXX进入”。 代码如下:

void CTcpseverDlg::onac() { CString str1,str;

GetDlgItemText(IDC_EDIT1,str1); CString str2=\"\\r\\n进入\"; str=str1+str2;

SetDlgItemText(IDC_EDIT1,str);

cslisten.Accept(csrev[++csnum]); csrev[csnum].setp(this,csnum);

}

- 19 -

(8)在退出程序时的提示,如下图:

图3.24 退出确认

代码设置如下:

void CTcpseverDlg::OnClose() {

CString str=\"服务器即将退出\";

int confirm=MessageBox(\"确定退出服务器?所有用户都将断开\请确定

\

}

if(confirm==IDYES){ }

int len=str.GetLength();

for(int i=1;i<=csnum;i++) if(csrev[i]) csrev[i].Send(str,len); str=severname+\"退出,与服务器连接已断开\"; len=str.GetLength();

for( i=1;i<=csnum;i++) if(csrev[i]) csrev[i].Send(str,len); CDialog::OnClose();

设计步骤:

①当退出程序时,弹出确认对话框。

②当选择“是”时,将服务器关闭信息发送至各个客户端并关闭对话框。

- 20 -

4.运行结果:

4.1 客户端:

- 21 -

4.2 服务器端:

4.3 客户端登陆到服务器端:

- 22 -

4.4 进行对话:

4.5 退出服务器端与客户端:

- 23 -

- 24 -

- 25 -

5.心得体会:

通过一周的课程设计,让我学会了很多东西,也算能比较熟练地掌握MFC这一个软件了,动手能力增强了不少。

6.参考文献:

【1】罗莉琴 詹祖桥 《Windows 网络编程》 人民邮电出版社 2011版 【2】孙浩 《Visual C++ 范例大全》 机械工业出版社 2009

- 26 -

【3】姚领田《精通MFC程序设计》 北京人民邮电出版社 2007版 【4】杨富国《Visual C++程序开发案例解析》 北京清华大学出版社 2006版

- 27 -

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务