基于mfc的简易聊天室内容摘要:

OnInitDialog。 在所有对话框控件建立且在对话框显示之前,调用OnInitDialog。 在模态对话框与非模态对话框执行的任意时刻都可以调 CWnd::UpdateData。 如果要手工创建对话框,应为对话框派生类添加必需的成员变量,并添加已获得数据值的成员函数。 关于 ClassWizard 的更多信息,请参阅联机文档 “Visual C++程序员指南 ”中的 “使 第 5 页 用 ClassWizard”。 当用户按下 OK 或 Cancel 按钮,或者调用 EndDialog 时,模态对话框自动关闭。 CAsyncsocket 类和 CSocket 类 Cssyncsocket 类一个异步非阻塞 Socket 类封装类 , CasyncSocket::Create()有一个参数指明了你想要处理那些 Socket 事件 , 你关心的事件被指定以后 , 这个 Socket 默认就被用做了异步方式 .的函数 ,除了一个以外 , 在创建了一个 CSocketWnd 窗口对象 ,使 WSAAsyncSlecet()将这个 SOCKET 与该窗口对象关联 ,以让该窗口对象处理来自 Socket 的事件 (消息 ), 然而CSocketWnd 收到 Socket 事件之, 只是简单地回 CasyncSocket::OnReceive()等虚函数。 所以CAsyncSocket 的派生类 , 只需要在这些虚函数里添加发送和接收的代 码。 CSocket 是 MFC CAsyncSocket 基础上派生的一个同步阻塞 Socket 的封装类。 构造一个 CAsyncSocket 对象并使用该对象创建基础 SOCKET 句柄 [2]。 套接字的创建遵循两阶段构造的 MFC 模式。 例如 : CAsyncSocket sock。 ( )。 // Use the default parameters CAsyncSocket* pSocket = new CAsyncSocket。 int nPort = 27。 pSocket Create( nPort, SOCK_DGRAM )。 上面的第一个构造函数在堆栈上创建一 个 CAsyncSocket 对象,第二个构造函数在堆上创建 CAsyncSocket。 上面的第一个 Create 调用使 用默认参数创建流式套接字,第二个 Create 调用创建具有指定端口和地址的数据文报套接字。 任一个 Create 版本都可以和任一种构造方法一起使用。 Create 的参数有: ○ 1 “ 端口 ” :短整型。 对于服务器套接字,必须指定端口。 对于客户端套接字,通常接受此参数的默认值,该值允许 Windows Sockets 选择端口。 ○ 2 套接字类型: SOCK_STREAM(默认值)或 SOCK_DGRAM。 套接字“地址”,如“ ”或“ ”。 该地址为网络上的网际协议 (IP) 地址。 很可能要始终依赖此参数的默认值。 如果套接字是客户端,则使用 CAsyncSocket::Connect 将此套接字对象连接到服务器套接字。 如果套接字是服务器,则将套接字设置为开始侦听 ( 使用 CAsyncSocket::Listen) 来自客户端的连接尝试。 接收到连接请求时,用 CAsyncSocket::Accept 接受该请求。 接受连接后,可以执行验证密码等任务。 注意 Accept 成员函数采用对新的 空 CSocket 对象的引用作为它的参数。 在调用 Accept 之前,必须构造该对象。 如果此套接字对象超出范围,则连接关闭。 不要对这个新套接字对象调用 Create。 有关示例,请参见文章 Windows Sockets: 操作顺序。 通过调用 CAsyncSocket 对象的封装 Windows Sockets API 函数的成员函数,与其他套接字进行通信。 如果在堆栈上创建了套接字对象,当包含函数超出范围时将调用此对象的析构函数。 如果使用 new 运算符在堆上创建了套接字对象,则您必须负责使用 delete 运算符销毁此对象。 析构函数在销毁对象之前调用对象的 Close 成员函数。 有关代码中该顺序的示例(实际上是对于 CSocket 对象) ,请参见 Windows Sockets:操作顺序 [1], 您对 CAsyncSocket 的责任。 创建 CAsyncSocket 类的对象后,该对象封装 Windows SOCKET 句柄并提供对此句柄的操作。 使用 CAsyncSocket 时,如果您直接使用 API,则必须处理可能面对的所有问题。 第 6 页 例如:“阻塞”方案;发送和接收计算机之间的字节顺序差异;在 Unicode 和多字节字符 集(MBCS)字符串之间转换。 利用 CSocket 进行有连接的通信 微软的 MFC 把复杂的 WinSock API 函数封装到类里,这使得编写网络应用程序更容易。 CAsyncSocket 类逐个封装了 WinSock API,为高级网络程序员 提供了更加有力而灵活的方法。 这个类基于程序员了解网络通讯的假设,目的是为了在 MFC 中使用 WinSock,程序员有责任处理诸如阻塞、字节顺序和在 Unicode 与 MBCS 间转换字符的任务。 为了给程序员提供更方便的接口以自动处理这些任务, MFC 给出 了 CSocket 类,这个 类是由CAsyncSocket 类继承下来的,它提供了比 CAsyncSocket 更高层的 WinSock API 接口。 Csocket 类和 CsocketFile 类可以与 Carchive 类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。 CSocket 对象提供阻塞模式,这对于 Carchive 的同步操作是至关重要的。 阻塞函数(如 Receive()、 Send()、 ReceiveFrom()、 SendTo() 和 Accept()) 直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用 CasyncSock 类;如果需要方便,则可使用 Csocket 类。 使用 CSocket 对象涉及 CArchive 和 CSocketFile 类对象。 以下介绍的针对字节流型套接字的操作步骤中,只有第 3 步对于客户方和服务方操作是不同的,其他步骤都相同。 ( 1) 造一个 CSocket 对象。 ( 2) 使用这个对象的 Create() 成员函数产生一个 socket 对象。 在客户方程序中,除非需要数据报套接字, Create() 函数一般情况下应该使用默认参数。 而对于服务方程序,必须在调用 Create 时指定一个端口。 需要注意的是, Carchive 类对象不能与数据报 ( UDP)套接字一起工作,因此对于数据报套 接字, CAsyncSocket 和 CSocket 的使用方法是一样的。 ( 3) 如果是客户方套接字,则调用 CAsyncSocket ∷ Connect() 函数与服务方套接字连接;如果是服务方套接字,则调用 CAsyncSocket∷ Listen() 开始监听来自客户方的连接请求,收到连接请求后,调用 CAsyncSocket∷ Accept() 函数接受请求,建立连接。 请注意 Accept() 成员函数需要一个新的并且为空的 CSocket 对象作为它的参数,解释同上。 ( 4) 产生一个 CSocketFile 对象,并把它与 CSocket 对象关联起来。 ( 5) 为接收和发送数据各产生一个 CArchive 对象,把它们与 CSocketFile 对象关联起来。 切记 CArchive 是不能和数据报套接字一起工作的。 ( 6) 使用 CArchive 对象的 Read( )和 Write() 等函数在客户与服务方传送数据。 ( 7) 通讯完毕后,销毁 CArchive、 CSocketFile 和 CSocket 对象。 3 详细设计 我们利用 WinSocket 实现一个 网络聊天室。 需要一个聊天服务器,它可以和很多客户端进行通信,从而把来自不同的客户的聊天信息转交到所有其他的客户端。 这样就形成了一个采用 Client/Server 结构的并可以多人同时在线的聊天室。 客户端的实现 ( 1)首先启动 Visual C++ ,利用 MFC AppWizard[EXE]建立一个新的 MFC 工程 ,工程名为 tcpclient,在 MFC AppWizard Step1 的时候选择 Dialog based 即基于对话框,在 Step4时勾选 Windows Sockets 选项 (如图 3) ,其他 默认值下一步。 第 7 页 图 3 MFC的设置 ( 2) 客户端主要分为三个窗口,第一个是连接窗口,需要输入连接到服务器的相关设置信息;第二个是聊天信息显示窗口,该窗口显示登录服务器以来发送和接收到的消息;第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送。 新建一个对话框,并添加各种控件(见控件表 1)如图 4: 图 4 聊天窗口布局 第 8 页 表 1 控件类型及各自 ID 标题 控件类型 控件 ID 连接 Static IDC_STATIC 信息区 Static IDC_STATIC 我的 ID: Static IDC_STATIC 服务器 ID: Static IDC_STATIC 端口号(默认 520) Static IDC_STATIC 连接服务器 Button IDC_con 发送(回车) Button IDC_send 编辑框 1 Edit IDC_EDIT1 编辑框 2 Edit IDC_EDIT2 编辑框。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。