用VC++设计简单的聊天室程序完整课程设计Word格式.docx

上传人:b****5 文档编号:16660994 上传时间:2022-11-25 格式:DOCX 页数:31 大小:216.97KB
下载 相关 举报
用VC++设计简单的聊天室程序完整课程设计Word格式.docx_第1页
第1页 / 共31页
用VC++设计简单的聊天室程序完整课程设计Word格式.docx_第2页
第2页 / 共31页
用VC++设计简单的聊天室程序完整课程设计Word格式.docx_第3页
第3页 / 共31页
用VC++设计简单的聊天室程序完整课程设计Word格式.docx_第4页
第4页 / 共31页
用VC++设计简单的聊天室程序完整课程设计Word格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

用VC++设计简单的聊天室程序完整课程设计Word格式.docx

《用VC++设计简单的聊天室程序完整课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《用VC++设计简单的聊天室程序完整课程设计Word格式.docx(31页珍藏版)》请在冰豆网上搜索。

用VC++设计简单的聊天室程序完整课程设计Word格式.docx

VisualC++

 

1引言

1.1课题背景及意义

当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。

在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。

聊天室程序可以说是网上最简单的多点通信程序。

一个简单的聊天室,从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。

基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法。

它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。

而在SOCKETAPI的帮助下,开发基于SOCKET的局域网通信软件也是易于实现的。

1.2实验平台介绍

VisualC++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。

VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 

Windows平台无所不能。

VC主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层 

的调用。

在VC里边嵌入汇编语言很简单。

当对系统性能要求很高的时候,可用VC开发。

VC在多线程、网络通信、分布应用方面,有着不可比拟的优势。

1.3可行性分析

本课程设计主要解决在客户端于客户端的信息交换和客户端于服务器的信息交换及服务器的信息处理上的管理的课程设计。

此程序主要分为两部分:

服务器端和客户端。

服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;

客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。

在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。

服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。

整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。

先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的网络地址与服务器进行通信。

在这里,把端口号成为“聊天频道”。

在后面的程序代码分析中将看到,端口号并不等同于聊天频道,而是在聊天频道上增加一个固定的偏移值,使得这个聊天频道不会和系统保留的端口发生冲突。

服务器启动后将在这个指定的端口号中等待客户的连接。

对于公共聊天室,服务器对客户的数目不做任何限制。

而对于私人聊天室,每个聊天频道则只能允许两个客户互相连接,使得一方发送的信息只能到达对方的主机中。

这里的服务器提供的是公共聊天服务。

通过分析发现,该程序完全可以通过VisualC++中MFC完成。

2需求分析

2.1设计目的

  综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以VisualC++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。

2.2设计要求

采用客户/服务器模式,分为客户端程序和服务器端程序。

服务器采用WINSOCKI/O模型中的任一种,支持多个客户同时在线聊天。

客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。

课程设计要求设计并编程完成两个方面的内容:

首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;

其次设计一个可以和服务器通信的聊天室客户端。

2.3功能要求

✧支持多个客户端的连接,在服务器和多个客户端之间进行数据传输;

✧接收客户端发送的消息,并显示在一个列表框中;

✧在用户连接上后有提示,显示出连接的用户名字;

✧发送信息时可以显示聊天的所有记录;

2.4系统主要功能和主要功能描述:

服务器端聊天程序必须能够做3件事情:

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

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

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

(3)服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。

这些要求可以通过CSocket类提供的功能实现。

从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。

服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。

客户套接字的数量是不可预知的,因此需要一个列表来记录。

MFC的CPtrList类就能实现这种功能。

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

(1)客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。

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

一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息发送出去,才能及时地满足用户的交互需求。

(3)要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,让用户及时看到对方的响应。

(4)在用户退出聊天过程是要关闭与服务器的连接。

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

客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。

该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能。

3设计流程图

根据对用户的要求及功能设置可以得到以下的流程图3.1,用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息,用户向服务器发送信息,服务器处理用户的数据,然后用户开始聊天。

客户端的聊天分为对所有人的信息和私聊的信息,该信息应通过程序控制分别进行处理。

图3.1设计流程图

