聊天室程序系统方案.docx
- 文档编号:3826028
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:40
- 大小:91.28KB
聊天室程序系统方案.docx
《聊天室程序系统方案.docx》由会员分享,可在线阅读,更多相关《聊天室程序系统方案.docx(40页珍藏版)》请在冰豆网上搜索。
聊天室程序系统方案
长沙广播电视大学
毕业设计
聊天室软件实现
指导老师:
学生:
学号:
摘要
本课程设计实现类似于Windows操作系统自带的聊天程序。
在课程设计中,系统开发平台为WindowsXP,程序设计语言采用VisualC++,程序运行平台为Windows98/2000/XP。
在程序设计中,主要分别实现服务器端和客户端两部分程序。
系统采用C/S结构,可以多人同时在线。
程序通过调试运行,实现了设计目标,能够同时满足扫雷游戏初学者和高手的需要。
关键词:
聊天程序系统;数据库;VisualC++6.0;SQLServer2000
Abstract
ThecourseisdesignedtoachievesimilartoWindowsoperatingsystembringingchatprogram.Inthecurriculumdesign,systemdevelopingplatformforWindowsXP,programminglanguageusingVisualc++,programoperationplatformforWindows98/2000/XP.Inprogramming,mainlyrealizedrespectivelytheserverandclienttwopartprogram.SystemusingC/Sstructure,canpeopleonlineatthesametime.Programthroughthepost-sale,realizedthedesigngoal,satisfiesminesweeperbeginnersandsuperiorneeds.
Keywords:
chatprogramsystem;Database;Visualc++6.0,SQLServer2000
1绪论
正如大多数聊天室一样,需要在一台计算机上运行服务器端程序,然后就可以在同一网络的其他计算机上运行客户端程序,登录到服务器上。
一个聊天服务器和很多客户端进行通信,从而实现把来自不同的客户的聊天信息转交到所有其他的客户端。
这样就形成一个采用C/S结构的可以多人同时在线的聊天室。
同时本聊天室在设计时完成在线用户显示、私聊功能。
私聊功能即是聊天信息只在私聊两方的计算机客户端上显示,其他客户端不显示。
2系统分析
《聊天程序系统》提供了多个客户端的连接,可以允许多个用户同时在线。
本设计主要对聊天室服务器和聊天室客户端两个方面进行实现,其功能:
新用户登陆、更新在线用户列表、用户离开、私聊等。
3.1功能简介
根据用户的需求,要求系统需具有以下功能:
(1)聊天室服务器端实现功能:
支持多个客户端的连接,一个聊天服务器和很多客户端进行通信。
(2)接收客户端发送的信息,能分析信息的含义。
A.如果是新用户登录,则在服务器在线用户列表框中加入新用户昵称,并显示新用户进入信息提示,同时将更新在线用户列表发给所有客户端;
B.如果是用户离开,则在服务器在线用户列表框中删除此用户昵称,并显示用户离开信息提示,同时将更新在线用户列表发给所有客户端;
C.如果是私聊,聊天信息则显示在服务器聊天信息列表框中,同时将聊天信息仅仅发给私聊对象客户端;
D.如果是公开聊天信息则显示在服务器聊天信息列表框中,同时将聊天信息发给所有客户端。
(3)服务器停止服务时,停止端口侦听,将停止服务信息发给所有客户端。
二、聊天室客户端实现功能:
(1)支持连接指定IP的聊天服务器。
(2)私聊形式或公开形式发送聊天信息给聊天服务器。
(3)接收服务器端发送的信息,能分析信息的含义。
A.如果是用户离开,则在在线用户列表框中删除此用户昵称;
B.如果是更新在线用户列表,则客户端重新显示在线用户。
3.2系统特点
A.界面设计美观友好
B.规、完善的基础信息设置
C.信息查询灵活、方便、快捷
D.系统运行稳定,安全可靠
3.3
4总体设计
4.1细化聊天室程序通信规程
我们通过Socket发送一定格式的字符串来完成不同的操作。
具体格式为:
命令|参数|参数……
(1)新用户登录
NEW_USER|昵称
(2)更新在线用户列表
USERLIST|昵称|昵称|昵称……
(3)用户离开
CLOSEUSE|昵称
(4)私聊
PrivChat|私聊对象|私聊容(含两方的昵称)
注意:
公开的聊天信息,则没有设置相应命令。
在判断不是上述情况后,则就是公开的聊天信息。
4.2客户端工作流程
(1)用户输入服务器端的IP和昵称后,单击连接聊天服务器按钮,客户端程序将建立一个连接套接字Socket与服务器端连接,如果成功,将昵称通过这个Socket发送到服务器端。
(2)用户输入聊天信息后,单击发送信息按钮,通过这个Socket来发送给服务器。
(3)用户如果单击“私聊”复选框,单击发送信息按钮后,先判断是否选择私聊对象,在发出“PrivChat|私聊对象|私聊容”。
(4)当客户端单击“离开聊天室”按钮断开连接前向服务器发出“CLOSEUSE|昵称”信息。
4.3服务器段工作流程
(1)单击启动按钮,服务器端通过create()调用创建一个侦听套接字Socket后与指定的本地端口6767绑定,就可以在该端口进行侦听listen()。
(2)如果有客户端连接请求,将触发侦听套接字的OnAccept事件,在事件处理函数中,创建新的连接套接字,用于与客户端的通信。
并将该连接套接字Socket加入链表类CClientSocketList指针List(&CCSL)所指的链表中。
(3)每当一个连接套接字Socket接收到信息,都将会触发服务器端对应的连接套接字的OnReceive事件。
在OnReceive事件处理函数中,读取客户端发送的聊天信息,根据细化聊天室程序通信规程进行分析。
如果是新用户登录或用户离开或公开聊天信息,则再把接收到的信息发送给每一个连接套接字Socket。
如果是新用户登录或用户离开或私聊信息,则发给找到的私聊对象。
(4)当客户端断开连接前向服务器发出“CLOSEUSE|昵称”。
服务器在OnReceive事件处理函数中在List所指的链表中释放该连接套接字,并同时将更新在线用户列表发给所有客户端。
(5)当单击聊天室服务器“停止”按钮,停止端口侦听,广播聊天服务器停止消息,释放链表CCSL中套接字,清除服务器在线用户列表。
4.3设计目标
本系统是根据用户的实际需求而开发的,完全能够实现对用户的自动化管理,通过本系统可以达到以下目标:
A.系统运行稳定,安全可靠。
B.界面设计美观,人机交互界面友好。
C.信息查询灵活、方便、快捷、准确,数据存储安全可靠。
D.满足键盘和鼠标的双重操作,完全支持回车键。
E.采用多种方式查询数据。
F.操作员可以随时修改自己的口令。
G.对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
H,数据性强,为每个用户设置相应的权限级别。
5系统设计
5.1开发及运行环境
软件要求
操作系统:
Windows2000/NT/XP/CE。
数据库:
SQLServer2000。
5.2聊天室客户端设计
我们要做的客户端分需要输入一些登录信息,如下图1-1所示。
其中上方有两个编辑框,其中一个输入用户昵称信息,另一个用于输入服务器IP地址信息。
聊天室客户端窗口中间有两个列表框,一个显示用户聊天信息,另一个显示在线用户昵称信息。
下方发言边的编辑框,用于输入聊天信息。
两个按钮,一个用来发送信息,另一个用来关闭聊天室客户端窗口,退出聊天室。
图1-1聊天室客户端窗口
其实现过程:
(1)启动VC,利用MFCAppWizard[EXE]建立一个新的MFC程序,取名为ChatRoom,在MFCAppWizardStep1的时候我们选择Dialogbased,在Step2时我们一定要选择上WindowsSockets选项,之后的几步我们就可以使用默认值了。
聊天室客户端窗口是AppWizard生成的时候建立的。
图1-2MFCAppWizardStep2
2.创建连接套接字CClientSocket类
按CTRL+W利用类向导添加一个基类为CSocket类的CClientSocket类,其中有一个很重要的是重载虚成员函数OnReceive(),它调用了主对话框的成员函数GetMessage来实现了立即显示从服务器获得的聊天信息到聊天室客户端窗口对话框中的功能。
在CClientSocket类中添加一个指向对话框类的数据成员myDlg,NikeName。
一个成员函数SetDlg。
黑体为新增或修改过的代码。
//ClientSocket.h:
headerfile
classCChatRoomDlg;
//CClientSocketcommandtarget
classCClientSocket:
publicCSocket
{
//Attributes
public:
CChatRoomDlg*myDlg;//添加数据成员
CStringNikeName;//添加数据成员
BOOLSetDlg(CChatRoomDlg*tmp);//添加一个成员函数
//Overrides
public:
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CClientSocket)
public:
virtualvoidOnReceive(intnErrorCode);//重载的虚成员函数OnReceive
//}}AFX_VIRTUAL
……..
protected:
};
//ClientSocket.cpp:
implementationfile
#include"stdafx.h"
#include"ChatRoom.h"
#include"ClientSocket.h"
#include"ChatRoomDlg.h"
#include"ChatRoomDlg.h"
CClientSocket:
:
CClientSocket()
{
NikeName="";
myDlg=0;
}
BOOLCClientSocket:
:
SetDlg(CChatRoomDlg*tmp)
{
myDlg=tmp;
returntrue;
}
voidCClientSocket:
:
OnReceive(intnErrorCode)
{
myDlg->GetMessage();//调用了主对话框的成员函数GetMessage来显示聊天信息
CSocket:
:
OnReceive(nErrorCode);
}
3.聊天室客户端窗口应用程序定义连接套接字CClientSocket类全局变量,传递到对话框中。
//ChatRoom.cpp
#include"ClientSocket.h"
CClientSocketcurSocket;//全局变量curSocket
BOOLCChatRoomApp:
:
InitInstance()
{
if(!
AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
returnFALSE;
}
AfxEnableControlContainer();
//Standardinitialization
#ifdef_AFXDLL
Enable3dControls();//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic();//CallthiswhenlinkingtoMFCstatically
#endif
CChatRoomDlgdlg(&curSocket);
m_pMainWnd=&dlg;
curSocket.SetDlg(&dlg);
intnResponse=dlg.DoModal();
if(nResponse==IDOK)
{//TODO:
Placecodeheretohandlewhenthedialogis
//dismissedwithOK
}
elseif(nResponse==IDCANCEL)
{//TODO:
Placecodeheretohandlewhenthedialogis
//dismissedwithCancel
}
returnFALSE;
}
4.需要在默认建立的主对话框上删除已有控件。
聊天室客户端窗口对话框中的控件可以按表5-2建立。
表5-2聊天室客户端控件属性表
控件
属性
属性值
控件成员变量
变量类型
标签
Caption
昵称
编辑框
m_IDC_EDIT_MESSAGE
CString
标签
Caption
聊天室IP
编辑框
m_IDC_EDIT_ADDRESS
CString
按钮
Caption
连接聊天服务器
ID
Connect_Button
编辑框
m_IDC_EDIT_MESSAGE
CString
列表框
ID
IDC_LIST1
m_ChatList
CListBOX
GroupBox
Caption
在线用户列表
列表框
ID
IDC_USER
m_USER
CListBOX
复选框
ID
IDC_CHECK1
m_SL
BOOL
按钮
Caption
发送信息
m_BNSend
CButton
ID
Send_Button
按钮
Caption
离开聊天室
m_BNExit
CButton
ID
Exit_Button
其中m_IDC_EDIT_MESSAGE是发送信息框。
修改对话框ChatRoomDlg的构造函数以及添加一个指向连接套接字的myServerSocket成员变量。
//ChatRoomDlg.h:
headerfile
#include"ClientSocket.h"
classCChatRoomDlg:
publicCDialog
{
//Construction
public:
BOOLGetMessage();
CChatRoomDlg(CClientSocket*tmp,CWnd*pParent=NULL);
CClientSocket*myServerSocket;
//DialogData
//{{AFX_DATA(CChatRoomDlg)
enum{IDD=IDD_CHATROOM_DIALOG};
CButtonm_BNExit;
CButtonm_BNSend;
CListBoxm_IDC_LIST_CHATBOX_CONTROL;
CListBoxm_USER;
CStringm_IDC_EDIT_MESSAGE;
CStringm_IDC_EDIT_ADDRESS;
CStringm_IDC_EDIT_NIKENAME;
BOOLm_SL;
//}}AFX_DATA
……
};
5.对话框类中的函数
聊天客户端CChatRoomDlg对话框初始化OnInitDialog()函数中添加代码实现“发送信息”按钮状态为无效;“离开聊天室”按钮状态为无效。
添加客户端窗口的“连接服务器”按钮响应响应函数OnConnectButton()。
它处理网络连接,如果连接服务器成功,发送成功登陆者昵称给服务器端接收,服务器端判断NEW_USER,知道新用户登陆,将更新在线用户列表字符串后,转发给各个客户端中显示。
添加客户端窗口的“发送信息”按钮单击响应函数OnButton1()。
它首先判断私聊复选框是否选中,如果选中则要保证选择私聊对象,将发出的信息以“PrivChat|+私聊对象+|登陆昵称+悄悄对+私聊对象+说+发送信息框的容”的形式发给服务器端。
服务器端判断首为PrivChat从而知道按私聊信息处理。
如果未选中,则不含自定义格式。
仅仅以“登陆昵称+说+发送信息框的容”的形式发给服务器端。
添加聊天室客户端窗口“退出聊天室”按钮的单击响应函数OnButton2()。
它首先发送断开信息“CLOSEUSE|登陆昵称”后,关闭对话框。
添加聊天室客户端窗口对话框的成员函数GetMessage()。
它通过调用连接套接字的Receive()接收服务器端信息,根据细化聊天室程序通信规程来显示聊天信息或更新在线用户列表。
//ChatRoomDlg.cpp:
implementationfile
#include"stdafx.h"
#include"ChatRoom.h"
#include"ChatRoomDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
CClientSocketcurSocket;
CChatRoomDlg:
:
CChatRoomDlg(CClientSocket*tmp,CWnd*pParent)
:
CDialog(CChatRoomDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CChatRoomDlg)
m_IDC_EDIT_MESSAGE=_T("");
m_IDC_EDIT_ADDRESS=_T("127.0.0.1");
m_IDC_EDIT_NIKENAME=_T("");
m_SL=FALSE;
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
myServerSocket=tmp;
}
BOOLCChatRoomDlg:
:
OnInitDialog()
{
//………..
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
m_BNSend.EnableWindow(FALSE);//"发送信息"按钮状态为无效
m_BNExit.EnableWindow(FALSE);//"离开聊天室"按钮状态为无效
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCChatRoomDlg:
:
OnConnectButton()//“连接服务器”按钮响应函数
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
char*nikename,*address;
intn;
if(!
myServerSocket->Create())
{
myServerSocket->Close();
AfxMessageBox("网络创建错误!
!
");
return;
}
n=m_IDC_EDIT_ADDRESS.GetLength();
address=newchar(n+1);
sprintf(address,"%s",m_IDC_EDIT_ADDRESS.GetBuffer(n));
address[n]=0;
n=m_IDC_EDIT_NIKENAME.GetLength();
nikename=newchar(n+1);
sprintf(nikename,"%s",m_IDC_EDIT_NIKENAME.GetBuffer(n));
nikename[n]=0;
if(!
myServerSocket->Connect(address,6767))
{
myServerSocket->Close();
AfxMessageBox("网络连接错误,请检查服务器地址。
");
return;
}
m_BNSend.EnableWindow(TRUE);//"发送信息"按钮状态为有效
m_BNExit.EnableWindow(TRUE);//"离开聊天室"按钮状态为有效
myServerSocket->NikeName=nikename;
//*********************发送新用户昵称
charmessage2[20];
strcpy(message2,"NEW_USER|");
strcat(message2,myServerSocket->NikeName);
if(myServerSocket->Send(message2,20))
{
}
else
{
AfxMessageBox("网络传输错误!
!
!
");
}
}
voidCChatRoomDlg:
:
OnButton1()//发送按钮的函数
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intn;
charmessage[1000];
CStringto_name;
UpdateData(TRUE);
if(m_SL==TRUE)//私聊
{
if(m_USER.GetCurSel()>=0)
{
m_USER.GetText(m_USER.GetCurSel(),to_name);
m_IDC_EDIT_MESSAGE=myServerSocket->NikeName+"悄悄对"+to_name+"说"+m_IDC_EDIT_MESSAGE;
m_IDC_LIST_CHATBOX_CONTROL.AddString(m_IDC_EDIT_MESSAGE);
m_IDC_EDIT_MESSAGE="PrivChat|"+to_name+"|"+m_IDC_EDIT_MESSAGE;
n=m_IDC_EDIT_MESSAGE.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 聊天室 程序 系统 方案