其实当初师兄给我这个任务的时候还是在2010年的11月份。那个时候刚到项目上的我超级自信,总认为只要自己想做,稍微看下书,动下手就可以写出来了。所以当师兄问我多久可以做好的时候,我开始满怀信心的说一个星期,后来细想下有点悬,说还是2个星期吧。于是还很慎重的写了每天的工作任务计划。
聊天软件的功能需求:
1.实现一个客户端,一个服务器端
2.客户端连接服务器,服务器返回一个所有在线的用户列表;
客户端单击列表特定的一个条目,会弹出一个对话框;
客户端在对话框中输入消息,会通过服务器转发到这个对应的客户端那边。
3.服务器端启动的时候读取配置文件,监听某个绑定的端口;
接受服务器的各种请求信息,保存它的基本登录信息;
客户端登录成功后,向客户端返回所有的在线客户端基本信息;
接收客户端的信息并给指定的客户端进行转发。
直到下来才发现,自己要做一个类QQ的聊天软件太难了,很多东西要学~ 自己很多的重复设计和工作真的是。。。。我回忆着列下:
1.刚开始的时候对qt很有抵触,总想用自己熟悉点的C语言写,于是就在用unix上面的网络编程程序进行实现,后来服务器写的差不多了,要写客户端的时候,发现界面的实现根本就离不开qt。而且关于服务器端对客户端信息的保存和解析C语言实现的话太过于繁琐,几乎每个功能都要我自己实现。工程量浩大。
2.后来准备用C语言+qt完成这个软件,但是发现因为2个很多的数据类型都不通用,所有很多地方要进行不必要的甚至是重复的类型转化。
3.第一次写这么大的一个软件,最终我还是决定使用封装性比较好的qt,加上这个也是项目上的主语言,刚好是一个很好的学习机会。
我的类qq软件的设计:
传输协议的设计:
enum MessageType{Message,NewParticipant,ParticipantLeft,Login,Request}; 各种协议头
在发送出去的数据流里面包含的信息
发送的总的字节长度+文件头+这种信息类型传送的内容
客户端的
1.几个大类:
login:qt类,用来实现登录窗口,并在其中获取用户名
buddy:qt类,用来实现客户端的列表呈现
其中的两个方法:insertItem() //用于在列表中添加用户条目信息
itemClick() //用于找出特定的用户,并存储其信息进行通信
chat:qt类,用来实现对话窗口
client1:(因为不断的重复写,最终竟然把它命名为这个了。。真惭愧)
用来定义客户端用户的基本信息,以及调用其他的几个类
2 .最要注意的是Qmap容器来存储我的用户信息列表,和对话窗口编号,这对于信息的正常传输很重要
QMap
QMap