消息子类CmsgPerson 在申请帐号时发送的消息类 class CMsgPerson : public CData { public: virtual BOOL LoadFromBuf(); virtual void PackToBuf(); CMsgPerson(); virtual ~CMsgPerson(); CString Name; BYTE Sex; BYTE Canbeadd; DWORD PhotoId; CString Age,Phone,Fax,Email,Homepage,Address,Password; CString Department,Description; };
消息子类CShowOnlinePeople 在请求查看在线的人后服务器发送回的数据类 class CShowOnlinePeople : public CData { public: virtual BOOL LoadFromBuf(); virtual void PackToBuf(); CShowOnlinePeople(); virtual ~CShowOnlinePeople(); CArray<BYTE,BYTE>aCanbeAdd; 能否被加入信息的数组 CArray<DWORD,DWORD>aPhotoId; 头像数组 CArray<DWORD,DWORD>aId; 帐号数组 CArray<CString,CString>aName; 姓名数组 CArray<CString,CString>aDepartment; 部门数组 };
§4.9发送数据的确认消息的编码方案
这个确认消息的前K位,是程序头文件中定义的ResponseMsg字符串来确定的,若要修改时,修改头文件中的宏定义就可以了,但是注意,需要服务器,客户端同时修改,否则就会出来确认信息不统一,无法得到正确结果的错误。 发送数据时,可以多线程的发送,在发送这些信息时,如何知道一个确认消息,是那一个发送数据的呢?所以,每发送的数据,都必须加上一定的标志。 每个发送的数据类中,都有一个成员为DWORD类型的This,发送数据的socket类中,都有一个统计当前共发送了多少个数据的成员m_nTotalSend。 This的编码方案为:This=m_nTotalSend%CheckBufLength CheckBufLength是一段缓冲区的长度,每当发送数据时,发送程序就会把m_arBuf[This]置为0,然后等待,直到超时或其值变为1。当接受方接受到数据后,就会把ResponseMsg再加上4字节的从接受数据中取出的This,作为确认信息,发送回发送来数据的地址和端口。发送端接受到确认信息后,将按This的值,把m_arBuf缓冲区的m_arBuf[This]置为1,表示这个位置的数据发送成功。这样,就较好的解决了,发回确认信息的区别的问题。
§4.10服务器端的分配用户帐号的策略
有一个编号的基数UserIdRadix,从这个基数开始,随着用户的增加而增加,简单的说,如果第一个用户要申请帐号,它的帐号将为UserIdRadix+1,第二个才UserIdRadix+2……。而且,Users表中的UserId和Id的对应关系为UserId+UserIdRadix=Id,(UserId是一个自动编号的字段)
采用这种算法的好处: 处理的速度很快,这样,看是否为合法用户(是否存在)只要这个帐号大于UserIdRadix,且小于等于MaxUserId就可以了,在数据库表Users中查找数据,用UserId进行匹配,很快的速度。而且由于号码的连续性,也使我用数组m_pUsers存储在线人信息很方便,在数组中定位提供了极大的方便,很算法简单,又有很快的响应速度,能够适应较多人在线的情况。
采用这种算法的局限性: 在服务器端,最好不要删除某用户,也不要随便修改数据库中的数据,特别是Users中的Id字段,因为Id与UserId的对应关系
为了减少数据库操作,提高服务器性能,我把很常用的信息存储在内存中,因为现在的内存一般都很大,即使有1000个用户,也不过是多占用几十K的内存而以 在启动服务时,我把每个用户的ID,PhotoId,Name,canbeadd,department的属性读出,并存于m_pUsers指的数组中。
§4.11 服务器的应用程序类CServerApp的设计
CServerApp类,定义了服务器全局的数据结构, class CServerApp : public CWinApp { public: void SaveMyProfileSettings(); //保存配置文件 BOOL LoadMyProfileSettings(); //读取配置文件 CServerApp(); CServerSocket m_Socket; //服务器端的上层socket接口 CArray<DWORD,DWORD>m_anPort; //服务器端开设的侦听端口数组 int m_nSendNum; &
首页 上一页 9 10 11 12 13 14 15 下一页 尾页 12/17/17