§4.15客户端处理服务器发送来数据的算法
在客户端接受到数据后,若不是确认消息,则向父窗口发送一个WM_RECIEVE_MSG,将把接受到的数据做为参数传递过来。
在消息处理函数ProcRecv进行处理接受到的数据。对接受到的不同数据类型,分别进行相应处理。
现在,对其中一部分数据进行分析:
一.case SEND_MSG_TO_FRIEND:接受好友发来的信息
首先判断消息的发送者是不是在自己的好友列表中,若是,则保存下当前用户的信息指针(pInfo)和状态指针(pState),若不是,则在自己的陌生人列表中查找是否有这个人,找到,则保存下当前用户的信息指针(pInfo)和状态指针(pState),没有找到,则说明是一个新的陌生人,新建其数据结构,添加到陌生人列表中,并保存其用户的信息指针(pInfo)和状态指针(pState)。然后如果pState->pRecv指向的对话框类实例没有建立,则建立实例。最后,向pState->pRecv指向的对话框发送WM_RECVMSG消息,并把pInfo和pState作为参数传递过去,让其显示接受到的信息。
二.case ONLINE: 某人上线的消息
寻找好友中是否有这个人,有则保存其在线在状态、IP和Port,然后让其加亮显示。
三.Case ONHIDE 某人隐身
寻找好友中是否有这个人,有则保存其隐身状态、IP和Port,然后让其变灰显示。
四 case OFFLINE 某人下线
寻找好友中是否有这个人,有则保存其离线在状态,然后让其变灰显示。
五 case ONLINE_OK 上线成功
设置任务栏图标为上线状态,启动请求每用户详细资料的线程
六 case ONHIDE_OK 隐身登陆成功
设置任务栏图标为隐身状态,启动请求每用户详细资料的线程
其它的信息的处理的详细情况,这里就不介绍了,客户端的界面设计较为繁琐细节方面很多,写起来较为麻烦,而且,我客户端也没有完成设计完成。
第 5 章 全文总结与工作展望
§5.1 全文总结
本文重点讨论客户端/服务器的程序的设计方法和过程,对整个系统进行了详细设计,利用面向对象的方法,进行整个系统的设计。
本文主要做了以下工作:
⑴ 列举了网络寻呼软件的系统和界面需求。
⑵ 陈述了客户端/服务器程序的设计原理和过程
⑶ 根据系统需求,进行整个系统的各个部分的详细设计。
§5.2 工作展望
本文主要是对本软件服务器端的设计作了比较详细的介绍,并对服务器端进行了初步的开发。而客户端的设计有很多都需要完善。客户端是给用户使用的,从方便和美观上,还都还有很多需要完善的地方。而且,由于时间关系,客户端还有些功能没有完全。如果要使本系统成为一个实际应用系统并在局域网上实际应用,除了完成客户端的功能外,笔者认为还应做以下的完善和开发工作:
⑴ 进一步完善底层通讯协议,使能够更好的处理数据的发送和接受。
⑵ 多线程下的对临界数据访问的问题。
⑶ 对发送的数据,进行一定的加密措施,使之更加安全可靠。
⑷ 对本地用户的密码的加密问题,在本程序中,没有对本地密码进行加密。
⑸ 在客户端系统,功能的设置有待进一步丰富,功能的实现还有
待完善和改进。
⑹ 在客户端处理中,响应从服务器发来的数据,是在主线程里执行的,所以,当接受数据忙时,就会出现没有响应的情况。进一步考虑,如何能改善这种情况。
第 6 章 附录
§6.1 查错日志
四月十五日
编写socket的程序,必须在程序启动初始化时调用AfxSocketInit()函数,否则,使用socket通讯,将得不到任何结果,没有任何响应
四月十八日
在 *((DWORD*)m_szResponse+m_nrLength)=pData->This;
中,少加一个括号,使响应信息回应不正确:浪费1:30的时间。
shall be : *((DWORD*)(m_szResponse+m_nrLength))=pData->This;
四月二十一日
虽然说,为了很编译加快,最好不要头文件中包含头文件,但:
1。如果从一个自己写的类进行继承,则必须包含此类头文件
2。注意,每个实现文件,都要包含Stdafx.h
四月二十五日
记住,在SQL 语句中,字符串要用' ' ,单引号,使用””双引号,访问数据库将提示SQL错误
四月二十八日
取数据库中的字符串数据时,如果用普通方法
msg.name=*(s1.m_pstring);
如果此字符串为空,则会出异常,
解决方法:
如果是字符串,可用 rs.GetFieldValue(3,msg.name); or
if(s1.m_pstring!=NULL)msg.name=*(s1.m_pstring);
五月八日
if(i==m_nSendMaxIndex)
while(!m_aSendData[m_nSendMaxIndex])m_nSendMaxIndex--;
should be
while(!m_aSendData[m_nSendMaxIndex]&&m_nSendMaxIndex>0)m_nSendMaxIndex--;
否则,将使m_nSendMaxIndex减为负数
五月十日
DWORD This=*(buff+nRead-4);
与是有很大不同的,下面一个才正确。上一个取出一个字符数据,然后转化为DWORD赋值给This
DWORD This=*((DWORD*)(buff+nRead-4));
查这个错误,花了2小时,
客户端/服务器程序不大好调试,两个都得运行,一起调试,而且还是多线程的,总之调试起来使麻烦。
五月十五日
今天是最糟的一天,全天都在查错,修改一个地方,可能会有许多地方都被牵连到了,都需要修改,在修改时,不免又出现了新的错误,这真是个大问题。
发现了一个非常奇怪的问题,只是一个非常简单,非常。。。。。
忘记写break;
五月十七日
我今天把底层通讯的检查回应消息是否回来的算法修改了。
以前的算法是:
有一个缓冲区,发送一个数据,就把发送这个数据的内存起始地址存在这个缓冲区中,当回应消息发回来时,就是这个缓冲区中找,找这(This)与这内存地址相同的,就把它赋为0,发送程序若在这个缓冲区中没有找到这个内存地址,就表示数据发送成功,找到了,就表示还不成功。
现在想来,
首页 上一页 13 14 15 16 17 下一页 尾页 16/17/17
免费vc++网上寻呼QICQ源代码(附带文档)(十六)由毕业论文网(www.huoyuandh.com)会员上传。