面向对象高级程序设计——聊天程序,客户端

上传人:ji****72 文档编号:45557791 上传时间:2018-06-17 格式:PDF 页数:14 大小:390.85KB
返回 下载 相关 举报
面向对象高级程序设计——聊天程序,客户端_第1页
第1页 / 共14页
面向对象高级程序设计——聊天程序,客户端_第2页
第2页 / 共14页
面向对象高级程序设计——聊天程序,客户端_第3页
第3页 / 共14页
面向对象高级程序设计——聊天程序,客户端_第4页
第4页 / 共14页
面向对象高级程序设计——聊天程序,客户端_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《面向对象高级程序设计——聊天程序,客户端》由会员分享,可在线阅读,更多相关《面向对象高级程序设计——聊天程序,客户端(14页珍藏版)》请在金锄头文库上搜索。

1、中南大学 课程设计报告课程设计报告 题 目 服务器端聊天程序 学生姓名 谢 伟 学 号 1304120306 专业班级 应数 1201 指导老师 陈 明 数学数学与统计学院与统计学院 基于基于 MFCMFC 的的服务器端的服务器端的聊天程序的设计与实现聊天程序的设计与实现 1 1 摘要摘要 基于网络聊天应用的普及,本文采用 VC+2010 为开发平台,采用 MFC 控件设计聊天程序的对话框,利用 CSocket 实现一个基于 TCP实现一个仿 QQ 聊天程序。 程序运行良好, 可实现程序要达到的目的。 关健字 VC+2010;MFC;CSocket;聊天程序;实时通信 2 2 背景背景 在互联

2、网技术发达,信息交互越来越便捷的今天,可以实现即时通讯的聊天工具广泛地应用于人们的网络生活。 本文就是以VC+2010为平台, 采用MFC控件设计聊天程序的对话框, 以CSocket类为基础,实现基于 TCP 的点对点聊天工具。本聊天工具通过输入服务器端的IP 地址将客户端和服务器端连在一起,实现两者间的实时通信。 3 3 原理介绍原理介绍 VC+是 Microsoft 公司开发的一种基于 C/C+语言的集代码编辑、编译、连接、调试等功能与一体的工具。MFC(Microsoft Foundation Classes)是在 VC+平台下,以 C+类的形式封装了 Windows 的 API,MFC

3、 中的各种类结合起来构成了一个应用程序框架,这个框架定义了应用程序的轮廓、提供了用户接口的标准实现方法。 Socket 又称为套接字,是网络通信的基本构件。它由一个短整数表示,即一个句柄,代表网络协议中的一组数据,该数据包含了通信双方的 IP 地址和当前的连接状态等信息,它可以通过这个端口与任何一个具有 Socket 接口的计算机通信。 4 4 服务器端应用程序设计服务器端应用程序设计 (1)创建一个基于对话框的应用程序,名称 NetChatServer, 确定。 (2)在应用程序开始的时候,先应该初始话 winSock 库,所以便会用到下面的一个函数。 BOOBOOL L AfxSocket

4、Init( WSADATA* lpwsaData = NULL ); /用来初始化 Socket,用 WSAStartup();来初始化,在应用程序结束时他会自动调用 WSACleanup() 在开始编程之前,应该调用这个函数,对 Socket 进行初始化。如果初始化成功返回非 0 ,否则返回 0。这个函数只能在自己应用程序的 CXXWinApp:InitInstanceCXXWinApp:InitInstance 中初始化.在初始化前还要记得加入头文件 Afxsock.h, 我的服务器端程序为 NetChatServer 所以我在的 CNetChatServerApp:InitInstanc

