简单聊天程序的设计与实现课程设计.docx
《简单聊天程序的设计与实现课程设计.docx》由会员分享,可在线阅读,更多相关《简单聊天程序的设计与实现课程设计.docx(45页珍藏版)》请在冰豆网上搜索。
简单聊天程序的设计与实现课程设计
实验报告
课程计算机网络实验名称简单聊天程序的设计与实现
一、实验目的
综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual
C++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力
二、实验内容
1、按实验步骤中参考程序使用VC++设计出程序;
2、在第1步的基础上使用VC++或其他工具设计出一个能实现两个人聊天的网络程序。
三、实验原理
1.WindowsSocket和套接字的基本概念;
程序分为服务端和客户端两个,其主要工作过程如图1所示:
服务器端:
服务器程序首选启动,通过调用socket()函数建立一个套接字,然后调用bind()函数使套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请示队列的长度,之后就调用accept()来接收连接。
客户机端:
客户机程序也使用socket()建立套接字,然后调用connect()函数和服务器建立连接。
连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。
最后,等数据传送结束后,双方调用close()关闭套接字。
四、调试过程分析描述
Login服务器:
在启动聊天室服务端的时候,会出现图4.1的界面,该界面为服务器的
登陆界面。
启动服务器:
在登陆页面的环境下,点击启动服务器按钮,即可创建一个新的服务器,
服务器界面如图4.2所示
Login客户端:
在启动客户端服务端的时候�会出现图4.3的界面�该界面为客户端的连接界面。
图4.4为创建张三客户端�输入用户名张三:
图4.5为用户张三连接服务器界面,在输入用户名张三并点击确定后,出现如下界面:
图4.6为用户李四的连接界面,在李四连接后,张三和李四用户同时出现在用户列表内:
图4.7为用户李四的连接界面,在王五连接后,张三,李四和王五用户同时出现在用户列表内:
服务器显示:
在张三,李四,王五进入聊天室后的界面为图4.8:
图4.8用户成功登陆后界面
开始聊天,群聊:
客户端发送信息时的界面为图4.9
图4.10为私聊界面。
张三与李四私聊,点击私聊选项,并发送私聊内容。
图4.11为张三私聊界面,李四和张三私聊,张三能看到李四发送的内容:
图4.12为王五的界面显示,王五看不到张三和李四的私聊内容:
五设计的总结和体会
该次课程设计的制作我主要是参照了图书馆内的相关书籍,找到一个类似的程序,
然后按照书上的内容一步步的做出来了,虽然这个程序算不上是我自己写出来的,但通
过这样的一个过程,还是让我学会了很多东西,也算能比较熟练地掌握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"
#include"Server.h"
#include"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:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
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()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CServerDlgmessagehandlers
BOOLCServerDlg:
:
OnInitDialog()
{
CDialog:
:
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);
pSysMenu->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
}
voidCServerDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
voidCServerDlg:
:
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;
}
else
{
CDialog:
:
OnPaint();
}
}
HCURSORCServerDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCServerDlg:
:
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(FALSE);
GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);
}
voidCServerDlg:
:
OnBnClose()
{
CloseServer();
GetDlgItem(IDC_BN_START)->EnableWindow(TRUE);
GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);
}
voidCServerDlg:
:
OnAccept()
//创建新客户
CMySocket*pNewClient=newCMySocket;
pNewClient->Initialize(this);
m_Server.Accept(*pNewClient);
//放入链表中
m_lsClient.AddTail(pNewClient);
}
voidCServerDlg:
:
OnClientClose(WPARAMwParam,LPARAMlParam)
{
CMySocket*p_delClient=(CMySocket*)wParam;
//关闭该用户
p_delClient->ShutDown();
charbuffer[BUFFERSIZE];
while(p_delClient->Receive(buffer,BUFFERSIZE)>0);
p_delClient->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->GetName()+strMsg);
//删除该用户
deletep_delClient;
}
voidCServerDlg:
:
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);
break;
casePTC_SAY:
//普通聊天
ShowMessage(netMessage);
break;
}
//把加工过的信息发送给其他用户
SendToAllClient(netMessage);
}
voidCServerDlg:
:
CloseServer()
{
if(!
m_bServer)return;
//向所有客户发送服务端关闭的信息
CStringstrInfo;
strInfo.LoadString(IDS_CLOSESERVER);
NETMESSAGEnetMessage(PTC_SYSTEM,_T(""),_T(""),strInfo);
SendToAllClient(netMessage);
//服务端界面显示关闭信息
ShowInDisplay(strInfo);
//关闭服务端
m_Server.Close();
//关闭客户端
charbuffer[BUFFERSIZE];
CMySocket*m_pClient;
POSITIONpsList=m_lsClient.GetHeadPosition();
while(psList!
=NULL)
{
m_pClient=(CMySocket*)m_lsClient.GetNext(psList);
m_pClient->ShutDown();
while(m_pClient->Receive(buffer,BUFFERSIZE)>0);
m_pClient->Close();
deletem_pClient;
}
m_lsClient.RemoveAll();
m_bServer=FALSE;
}
//向所有户发出信息
voidCServerDlg:
:
SendToAllClient(constNETMESSAGE&netMessage)
{
CMySocket*m_pClient;
POSITIONpsList=m_lsClient.GetHeadPosition();
while(psList!
=NULL)
{
m_pClient=(CMySocket*)m_lsClient.GetNext(psList);
m_pClient->SendMsg(netMessage);
}
}
voidCServerDlg:
:
ShowInDisplay(CStringstr)
{
m_strDisplay+=str+"\r\n";
UpdateData(false);
}
voidCServerDlg:
:
OnDestroy()
{
CDialog:
:
OnDestroy();
//TODO:
Addyourmessagehandlercodehere
}
//新用户加入
voidCServerDlg:
:
NewClientAdd(CMySocket*p_client,NETMESSAGE*netMessage)
{
//存入用户名字
p_client->SetName(netMessage->form);
//在列表框中显示该用户
m_lbUser.AddString(p_client->GetName());
//发送用户列表给该客户
NETMESSAGEnetMsg(PTC_USER_LIST,_T(""),_T(""),_T(""));
intiListLen=m_lbUser.GetCount();
CStringstrMsg;
for(intindex=m_lbUser.GetTopIndex();index{
m_lbUser.GetText(index,strMsg);
strcpy(netMsg.data,(LPCTSTR)strMsg);
p_client->SendMsg(netMsg);
//加工信息
strMsg.LoadString(IDS_NEW_CLIENT);
strMsg=p_client->GetName()+strMsg;
strcpy(netMessage->data,(LPCTSTR)strMsg);
//显示该用户进入
ShowInDisplay(strMsg);
}
//显示普通消息
voidCServerDlg:
:
ShowMessage(NETMESSAGEnetMessage)
{
CStringstrTo=netMessage.to;
if(strTo==_T(""))
{
strTo="所有人";
}
CStringstrForm=netMessage.form;
CStringstrMsg=netMessage.data;
CStringstrOut=strForm+"对"+strTo+"说:
"+strMsg;
ShowInDisplay(strOut);
}
II客户端�
//ClientDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"Client.h"
#include"ClientDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif