当前位置:文档之家› 简单的局域网聊天程序试验报告

简单的局域网聊天程序试验报告

青岛理工大学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.编写程序代码客户端类:class CClientSocket : public CSocket{// Attributesprivate:UINT m_nTimerID;CChatDlg* m_pDlg;// Operationspublic:CClientSocket(CChatDlg* pDlg);virtual ~CClientSocket();// Overridespublic:BOOL SetTimeOut(UINT uTimeOut);BOOL KillTimeOut();// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CClientSocket)public:virtual void OnReceive(int nErrorCode);virtual void OnClose(int nErrorCode);virtual BOOL OnMessagePending();void CClientSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base class char buffer[BufferSize];Receive(buffer, sizeof(buffer));m_pDlg->ShowText(CString(buffer));CSocket::OnReceive(nErrorCode);}void CClientSocket::OnClose(int nErrorCode){// TODO: Add your specialized code here and/or call the base class PostMessage(m_pDlg->m_hWnd, WM_CLIENT_CLOSE, 0, 0);CSocket::OnClose(nErrorCode);}BOOL CClientSocket::OnMessagePending(){// TODO: Add your specialized code here and/or call the base classMSG msg;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();return FALSE;}}return CSocket::OnMessagePending();}BOOL CClientSocket::SetTimeOut(UINT uTimeOut){m_nTimerID = SetTimer(m_pDlg->m_hWnd, 1, uTimeOut, NULL);return m_nTimerID;}BOOL CClientSocket::KillTimeOut(){return KillTimer(m_pDlg->m_hWnd, m_nTimerID);}CServerSocket::CServerSocket(CChatDlg* pDlg){m_pDlg = pDlg;m_nMessageCount = 0;}CServerSocket::~CServerSocket(){}// Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CServerSocket, CSocket)//{{AFX_MSG_MAP(CServerSocket)//}}AFX_MSG_MAPEND_MESSAGE_MAP()#endif // 0/////////////////////////////////////////////////////////////////////////////// CServerSocket member functions服务器类void CServerSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classchar buffer[BufferSize];Receive(buffer, sizeof(buffer));if (m_nMessageCount == 0){CString str(buffer);m_ClientName = str;str += " 上线!";m_pDlg->ShowText(str);for (int i = 0; i < m_pDlg->m_ServerSocket.size(); i++){if (m_pDlg->m_ServerSocket[i] != this){m_pDlg->m_ServerSocket[i]->Send(str, str.GetLength() + 1);}}}else{CString str;str = m_ClientName + " 说: " + buffer;m_pDlg->ShowText(str);for (int i = 0; i < m_pDlg->m_ServerSocket.size(); i++){if (m_pDlg->m_ServerSocket[i] != this){m_pDlg->m_ServerSocket[i]->Send(str, str.GetLength() + 1);}}}m_nMessageCount++;CSocket::OnReceive(nErrorCode);}void CServerSocket::OnClose(int nErrorCode){// TODO: Add your specialized code here and/or call the base classCString str(m_ClientName);str += " 离线!";m_pDlg->ShowText(str);for (int i = 0; i < m_pDlg->m_ServerSocket.size(); 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);}建立服务器连接服务器进行聊天:三、设计总结(可谈一谈本次课程设计的经验和体会)通过对这个毕业设计的开发和学习,使自己对软件开发又有了新的理解,增加了自己的开发能力,也深刻理解了团队合作的精神。

相关主题