1、 http:/买卖通 . 赢造企业网上贸易 客户端整体架构的分析版本号 修改日期 修改原因 修改人 审核人1.0 2011-11-1 初始版本 高智超http:/买卖通 . 赢造企业网上贸易 I目 录1 概要 .11.1 当前客户端的问题缺点 .11.2 用户信息同步的构想 .11.3 项目架构的主要部分及其接口 .11.4 基础类库的说明 .21.5 客户端开发与维护 .21.6 界面配置和系统信息配置 .2http:/买卖通 . 赢造企业网上贸易 01 概要1.1 当前客户端的问题缺点部分功能不稳定,登录时间长或者在特定时间登录不到服务器,网络传输不稳定,文件传输界面做的不是很好。命名规则
2、不统一难以理解。重复代码数以百计。请参考为什么开发新的客户端和客户端分析白板 。增加一个用于组织结构列表及成员信息、好友列表及信息、群列表及成员信息的缓存,增加账号可离线,上述信息可以与服务器进行同步,将本地与服务器的信息对比同步,有变化的进行改变。尽量不用模式对话框显示窗口,除非是特定的情况下使用,不然很影响用户体验度。在有些业务处理中如果需要的时间长,可能出现的卡界面,界面无响应的情况,最好将这些全部改成异步操作,即开启一个线程处理这些。这些都会降低用户体验度,让用户感觉到很不专业。改掉程序中潜在的崩溃问题,这是最难发现的问题,不好发现,不好重现,即使找到了也不好改掉。1.2 用户信息同步
3、的构想好友信息以及群信息成员信息等是否应该保留一份缓存,或者本地的备份,就是一个同步操作,应该是每次将本地的信息与服务器对比,服务器只给客户端推送在线的用户信息或者信息有改变的用户,这样做可以减少网络的传输情况(相对目前状况) 。用户 A 的信息改变可以做一个标记。首先服务器将 A 好友的存储信息的标记初始化,如果此用户的信息有改变,服务器将这个信息的标记为有改变状态,然后给在线的 A 好友B 推送最新的信息,然后重置标记量,表示本地信息与服务器信息是相同的不需要更新。对于不在线的 A 的好友 C,服务器不需要推送,此时服务器 A 的好友在服务器中的标记状态是有改变,当此 C 在登录时,只需要
4、寻求服务器上又改变的用户信息,和在线状态,其他的好友 D 可以在本地去读取其信息。这样就减少了网络的传输。1.3 项目架构的主要部分及其接口参考 IGIM 程序员手册。可以说 IM 工程有以下部分构成和实现: 容器:CIGContainer 插件:CIGPlugin 消息管理器:CIGMsgManagerhttp:/买卖通 . 赢造企业网上贸易 1 数据处理器:CIGDataProcessor 数据类:CIGData 容器管理器:CIGContainerManager 插件管理器:CIGPluginManager 数据处理器管理器:CIGDataProcessorManager 数据类管理器:
5、CIGDataManager1.4 基础类库的说明Coolskin.dll界面控件的 扩展类, 实现了自定义风格的界面,界面所需要的各种控件,包括对话框都需要从该库中导出的各个类中派生。Commutility.dll通用处理类, 实现了一些通用的操作Utility.dll ini 文件处理类, 实现 ini 文件的处理Igcommctrl.dll通用控件 类, 实现了一些其他特殊控件Zsbaselib.dll系统各种插件的基 础实现库,如果要 实现某种插件,可以从这些基础库派生。Richeditctrl.dll聊天编辑框实现库, 实现了聊天 编辑框的特殊处理Zsfacemanager.dll表
6、情实现库,与表情相关的各种类Rescn.dll资源库,系统中的所有资源均在此库中这些类库实现的导出类的头文件均在目录./include 内,各个类的具体功能参见这些头文件1.5 客户端开发与维护参考 客户端开发与维护文档,这里讲到了客户端的开发设计思想的分析和实现的客户端功能。第一部分中,讲述了客户端的设计和实现分析,包含了其思想、设计 的优缺点以及各个模块的实现功能。功能部分包含了客户端的主要功能,如主要的聊天功能、文件传输、 语音视频和其他扩展服务(MMT 等服务项目)等等。文档中描述各个模块之间,各个功能之间的协作配合,安装包和设计包的制http:/买卖通 . 赢造企业网上贸易 2作。方
7、便了客户端的维护。1.6 界面配置和系统信息配置请参考 IM 配置手册 。有详细的说明。1.7 架构中 P2P 模块研究JabberP2P 类控制双方的连接:class JabberP2Ppublic:JabberP2P(CStreamXml *pJabber):m_pZSJabber(pJabber) int SendConnectionInfoMsg(CONNECTIONINFO *pInfo);/接收 P2p 信息void RecvP2PInfoMsg(XmlNode *pNode);/接收中继器信息void RecvRelayInfoMsg(XmlNode *pNode)/检索连接信息
8、BOOL RetrieveConnInfo(XmlNode *pNode, CONNECTIONINFO BOOL RetrieveConnInfoDWROD(XmlNode *pNode, char *szChildName,char *szValueName, DWORD/发送邀请信息的 msgint SendInviteInfoMsg(FILE_NOTIFY *fileNotify);/接收邀请信息void RecvInviteInfoMsg(XmlNode *node);void FileTransfer(XmlNode *node); / 文件接收功能的入口CStreamXml *m
9、_pZSJabber;private:;可以调用的框架服务:JABBER_SEND_CONNECTIONINFOMSG-SendConnectionInfoMsgJABBER_SEND_FILENOTIFY -SendInviteInfoMsghttp:/买卖通 . 赢造企业网上贸易 3RecvP2PInfoMsg、RecvRelayInfoMsg 和 RecvInviteInfoMsg 是通过 FileTransfer 内部调用的方法。情况 1 分析,当自己是发送方:1、发送 SendInviteInfoMsg 请求。进行 P2P 协商2、RecvInviteInfoMsg,接收到了协商请求
10、3、SendConnectionInfoMsg,发送连接请求4、RecvRelayInfoMsg,接收到了中继信息5、RecvInviteInfoMsg,接收到协商请求-传输完毕。6、SendInviteInfoMsg,发送协商请求-传输完毕。2、CFileTrans,自己作为发送方(保证所有的操作都是正确的)1.SendFile:发送文件,通知对方,自己要发送文件了2.RecvFileNotify 接收到可以传送文件的通知。调用 startSendFile()开始发送文件3.StartSendFile:开始发送文件。4.RecvConnectResult:接收到连接成功的通知信息。调用 St
11、artOprFile,启动发送文件(开始传送文件) 。5.FileOperate(做为正在接受和发送文件过程中的回调函数)6.RecvCompleteNotify:文件传输完毕的通知信息。并调用 NotifyPartner(接收失败不调用)和 StopOprFile(必须调用) 。RecvFileNotify 是回调函数,内部调用NotifyUI、RecvRefuseNotify、StartSendFile、RecvCancelNotify、RecvCompleteNotify。3、CFileOperate4、CSessionManager(单例模式)组合 Session。5、Session
12、组合 CP2PNet.在初始化的时候实例化 CP2PNet 对象。组合 sessiontable 对象6、CP2pNetManager 组合了 CP2PClient 的 map7、SessionTable8、CSendPackage(发送缓冲区?)9、CP2PClient(CP2pProxyClient 或 CP2pNetClient)此处通过 socket 进行发送文件的。15 步是主动进行连接。1、StartConn,调用了 InviteConn2、InviteConn 调用了 GetExternAddr、SendJabber 、SendConnectProbe3、GetExternAdd
13、r 获取自身外网的 IP 和 Port,RecvLogonServer 与其对应。4、SendJabber5、SendConnectProbe 发送连接请求探针。 (一般到不了这步)6、RecvConnectProbe 两遍7、Connect8、9、SendThrobPkt10、RecvConnectSuccesshttp:/买卖通 . 赢造企业网上贸易 411、RecvRawDataPkt, 接到数据的包,用于放到数据缓冲区(m_data_list )中。1、CSingleEvent m_RcvEvent这个 EVENT 作用有两个,第一个作用是获取自身的外网 ip 和端口时用到;第二个作用
14、是,接收数据,用于数据缓冲区的(m_data_list),当 m_data_list为空的时候进行 wait,有数据需要处理时 set。2、CSingleEvent m_p2pEvent与进行 p2p 的另一端进行连接的时候的事件(主动连接和被动连接)Connect 或者 Accept 的时候就行 wait,connect 或者 Recvconnectsuccess的时候进行 set。3、CSingleEvent m_RelayEvent当与直接连接失败后,进行的中转连接。实现步骤同 m_p2pEvent。m_AdressInfo,填充本地内外网的、服务器的、目标的 IP 和 PORT 的结构
15、体,FILETRANSFER in log1、send file-sending request 发送“发送文件”的请求。CFileTrans:SendFile2、recv file-transfer notification 接收到“文件传输”的通知http:/买卖通 . 赢造企业网上贸易 5a s B1 : 人 人 人 人 人 人 人 人 ()人 人 人 ID人 人 人 人ID人 人 人 人 人 人 人人 人 人 人2 : 人 人 ()3 : create p2p session()4 : 人 人 人 人 人 人 IP()5 : 人 人 ()6 : 人 人 人 人 人 人 人 人 人 人 人 人 IP人 人 人 人 人 ()7 : 人 人 人 B人 人 人 b人 人 人 人 人 人 ()8 : 人 人 人 人 人 人 ()9 : 人 人 人 人 人 人 ()10 : 人 人 probe()11 : 人 人 response()12 : send local INFO()p2p人 人 人 人13 : 人 人 人 人 人 人 ()14 : 人 人 人 人 人 ()15 : stop()16 : stop()http:/买卖通 . 赢造企业网上贸易 6如果 p2p 连接过程不成功,则需要中继服务器进行连接。