4调试分析过程描述

Login服务器:

在启动聊天室服务端的时候,会出现图4.1的界面,该界面为服务器的登陆界面。

图4.1登陆服务器界面

启动服务器:

在登陆页面的环境下,点击启动服务器按钮,即可创建一个新的服务器,服务器界面如图4.2所示。

图4.2启动服务器界面

Login客户端:

在启动客户端服务端的时候,会出现图4.3的界面,该界面为客户端的连接界面。

图4.3登陆客户端界面

图4.4为创建张三客户端,输入用户名张三:

图4.4输入名称张三

图4.5为用户张三连接服务器界面,在输入用户名张三并点击确定后,出现如下界面:

图4.5张三登陆服务器

图4.6为用户李四的连接界面,在李四连接后,张三和李四用户同时出现在用户列表内:

图4.6李四登陆服务器

图4.7为用户李四的连接界面,在王五连接后,张三,李四和王五用户同时出现在用户列表内:

图4.7王五登陆服务器

服务器显示:

在张三,李四,王五进入聊天室后的界面为图4.8.:

图4.8用户成功登陆后界面

开始聊天,群聊:

客户端发送信息时的界面为图4.9

图4.9聊天界面

图4.10为私聊界面。

张三与李四私聊:

点击私聊选项,并发送私聊内容。

图4.10张三私聊界面

图4.11为张三私聊界面,李四和张三私聊,张三能看到李四发送的内容:

图4.11李四私聊界面

图4.12为王五的界面显示,王五看不到张三和李四的私聊内容:

图4.12非私聊对象界面

5设计的总结和体会

该次课程设计的制作我主要是参照了图书馆内的相关书籍,找到一个类似的程序,然后按照书上的内容一步步的做出来了,虽然这个程序算不上是我自己写出来的,但通过这样的一个过程,还是让我学会了很多东西,也算能比较熟练地掌握MFC这一个软件了,这算是一个不小的收获吧,而且,在做这个程序的过程中,让我认识到了在做这样程序中,遇到解决不了的问题与同学的讨论时很重要的,譬如可以以运行,但是就是无法出现连接的显示和状态。

最后与同学讨论后,才知道是服务器端有了错误,没有设置自己的IP地址,然后对于客户端进行了一番修改,才终于出现了上述的结果。

虽然没有彻底做的出来,但是还是比较开心的,因为自己知道了哪里不足,哪里不可以,可以在以后多多的做练习来充实自己。

在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。

因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!

我以后还是需要多多的练习,多多的勤奋,这样才有可能让自己有信心,有动力,让自己不至于懂的太少而怯场,因为不懂而不会做,相信自己以后会编写出让自己满意的程序和软件的。

6参考文献

[1]任泰明著.TCP/IP协议与网络编程.西安电子科技大学出版社.2004

[2]唐克著.MFC程序设计:

UsingVisualC++6.0.北京希望电子出版社.2002

[3]邓全良著.Winsock网络程序设计.中国铁道出版社.2002

[4]《VisualC++6.0使用与开发》清华大学出版社,木林森、高峰霞、罗丽琼、奚红宇编著

[5]《Visualc++实用教程(第三版)郑阿奇,电子工业出版社

附:

源代码

I服务器:

//ServerDlg.cpp:

implementationfile

//

#include"

stdafx.h"

Server.h"

ServerDlg.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

//CAboutDlgdialogusedforAppAbout

classCAboutDlg:

publicCDialog

{

public:

CAboutDlg();

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg:

:

CAboutDlg():

CDialog(CAboutDlg:

IDD)

}

voidCAboutDlg:

DoDataExchange(CDataExchange*pDX)

CDialog:

DoDataExchange(pDX);

BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)

END_MESSAGE_MAP()

//CServerDlgdialog

CServerDlg:

CServerDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CServerDlg:

IDD,pParent)

m_hIcon=AfxGetApp()->

LoadIcon(IDI_ICONAPP);

voidCServerDlg:

DDX_Control(pDX,IDC_LIST_USER,m_lbUser);

DDX_Text(pDX,IDC_EDIT_DISPLAY,m_strDisplay);

