EASY TALK 开发日志 (二)

Easy Talk 2009

  经过了几天挣扎,EASY TALK算是有了突破性的进步。服务端方面目前用户线程80%接口函数都写得差不多了,所以后期的服务器工作量会减少许多,因为只需对用户请求进行函数响应返回,基本上就是一些函数的重新组成了。而客户端方面,也就是Rock所负责的70%的框架也已经成形了,函数也是相当得多,最后还是要封装动态链接库的,那样减少主程序的代码量。

  客户端与服务器端连接正常,多客户之间消息发送经由服务器转发,一方面减少客户端与服务器端代码编写,简化工作,另一方面通过始终都连接的TCP,而不会发生使用UDP出现的丢包现象。再者,已经实现离线消息的数据库副本保存,当用户上线后将能收到所有离线未收到的消息。

  客户端开发过程中遇到一些棘手的问题,其中包括选择定时器的时候是否使用函数指针,如何向定时器传参数,树控件各结点与好友信息链表的获取与匹配,判断聊天对话框与信息查看对话框创建状态从而选择是头像闪动还是消息直接转移对应对话框的控件,以及各非模态窗口的消息投递。前面几个问题最后决定在好友链表的结构体里分别添加成员变量,分别用以保存定时器事件ID,孩子结点的HTERRITEM句柄,对话框的窗口句柄。一方面可以简化很多操作,一方面给以后的功能扩展铺好基石。

  目前包括主要功能有:注册请求,登陆请求,登陆反馈,自己信息与好友信息结构体的发送与接收,好友在线未在线自动识别并归类,与好友之间的文本对话,头像闪动,个人资料的更新,好友上下线提示与数据更新,好友资料更新,查看好友信息,更新好友信息。其实有几个小环节解决了大问题,首先是由于服务器为每个客户生成一个线程,每个线程在自己的时间片里做while循环,这种循环会大量占用CPU(90%以上),从而影响其它操作。解决办法是在每一个while循环最后加一句Sleep(1),所有while循环的速度便比较适当了,而CPU的使用率很快降到5%以下,相当适用。其次,客户端头像的CimageList起初是准备创建三个,一个放小头像,一个放中头像,一个放大头像,后来发现后两个基本上不适用,只剩下一个CimageList对象,并与好友树控件绑定,而遇上的问题便是头像闪动。因为一旦更换CimageList里图片的话所有该头像的用户图片都会改变,因此用了另一个办法,也就是按照一定顺序将正常情况下图片,左偏图片,右偏图片初始化的时候就载入CimageList对象,当有消息来的时候,只需使用树的对象获取用户结点,将用户结点的图片索引一个增量就可以了。当然,这个操作放在定时器里,300毫秒一次的头像更换,从而实现消息到达后该用户的头像闪动效果,附上消息铃声,显得相当大气,而且美观。

  接下来就要涉及好友的添加与删除,在线好友的搜索,文件的点对点传送,聊天室多人聊天,文件群发等等一些更棘手的模块编写了,不过还好,以目前的进度与速度相信能在15号回上海之前完成的。

  最后附上几张截图,希望继续关注!

Easy Talk 2009

 

Easy Talk 2009