5、e()中加入: if(!AfxSocketInit() AfxMessageBox(_T(“Socket 库初始化出错!“); return false; m_iSocket 是一个 CServerSocket*的指针,CServerSocket 类是一个继承于 CSocket 类,在后面给出相应代码。 m_iSocket = new CServerSocket(); / 1.动态创建一个服务器 Socket 对象。 if(!m_iSocket) AfxMessageBox(_T(“动态创建服务器套接字出错!“); return false; 接着创建套接字: if(!m_iSocket-Cr

6、eate(8989) AfxMessageBox(_T(“创建套接字错误!“); m_iSocket-Close(); return false; 其中 8989 是指定的端口号, 但是要注意在保存指定的 8989 端口前,这个端口是空闲的没有被其他进程所占用, 那怎么查看端口是否被其他进程占用呢?首先打开 cmd 键入 netstat aon,会看到所有的TCP/UDP 信息 ,但是由于太多了不好查看,所以,我们再在最下面 tasklist|find “8989”,没有找到任何和 8989 端口相关的东西,所以说明 8989 端口没有被占用。创建了套接字以后按照 win32 的步骤我们就应该

7、对 bind 端口,但是 MFC 不这样,应为 MFC 的 Create内部已经调用了 bind ,如下是 MFC 的底层代码: BOOL CAsyncSocket:Create(UINT nSocketPort, int nSocketType,long lEvent, LPCTSTR lpszSocketAddress) if (Socket(nSocketType, lEvent) if (Bind(nSocketPort,lpszSocketAddress)/调用了 bind return TRUE; int nResult = GetLastError(); Close(); WSA

8、SetLastError(nResult); return FALSE; 所以我们不用在调用 bind 了,直接对套接字进行监听: if(!m_iSocket-Listen() AfxMessageBox(_T(“监听失败!“); m_iSocket-Close(); return false; (3)然后重载 ExitInstance,退出时对进行清理: int CNetChatServerApp:ExitInstance() if(m_iSocket) delete m_iSocket; m_iSocket = NULL; return CWinApp:ExitInstance(); (4

9、)下面来看下 CServerSocket 的具体实现,在原项目下面添加CSocket 类的 MFC 项目: #pragma once #include “ClientSocket.h“ class CServerSocket : public CSocket public: CServerSocket(); virtual CServerSocket(); public : CPtrList m_listSockets;/用来保存服务器与所有客户端连接成功后的 ClientSocket public : virtual void OnAccept(int nErrorCode); ; #inc

10、lude “stdafx.h“ #include “NetChatServer.h“ #include “ServerSocket.h“ CServerSocket:CServerSocket() CServerSocket:CServerSocket() void CServerSocket:OnAccept(int nErrorCode) /接受到一个连接请求 CClientSocket* theClientSock(0); theClientSock = new CClientSocket( if(!theClientSock) AfxMessageBox(_T(“内存不足,客户连接服务

11、器失败!“); return; Accept(*theClientSock); /加入 list 中便于管理 m_listSockets.AddTail(theClientSock); CSocket:OnAccept(nErrorCode); 在这里必须重载 OnAccept(int nErrorCode)函数,CServerSocket才能接收到客户端的请求,并且必须在 OnAccept 中调用 Accept()函数对连接请求进行响应。在 OnAccept()我们用一个 List 将ClientSocket 指针保存,以便以后调用访问。 可以看到在 CServerSocket 中 又出现了

12、一个 CClientSocket 的类,这个类和 CServerSocket 一样,也是派生于 CSocket 类,但是专门用于客户端的 Socket。 (5)CClientSocket 类的具体实现: #pragma once #include “stdafx.h“ class CClientSocket : public CSocket public: CClientSocket(CPtrList* pList); virtual CClientSocket(); public: CPtrList* m_pList;/保存服务器 ClientSocket 中 List 的东西,这个是中 C

13、ServerSocket 中传过来的 CString m_strName; /连接名称 public: virtual void OnClose(int nErrorCode); virtual void OnReceive(int nErrorCode); void OnLogoIN(char* buff,int nlen);/处理登录消息 void OnMSGTranslate(char* buff,int nlen);/转发消息给其他聊天群 CString UpdateServerLog();/服务器端更新、记录日志 void UpdateAllUser(CString strUserI

14、nfo);/更新服务器端的在线人员列表 private: BOOL WChar2MByte(LPCWSTR srcBuff, LPSTR destBuff, int nlen);/多字节的转换 ; 可以看到重载了 OnClose()、OnReceive()函数,这样当套接字关闭、有数据到达时,就会自动调用这两个函数,我们便可以在这两个函数中响应、处理事件。由于本人使用的是 VS2010,并且采用的Unicode 编码,所以,经常要涉及 Unicode 转多字节的情况,于是就写了 WChar2MByte()进行转换: #include “stdafx.h“ #include “NetChatSe

15、rver.h“ #include “ClientSocket.h“ #include “Header.h“ #include “NetChatServerDlg.h“ CClientSocket:CClientSocket(CPtrList* pList) :m_pList(pList),m_strName(_T(“) CClientSocket:CClientSocket() void CClientSocket:OnReceive(int nErrorCode) /有消息接收 /先得到信息头 HEADER head; int nlen = sizeof HEADER; char *pHead = NULL; pHead = new charnlen; if(!pHead) TRACE0(“CClientSocket:OnReceive 内存不足!“); return; memset(pHead,0, sizeof(char)*nlen ); Receive(pHead,nlen); head.type = (LPHEADER)pHead)-type; head.nContentLen = (LPHEADER)pHead)-nContentLen; delete pHead; pHead = NULL; /再次接收,这次是数据类容 p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号