网络聊天系统的设计与实现
4.1.2 服务器处理客户端信息进程/线程设计
我们应该充分利用多核的优势,这会是日后的发展方向。让每个进程要么处理大流量小计算量的工作;要么处理小流量大计算量的工作。这样多个进程放在一台物理机器上可以更加充分的利用机器的资源。
单线程多进程的设计,个人认为更能发挥多核的优势。这是因为没有了锁,每个线程都可以以最大吞吐量工作。增加的负担只是进程间的数据复制,在网游这种复杂逻辑的系统中,一般不会比逻辑计算更早成为瓶颈。如果担心,单线程没有利用多核计算的优势,不妨考虑以下的例子:
计算 a/b+c/d+e/f ,如果我们在一个进程中开三条线程利用三个核同时计算 a/b c/d e/f 固然不错,但它增加了程序设计的复杂度。而换个思路,做成三个进程,第一个只算 a/b 把结果交给第二个进程去算 c/d 于之的和,再交个第三个进程算 e/f 。对于单次运算来算,虽然成本增加了。它需要做额外的进程间通讯复制中间结果。但,如果我们有大量连续的这样的计算要做,整体的吞吐量却增加了。因为在算某次的 a/b 的时候,前一次的 c/d 可能在另一个核中并行计算着。
4.2 客户端设计与实现
4.2.1 登陆模块
登陆模块的实现过程有下面几个步骤:
(1)获取用户名,用户选择的头像,服务器的IP地址和端口号的信息; (2)确认登陆后初始化,创建套接字,连接服务器,向服务器发送用户登陆信息,使其他在线用户得到本用户上线的消息;
(3)初始化过程中显示在线好友,并且对用户的好友上、下线进行管理。
4.2.2 主界面模块
整个程序是以服务器与客户端之间的通信事件而驱动的,本程序划分为三大模块,但最基础的都是得到服务器传来的消息,对消息进行判别再分别交给不同模块进行处理。
本设计的接收消息过程很抽象,笔者在对设计详述之前首先将客户端接收消息的过程提纯出来,其示意图如图4.1所示。事先已对套接字和端口进行过绑定,一旦端口有数据来到,就会触发CMainSocket对象的CMainSocket::OnReceive()
16
网络聊天系统的设计与实现
函数。OnReceive()函数中调用的Receive()函数就可以得到端口进来的以Message结构体封装的消息。再将Message的内容作为WM_RECEIVEMESSAGE的WPARAM参数发送。WM_RECEIVEMESSAGE为自定义的消息,CMyQQClientDlg的OnReceiveMessage()为此消息对应的消息处理函数。OnReceiveMessage()函数处理从wParam参数中传送来的以Message结构体封装的消息内容,针对不同的消息类型进行不同的处理。在以下的每个模块中,会将OnReceiveMessage()函数进行分解,各模块只针对自己的部分进行处理。
图4.4 接收消息过程
管理模块流程图如图4.5所示。
管理模块的功能实现最主要由CLoginLoad 、CMyQQClientDlg两个类来实现。在下文介绍具体功能时,会对两个对话框控件进行分析。
17
网络聊天系统的设计与实现
图4.5 管理模块流程图
CLoginLoad :CLoginLoad是用户登陆的对话框,基于CDialog类。CloginLoad的登录对话框的界面如图4-3所示。其主要功能是获取用户名、用户选择的头像等信息,并且填写服务器IP与端口号。此对话框主要有两个按钮,登陆按钮和退出按钮。用户输入昵称和密码后可按登陆按钮,如不想登陆按退出按钮退出程序。
图4.6 CLoginLoad用户登陆界面
CMyQQClientDlg:CMyQQClientDlg是用户登陆后显示好友列表的对话框,基于CDialog类,CMyQQClientDlg也是本程序最核心的对话框。此对话框只响应用户双击图标的事件,双击后,创建聊天对话框,然后开始进行聊天。
18
网络聊天系统的设计与实现
CMyQQClientDlg对话框的界面如图4.7所示。
图4.7 CMyQQClientDlg好友列表对话框
4.2.3 私聊模块
发送信息模块
聊天模块中,发送信息模块的实现过程有下面几个步骤: (1)用户选择一个好友为聊天对象;
(2)识别是否已经与此好友处于聊天状态(有对应的聊天对话框打开),已处于聊天状态的,将该对话框显示到前台,未处于聊天状态的,创建一个新的对话框;
(3)用户按下发送按钮后,将聊天内容发送出去(服务器接收); (4)在本地即时聊天内容显示的编辑框中添加发送的内容。 2. 接收信息模块
聊天模块中,接收信息模块的实现过程有下面几个步骤: (1)判断接收到信息的类型,是否为好友发来信息;
(2)若该好友第一次发送信息(没有与此好友聊天的对话框),提示用户有新的消息;
(3)用户按下查看消息的提示后,创建新的对话框,加到对话框链表中并显示该对话框,如果已经和此好友处于聊天状态,直接将对应对话框调到前台;
(4)在对应的对话框中显示传递过来的消息。
19
相关推荐: