网络应用实践简单聊天软件.docx
- 文档编号:29313215
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:21
- 大小:60.47KB
网络应用实践简单聊天软件.docx
《网络应用实践简单聊天软件.docx》由会员分享,可在线阅读,更多相关《网络应用实践简单聊天软件.docx(21页珍藏版)》请在冰豆网上搜索。
网络应用实践简单聊天软件
网络应用实践
课程设计报告书
课题简单聊天软件
班级网络工程10-2班
姓名XXX
学号08103635
一、基本介绍
1、分组名单、各成员分工
颜莘城(08103635)
2、题目名称及基本规划书
简单聊天软件
首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。
3、目标描述(对系统目标的概要描述)
服务器端:
1、能够正确地、无冲突地启动服务器。
2、监听端口,等待用户的连接。
3、建立与客户端的逻辑连接,并能发出通知。
4、向新进入的好友发出已上线名单。
5、接收客户端的消息请求,并能正确无误地处理消息,并能发出消息到客户端。
6、及时地反映发出地消息和聊天消息。
7、能够查看和用户的聊天记录。
8、当好友断开与服务器端地连接时,服务器能够正确地断开连接。
9、当用户违反聊天系统规定时,服务器系统管理员能够断开与此用户的连接。
10、当服务器关闭时,应通知所有用户。
客户端:
1、能够正确启动应用程序,并能向服务器发出连接请求。
2、反映当前在线情况。
3、能够点对点的发出消息。
4、能够及时接收好友发出消息,并通知用户。
5、能够正确地断开与服务器端地的连接。
二、模块设计
三、概要设计
1、概述
A、编写目的
本概要设计说明书编写的目的在于全面说明即时聊天工具系统第一阶段中的设计考虑,包括程序系统的基本处理流程。
B、背景
a.本软件名称为“简单聊天软件”;
b.本软件暂时不同其他系统或其他聊天软件产生相互来往关系。
c.本软件主要用于局域网内的用户,使聊天更方便快捷。
2、可行性分析
运行环境主要包括开发软件和操作系统的选择。
简单聊天系统的软件配置要根据用户对系统的稳定性要求、系统的容量以及用户的维护水平来确定。
A、开发软件选择
VisualC++6.0。
B、操作系统选择
可以根据用户量的大小选择不同的操作系统。
当然,一般情况下,维护人员对微软Windows界面比较熟悉,因此,客户端和服务器端都使用Windows操作系统。
C、输出设备
显示器
D、其他
Intelcore全系列、AMD全系列PC机;
运行时占用内存:
≤1MB;
所需硬盘空间:
≤5MB;
系统平台:
中文Windows9X,NT,2000,XP,VISTA,WIN7.WIN8等
3、需求分析
即时通讯系统内容
系统名称
模块
功能
即时聊天系统
客户端管理
连接服务器,即时聊天,断开连接
服务器管理
接受连接,接收消息,发送消息,记录聊天记录,显示连接状态,断开连接
系统的客户端在Windows平台下运行,服务器端也在Windows平台下运行。
系统需要有较好的安全性和可扩展性,并提供简洁方便的图形用户界面。
4、总体设计
A、模块设计图
详见二、模块设计
B、模块设计分析
(1)服务器端
a、配置服务器:
提供服务器IP和端口号,便于客户端进行连接;
b、完成连接:
接收到来自客户端的连接请求,完成连接;
c、即时聊天:
与客户端实现点对点聊天;
d、聊天记录:
保存聊天记录,以便查看;
e、断开连接:
聊天结束,断开与客户端的连接。
(2)客户端
a、完成连接:
发送连接请求到服务器,等待服务器回应,完成连接;
b、即时聊天:
与服务器实现点对点聊天;
c、断开连接:
聊天结束,断开与服务器的连接。
5、数据字典
A、数据元素
数据项名
数据项含义
类型
长度
MeberRole
客户端角色
varchar
20
MeberMagnage
服务器管理员
varchar
20
Key
连接验证
varchar
20
LastLogTime
连接时间
varchar
20
ChatRecord
聊天记录
varchar
20
MemberState
用户状态
bit
B、数据流
数据流
简述
来源
去向
连接请求
客服端发起连接
用户
服务器
连接应答
服务器确认
服务器
确认连接
聊天信息
用户聊天信息
用户
聊天记录
读写信息
对数据库的相关操作
相关操作
数据库
断开连接
聊天结束,断开连接
客户端/服务器
服务器/客户端
C、数据存储
文件名
简述
文件组成
写文件的加工
读文件的加工
连接信息
存储连接信息
用户信息
更新用户信息
无
服务信息
存储人员使用服务的信息
服务信息
更新服务信息
无
四、详细设计
服务器端:
-----------接受来自客户端的连接请求,并发送回执给客户端—“你好,我是服务器!
”
voidCSeverDlg:
:
OnAccept()
{
Sock.Accept(Slist);
m_message="你好,我是服务器!
";----------回执信息“你好,我是服务器!
”
UpdateData(false);
OnSend();
}
----------将会话初始化
BOOLCSeverDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();---------------加入“关于...”系统菜单的菜单项。
--------------------------------------------------IDM_ABOUTBOX必须在系统命令范围内。
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);--------------------------设置大图标
SetIcon(m_hIcon,FALSE);-------------------------设置小图标
-----------------------------------------------------------添加额外的初始化
t=this;
m_IP="localhost";
m_sort=80;
UpdateData(false);
if(!
Sock.Create(m_sort))
MessageBox("套接字创建失败!
");
if(!
Sock.Listen())
MessageBox("监听失败!
");
returnTRUE;-----------------------------------------返回TRUE,除非将焦点设置到控制
}
-----------接收来自客户端的消息
voidCSeverDlg:
:
OnReceive()
{
charbuf[32];
intn;
n=Slist.Receive(buf,sizeof(buf),0);---------------返回成功接收的字节数
buf[n]='\0';
CStringS;
S.Format("%s",buf);
if(S=="@#$")
{
memset(buf,0,sizeof(buf));
for(inti=0;i<100;i++)
{
srand((unsigned)time(NULL));
RECTrect;
this->GetWindowRect(&rect);
intx=rand()%5;
inty=rand()%5;
RECTr;
r.bottom=rect.bottom+x;
r.top=rect.top+y;
r.left=rect.left+x;
r.right=rect.right+y;
this->MoveWindow(&r);
this->MoveWindow(&rect);
}
return;
}
if(S=="断开了!
")------------------------------如果通信断开
Slist.Close();-----------------------------关闭会话
else
{
CTimeT1,T2;
CStringstr;
T1=T2.GetCurrentTime();
str.Format("%d/%d/%d%d:
%2d",T1.GetYear(),T1.GetMonth(),T1.GetDay(),T1.GetHour(),T1.GetMinute());----------------------------------------------这里%d是十进制数,表示整型值
m_MESSAGE.InsertString(m_MESSAGE.GetCount(),str);
------------Message类构造函数Message接受一个str,str是Message 的private成员
m_MESSAGE.InsertString(m_MESSAGE.GetCount(),buf);
------------Message类构造函数Message接受一个buf,buf是Message 的private成员
memset(buf,0,sizeof(buf));--------------将buf中所有内容初始化为0
}
}
-----------发送消息给客户端
voidCSeverDlg:
:
OnSend()
{
UpdateData(true);
Slist.Send(m_message,m_message.GetLength(),0);
------------------------------------------------------传递信息的方法(基于自定义消息SendMessage)
if(m_message=="@#$")
return;
if(m_message.GetLength()!
=0)
{
CTimeT1,T2;
CStringstr;
T1=T2.GetCurrentTime();
str.Format("%d/%d/%d%d:
%2d",T1.GetYear(),T1.GetMonth(),T1.GetDay(),T1.GetHour(),T1.GetMinute());--------------------------和接收消息一样,%d是十进制数,表示整型值
m_MESSAGE.InsertString(m_MESSAGE.GetCount(),str);
------------Message类构造函数Message接受一个str,str是Message 的private成员
m_MESSAGE.InsertString(m_MESSAGE.GetCount(),m_message);
------------Message类构造函数Message接受一个传输的Message
m_message.Empty();
UpdateData(false);
}
}
----------绘制服务器的界面
voidCSeverDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);-----------------------------------绘画的设备上下文
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);
}
else
{
CDialog:
:
OnPaint();
}
}
----------------------------------------------------------------------系统调用此函数取得光标显示当用户拖动
----------------------------------------------------------------------最小化的窗口。
HCURSORCSeverDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
-----------断开与客户端的连接
voidCSeverDlg:
:
OnDUANKAI()
{
--------------------------------------------------------------------添加控件通知处理程序代码
CStrings;
s="抱歉!
服务器已关闭,不能通信!
";----------服务器关闭,断开通信
Slist.Send(s,s.GetLength(),0);
Sock.Close();
Slist.Close();
CDialog:
:
OnOK();
}
软件服务器界面
客户端:
---------请求与服务器的连接
voidCClientDlg:
:
OnConnect()
{
if(!
Sock.Connect(m_ip,m_sort))
return;
}
---------待服务器确认连接后,连接成功,并发送回执给服务器—“你好,我是客服端!
”
voidCClientDlg:
:
OnButton2()
{
-----------------------------------------------------------------------------添加控件通知处理程序代码
UpdateData(true);
m_message="你好,我是客服端!
";----------------------回执信息“你好,我是客服端!
”
UpdateData(false);
OnConnect();
GetDlgItem(IDC_BUTTON2)->EnableWindow(false);
}
----------将会话初始化
BOOLCClientDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
----------------------------------------------------------------------加入“关于...”系统菜单的菜单项。
----------------------------------------------------------------------IDM_ABOUTBOX必须在系统命令范围内。
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);-------------------设置大图标
SetIcon(m_hIcon,FALSE);------------------设置小图标
----------------------------------------------------------添加额外的初始化
t=this;
m_ip="localhost";
m_sort=80;
UpdateData(false);
if(!
Sock.Create())
MessageBox("套接字创建失败!
");
returnTRUE;returnTRUE;----------------返回TRUE,除非将焦点设置到控制
}
-----------发送消息给服务器
voidCClientDlg:
:
OnSend()
{
----------------------------------------------------------添加控件通知处理程序代码
UpdateData(true);
Sock.Send(m_message,m_message.GetLength(),0);
CTimeT1,T2;
CStringstr;
T1=T2.GetCurrentTime();
str.Format("%d/%d/%d%d:
%2d",T1.GetYear(),T1.GetMonth(),T1.GetDay(),T1.GetHour(),T1.GetMinute());--------------------------和接收消息一样,%d是十进制数,表示整型值
m_MESSAGE.InsertString(m_MESSAGE.GetCount(),str);
------------Message类构造函数Message接受一个str,str是Message 的private成员
m_MESSAGE.InsertString(m_MESSAGE.GetCount(),m_message);
------------Message类构造函数Message接受一个传输的Message
m_message.Empty();
UpdateData(false);
}
----------接收来自服务器的消息
voidCClientDlg:
:
OnReceive()
{
charbuf[32];
intn=Sock.Receive(buf,sizeof(buf),0);---------------返回成功接收的字节数
buf[n]='\0';
charb[]="@#$";
for(inti=0;strlen(b)==strlen(buf)&&i if(b[i]! =buf[i]) break; if(i>=strlen(b))----------strlen计算字符串的长度,以结束符0x00为字符串结束 { for(inti=0;i<100;i++) { srand((unsigned)time(NULL)); RECTrect; this->GetWindowRect(&rect); intx=rand()%5; inty=rand()%5; RECTr; r.bottom=rect.bottom+x; r.top=rect.top+y; r.left=rect.left+x; r.right=rect.right+y; this->MoveWindow(&r); this->MoveWindow(&rect); } return; } CTimeT1,T2; CStringstr; T1=T2.GetCurrentTime(); str.Format("%d/%d/%d%d: %2d",T1.GetYear(),T1.GetMonth(),T1.GetDay(),T1.GetHour(),T1.GetMinute());;----------------------------------------------这里%d是十进制数,表示整型值 m_MESSAGE.InsertString(m_MESSAGE.GetCount(),str); ------------Message类构造函数Message接受一个str,str是Message 的private成员 m_MESSAGE.InsertString(m_MESSAGE.GetCount(),buf); ------------Message类构造函数Message接受一个buf,buf是Message 的private成员 memset(buf,0,sizeof(buf));--------------将buf中所有内容初始化为0 } } ----------绘制客户端界面 voidCClientDlg: : OnPaint() { if(IsIconic()) { CPaintDCdc(this);-------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 应用 实践 简单 聊天 软件