简单的局域网聊天程序试验报告.docx
- 文档编号:30250909
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:12
- 大小:104.70KB
简单的局域网聊天程序试验报告.docx
《简单的局域网聊天程序试验报告.docx》由会员分享,可在线阅读,更多相关《简单的局域网聊天程序试验报告.docx(12页珍藏版)》请在冰豆网上搜索。
简单的局域网聊天程序试验报告
青岛理工大学
C++面向对象课程设计报告
院(系):
计算机工程学院
专业:
软件工程
学生姓名:
__
班级:
__软件102 学号:
201007190
题目:
_局域网聊天程序________
起迄日期:
_2012.6.18~2012.6.29
设计地点:
计算机学院机房
指导教师:
完成日期:
2012年6月29日
课程设计报告内容(供参考)
一、需求分析当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。
在网络早期就开始盛行,不论是BBS,IRC都有类似网上聊天室的机制。
聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。
聊天室适用于网上会议或闲聊的一些场合。
聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。
聊天室的设计目标
本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为:
服务器端功能:
1、初始化socket,创建服务器端。
2、维护一个链表,保存所有用户的IP地址、端口信息。
3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。
4、接受用户传送来的连接判断命令,并向用户发出响应命令。
1.
二、设计内容
SOCKET连接过程
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
服务器监听,客户端请求,连接确认。
服务器监听:
是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:
是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:
是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
如何开发一个Server-Client模型的程序
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
1.
2.编写程序代码
客户端类:
classCClientSocket:
publicCSocket
{
//Attributes
private:
UINTm_nTimerID;
CChatDlg*m_pDlg;
//Operations
public:
CClientSocket(CChatDlg*pDlg);
virtual~CClientSocket();
//Overrides
public:
BOOLSetTimeOut(UINTuTimeOut);
BOOLKillTimeOut();
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CClientSocket)
public:
virtualvoidOnReceive(intnErrorCode);
virtualvoidOnClose(intnErrorCode);
virtualBOOLOnMessagePending();
voidCClientSocket:
:
OnReceive(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
charbuffer[BufferSize];
Receive(buffer,sizeof(buffer));
m_pDlg->ShowText(CString(buffer));
CSocket:
:
OnReceive(nErrorCode);
}
voidCClientSocket:
:
OnClose(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
PostMessage(m_pDlg->m_hWnd,WM_CLIENT_CLOSE,0,0);
CSocket:
:
OnClose(nErrorCode);
}
BOOLCClientSocket:
:
OnMessagePending()
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
MSGmsg;
if(PeekMessage(&msg,m_pDlg->m_hWnd,WM_TIMER,WM_TIMER,PM_NOREMOVE))
{
if(msg.wParam==m_nTimerID)
{
PeekMessage(&msg,m_pDlg->m_hWnd,WM_TIMER,WM_TIMER,PM_REMOVE);
CancelBlockingCall();
returnFALSE;
}
}
returnCSocket:
:
OnMessagePending();
}
BOOLCClientSocket:
:
SetTimeOut(UINTuTimeOut)
{
m_nTimerID=SetTimer(m_pDlg->m_hWnd,1,uTimeOut,NULL);
returnm_nTimerID;
}
BOOLCClientSocket:
:
KillTimeOut()
{
returnKillTimer(m_pDlg->m_hWnd,m_nTimerID);
}
CServerSocket:
:
CServerSocket(CChatDlg*pDlg)
{
m_pDlg=pDlg;
m_nMessageCount=0;
}
CServerSocket:
:
~CServerSocket()
{
}
//Donoteditthefollowinglines,whichareneededbyClassWizard.
#if0
BEGIN_MESSAGE_MAP(CServerSocket,CSocket)
//{{AFX_MSG_MAP(CServerSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif//0
/////////////////////////////////////////////////////////////////////////////
//CServerSocketmemberfunctions
服务器类
voidCServerSocket:
:
OnReceive(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
charbuffer[BufferSize];
Receive(buffer,sizeof(buffer));
if(m_nMessageCount==0)
{
CStringstr(buffer);
m_ClientName=str;
str+="上线!
";
m_pDlg->ShowText(str);
for(inti=0;i
{
if(m_pDlg->m_ServerSocket[i]!
=this)
{
m_pDlg->m_ServerSocket[i]->Send(str,str.GetLength()+1);
}
}
}
else
{
CStringstr;
str=m_ClientName+"说:
"+buffer;
m_pDlg->ShowText(str);
for(inti=0;i
{
if(m_pDlg->m_ServerSocket[i]!
=this)
{
m_pDlg->m_ServerSocket[i]->Send(str,str.GetLength()+1);
}
}
}
m_nMessageCount++;
CSocket:
:
OnReceive(nErrorCode);
}
voidCServerSocket:
:
OnClose(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CStringstr(m_ClientName);
str+="离线!
";
m_pDlg->ShowText(str);
for(inti=0;i
{
if(m_pDlg->m_ServerSocket[i]!
=this)
{
m_pDlg->m_ServerSocket[i]->Send(str,str.GetLength()+1);
}
else
{
m_pDlg->PostMessage(WM_CLIENT_CLOSE,i,0);
}
}
CSocket:
:
OnClose(nErrorCode);
}
建立服务器
连接服务器
进行聊天:
三、设计总结(可谈一谈本次课程设计的经验和体会)
通过对这个毕业设计的开发和学习,使自己对软件开发又有了新的理解,增加了自己的开发能力,也深刻理解了团队合作的精神。
本次开发,使我不仅学了 C++、数据结构、sql、winsock技术,还对网络编程进行了深入的学习,总结出了一些网络编程的特点,可以为今后的开发提供参考。
最后,要感谢老师对我的细心指导,同时感谢我的同学对我的宝贵建议。
四、参考文献
[1]DavidJ.Kruglinski,ProgrammingVisualC++.1998.
[2]施炜、李铮、秦颍,WindowsSockets规范和应用—Windows网络编程接口.
1996.
[3]AnthonyJonesandJimOhlumd,TCP/IP详解卷一:
协议(英文版).
机械工业出版社,2003.
[4]王罡林立志,基于Windows的TCP/IP编程.清华大学出版社,2002.
[5]蒋东兴等,WindowsSockets网络程序设计大全.清华大学出版社,1999.
五、附录
函数和变量名
注释
CAboutDlg
关于对话框的类
CChatApp
应用程序运行的基础
CChatDlg
主窗口
ONSEND
发送消息
ContentClient
连接服务器,判断是否连接到服务器
ONCLEAR
清除聊天记录
DoDataExchange
数据改变,改变列表中信息的显示用于更新列表中的信息
ONCONNECT
连接服务器
ONCANCEL
退出
Oncielentclose
关闭客户端
OnCloseLink
断开与已经建立连接的好友的连接
OnCtlColor
控件颜色处理,用于提示信息颜色的改变
OnInitDialog
对主界面进行一些初始化
ONSERVERCREATE
建立服务器
OnPaint
绘制界面窗口
OnserverClose
关闭服务器
OnSaveChatCont
保存聊天信息到文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 局域网 聊天 程序 试验报告