BEGIN_MESSAGE_MAP(CServerDlg,CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BN_START,OnBnStart)

ON_BN_CLICKED(IDC_BN_CLOSE,OnBnClose)

ON_MESSAGE(WM_RECEIVE,OnReceive)

ON_MESSAGE(WM_CLIENTCLOSE,OnClientClose)

ON_MESSAGE(WM_ACCEPT,OnAccept)

ON_WM_DESTROY()

//CServerDlgmessagehandlers

BOOLCServerDlg:

OnInitDialog()

OnInitDialog();

ASSERT((IDM_ABOUTBOX&

0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<

0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->

AppendMenu(MF_SEPARATOR);

AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

SetIcon(m_hIcon,TRUE);

//Setbigicon

SetIcon(m_hIcon,FALSE);

//Setsmallicon

m_iNetPort=3127;

m_Server.Initialize(this);

m_bServer=FALSE;

GetDlgItem(IDC_BN_CLOSE)->

EnableWindow(FALSE);

returnTRUE;

//returnTRUEunlessyousetthefocustoacontrol

OnSysCommand(UINTnID,LPARAMlParam)

if((nID&

0xFFF0)==IDM_ABOUTBOX)

CAboutDlgdlgAbout;

dlgAbout.DoModal();

else

CDialog:

OnSysCommand(nID,lParam);

OnPaint()

if(IsIconic())

CPaintDCdc(this);

//devicecontextforpainting

SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&

rect);

intx=(rect.Width()-cxIcon+1)/2;

inty=(rect.Height()-cyIcon+1)/2;

dc.DrawIcon(x,y,m_hIcon);

OnPaint();

HCURSORCServerDlg:

OnQueryDragIcon()

return(HCURSOR)m_hIcon;

OnBnStart()

//创建套接字

m_Server.Create(m_iNetPort);

//开始监听

m_Server.Listen();

//显示

CStringstrInfo;

strInfo.LoadString(IDS_CREATE_SERVER);

ShowInDisplay(strInfo);

m_bServer=TRUE;

GetDlgItem(IDC_BN_START)->

EnableWindow(TRUE);

OnBnClose()

CloseServer();

OnAccept()

//创建新客户

CMySocket*pNewClient=newCMySocket;

pNewClient->

Initialize(this);

m_Server.Accept(*pNewClient);

//放入链表中

m_lsClient.AddTail(pNewClient);

OnClientClose(WPARAMwParam,LPARAMlParam)

CMySocket*p_delClient=(CMySocket*)wParam;

//关闭该用户

p_delClient->

ShutDown();

charbuffer[BUFFERSIZE];

while(p_delClient->

Receive(buffer,BUFFERSIZE)>

0);

Close();

//在用户链表中删除该用户

POSITIONpsCur,psList=m_lsClient.GetHeadPosition();

CMySocket*p_curClient;

while(psList!

=NULL)

psCur=psList;

p_curClient=(CMySocket*)m_lsClient.GetNext(psList);

if(p_delClient==p_curClient)

m_lsClient.RemoveAt(psCur);

break;

//发送信息告诉其他用户该客户退出

CStringstrMsg;

strMsg.LoadString(IDS_CLIENT_CLOSE);

NETMESSAGEnetMessage(PTC_CLIENT_QUIT,p_delClient->

GetName(),_T("

"

),p_delClient->

GetName()+strMsg);

SendToAllClient(netMessage);

//界面上清理该用户信息

m_lbUser.DeleteString(m_lbUser.FindString(-1,p_delClient->

GetName()));

ShowInDisplay(p_delClient->

//删除该用户

deletep_delClient;

OnReceive(WPARAMwParam,LPARAMlParam)

CMySocket*p_curClient=(CMySocket*)wParam;

NETMESSAGEnetMessage;

p_curClient->

Receive((char*)&

netMessage,sizeof(netMessage));

switch(netMessage.type)

casePTC_NEW:

//新客户加入

NewClientAdd(p_curClient,&

netMessage);

casePTC_SAY:

//普通聊天

ShowMessage(netMessage);

//把加工过的信息发送给其他用户

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1