final edit 2015-01-03
· 实现平台:
Window 8.1,Visual Studio 2013
Window 7, Visual Studio 2010
· 所用框架:
是基于Microsoft MFC框架的编程,以及基于html,css和javascript的web编程。
· 编程语言:
C++,java
· 软件介绍(Introduction):
MINET是一款能够进行群聊和P2P私聊的软件。我们通过一个服务器进行中介传输,使客户端之间可以进行通信。
· 功能简介:
? P2P聊天功能
? 群聊功能(聊天室)
? 同一 段(WIFI/校园 )之间通信
? 匿名聊天功能
? 修改用户个性签名功能
? 后台数据库储存用户昵称,个性签名,在线状态
? 在线用户列表,离线用户列表
· 工程设计(Project Design):
概要:
? 协议:本软件的聊天功能基于UDP,经过测试,socket会出现不稳定情况。
? 服务器:每个客户端与服务器之间都用一个socket连接。服务器的功能包括数据库读写,P2P之间的消息转发,群聊时消息的广播,在线/离线用户列表的更新广播
? 客户端:客户端的功能主要包括发送聊天内容,发送个性签名更新,以及对从服务器中收到的消息进行分类处理。客户端根据从服务器接收的消息的type
过程:
每个客户端连接服务器用了一个socket,代码是写在MINET.cpp里面,也就是MAIN函数中,当我们的对话框发送消息时首先发给对话框所对应的客户端,然后由客户端的socket发送给服务器,那么服务器接收到消息之后,要转发消息,也是先发送个每个客户端,然后客户端再把消息怎么处理显示在对应的对话框中,我们的聊天都是使用服务器作为转发,就算是P2P的聊天也是利用服务器进行转发,群聊和私聊的不同就是转发的对象不通,怎么转发,下面介绍服务器的socket的实现会具体指出。
文头的定义以及 文发送的格式:
Head.h:
· 对话框类就只有NetChatServerDlg,与socket相关的事件处理类为ClientSocket类,而ServerSocket里面 有一个成员变量:
这个截图即为消息类型为MSG_LOGOIN活着MSG_SEND的处理函数,同样的,这是在应该重写的OnReceive函数里面进行的。
因为Header在上面有所介绍,所以,我们怎么找到需要服务器转发的人就是OnMSGTranslate实现的关键问题,我们已经知道我们的消息每次发送两条,第一条是消息类型type,第二条才是真正的消息,所以当我们接收到第二条消息时,我们必须对这条消息进行处理。
如“3#A#B#C#msg“,那么我们所要进行的操作就是找到A,B,C分别连接此服务器的socket,然后通过这个socket对A,B,C客户端进行转发消息,而转发的消息也同样应该是“3#A#B#C#msg“,然后客户端接收后再进行处理,稍后我会介绍当客户端接收到消息后,怎么处理,因为服务端只需要接收到消息后进行转发,所以后续的操作很少,具体的代码实现课以参照NetChatServer的ClientSocket.cpp即可。
由于MFC中的CString的类十分强大,所以在处理消息的时候,调用此类中的一些函数就可以处理,如果对CString的类使用有所不懂,那么可以参考微软的官方参考手册即可。那么当一个连接断开,那么相应的,我们也需要销毁该套接字,那么,直接调用CSocket::OnClose();相应的,应该在服务端文本框界面上有所显示(和登陆一样)。这些是主要功能,我们在额外功能里面增加了个人信息,这个要用到数据库,userSQL是我们自己写的数据库,在下面的额外功能里面,我会具体再介绍这个功能如何实现。
· 客户端:
项目整个头文件:
其中,当收到TYPE类型为MSG_UPDATE和MSG_SEND时就会发生一系列的处理事件,其中因为我们的DLG_LIST是一个模态对话框,也就是说因为我们 每个客户端只有一个DLG_LIST,所以当我们收到的是在线用户更新的信息(MSG_UPDATE)时,我们就可以直接改变这个模态的对话框的值。而当收到的type为MSG_SEND的情况时,我们就应该找到一个对话框,让别人发送的消息在相应的对话框中显示,因为此时这些对话框是非模态的,所以有了上述的list info,这个链表将所有的对话框存起来。
然后我们收到消息之后,需要解析收到的第二条消息,它的格式上面已经做了说明,如3#A#B#C#LALALALALA,这段话就是A发送给B和C 内容为“LALALALALA“的一条消息,服务器会将这条消息转发给A,B,C,所以在A,B,C的客户端中,我们需要在相应的客户端中找到一个合适的对话框将“LALALALALA“这条消息显示。
那么,怎么找出来,想法很简单,就是首先在list里面找一个member也为3#A#B#C#的对话框放入,如果没有,就new一个member为3#A#B#C#的对话框,然后再放入,我们确实也是这样实现的,不过在找对话框时,我们应该知道3#A#B#C#与3#B#B#A#的member是一样的,所以我们应该不是简单的判断,应该要包括这种情况一起判断。
在我上面已经说到了还记得Node里面有一个creative成员变量吗变量的作用就是当我们的在线用户列表出现改变的时候调用,比如B下线了,我们就应该把客户端中所有与B有关的客户端全部关闭,或者用另一种方法不予显示,显然我们采取了这个creative变量来判断,若这个对话框是活动的,就让它的值true,如果有关用户下线了,将这个值为false,具体实现我也不多说,可以查看ClientSocket.cpp。
由于我们新增了数据库,存储用户信息,并且用户名可以当做是主键,所以在登陆之时要进行判断,这些功能我会再下面的额外功能里面再做说明。
· 运行环境与部署配置(Setup and Deploy):
在windows环境下,先打开我们的服务器端(MINRO),确认自己的IP地址,然后在多台主机或一台主机上登录客户短,在登陆界面上填写服务器的IP地址,使客户端与服务器连接(确认客户机和服务器在同一 段下)然后按照软件使用进行使用即可。
结果输出(Result):
服务器:
在线用户列表界面:
群聊界面:
· 参考资料
1. http://blog.csdn.net/lh844386434/article/details/6655080
络编程(三)—- MFC 仿QQ聊天软件
2. http://www.cnblogs.com/ziwuge/archive/2011/06/19/2084608.html
CString/string 区别及其转化
3. http://www.cnblogs.com/azraelly/archive/2012/04/14/2446914.html
C++文件操作详解(ifstream、ofstream、fstream)
4. http://blog.csdn.net/lebao82/article/details/7839580
MFC 对话框标题动态设置
5. http://wenku.baidu.com/linkl=6SfHPTeyVg97NfPojYp4KeQ463JPImsEuGICQq8oyFn-_n4DM_eZnEYyb-MsMfraRZ_U_I0X-8PdoSSB4wMj6Qm7IjeOI9zrlVFWYys7CoC
VS2010创建SQL数据库项目入门
6. http://blog.csdn.net/wangjiannuaa/article/details/6301353
MFC中IPADDRESS控件的使用
7. http://bbs.csdn.net/topics/390123676
C++有判断窗口是否显示隐藏的api
8. http://wenwen.sogou.com/z/q211369440.htm
在C++中添加一个按钮链接到一个 站
9. http://wenda.so.com/q/1370236883066568c=9999
同时显示这两个对话框
10.http://www.cnblogs.com/oyjj/archive/2011/01/09/1931291.html
MFC 控件显示层次调整(叠放次序)和绘制控制问题
11. http://bbs.csdn.net/topics/390772928
用MFC做的登入时界面跳转的一些问题
12. http://bbs.csdn.net/topics/390010876
MFC 中使用Static Text ,字下面有背景色怎么去掉
13. http://blog.csdn.net/abidepan/article/details/7925679
MFC学习之 对话框设置背景颜色及控件透明的方法
14.http://ningmengjiabing.blog.163.com/blog/static/20484719820138162203485/
MFC picture控件显示动态/静态BMP图片
· 额外附加功能(Extra Functions)
1.数据库存放用户列表
新用户登录时,会修改数据库中的IsOnline状态。同时会读取数据库中的个性签名,以及在线/离线用户。定义格式如下:
#d# #False#请修改你的个性签名#
2.用户可以通过SETTING设置界面修改个性签名。
3.实现群聊匿名功能。
在群聊界面上有个button.点击之后会进入匿名模式,这样可以增加群聊的趣味性。
综述:
这是我们大三计算机 络课的一个final proj,主要使用的是socket编程。通过该proj,还学习到了MFC框架以及个性化界面的知识,重新复习了数据库的有关内容,并写了一个简易数据库mySQL。总的来说,功能还是比较单一,关于数据库部分还有bug。
欢迎指教!
完整代码请看
http://download.csdn.net/detail/stlst/8483823
本软件用VS2010/2013开发,如遇版本问题可尝试修改“属性->常规->平台工具集”解决。
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树认识身边的计算机 络常见的 络设备22528 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!