Solo即时聊天软件(聊天、文件传输、UDP的p2p打洞)
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
solo开源代码下载地址: 早就想写个属于自己的即时聊天软件,现在总算拥有了!实现了文件(文件夹)传输、群聊、私聊、表情等。。 其他不多说,直接进入正题,把我的想法和感受和他家分享一下。 当然要做一个聊天软件,首先要懂得网络通信的基础tcp\ip,udp之类的协议,还有socket编程。 其时间里两台电脑之间的通信是非常简单的,对于udp是无连接的传输层协议,不像tcp那样需要accept和connect什么的需要确保连接。但是udp又是不可靠的,但是相对来说,我觉得对于即时聊天软件来说,使用udp还是足够的。于是我采用了udp协议来贯穿我的软件。当然一般的不加修饰的socket,只能实现同类网络地址下的通信,对于一个不同内网的计算机,将无法进行通信,这样也大大局限了我们软件的使用范围,所以我采用了udp下的nat穿透技术来突破这一障碍,具体理论我们参照这篇文章http://xy.guet.edu.cn/xyzone/show/139。。 先谈谈整体的思想吧,这个即时聊天软件是以c/s构架的,服务器主要负责客户的信息转发,当然只是客户本身的ip、各种端口(消息监听,文件监听)、用户名之类的属性,他不直接参与客户之间的通讯,只有当客户之间需要nat穿透的时候才会通过服务器通知需要通信的一方向另一方发送“打洞”请求,另外还处理客户之间的登录和下线事件的广播,所以服务器的压力会比较小。 至于客户端,我采用了传统的聊天软件的惯用方式,一个主对话框,显示好友信息。出于减小难度,我只采用一个树控件来控制这些好友信息,而没有采用tab类型的控件,即使采用也是要花费一定的功夫去重写这些控件类,才能满足我们的要求。然后通过双击树控件的子项来弹出聊天对话框,说到这里我不得不说一下c++的确是高处c一大筹,(封装、继承、多态)这是在是太帅了。创建这些聊天对话框时,将传入对应的客户ip、对话框指针、用户名(号码)等以用来正确识别。主程序运行就挂起一个消息监听线程,来循环监听从不同客户发来的消息,然后进行不同的处理,所以使用了较多的宏,吧来自不同客户的消息传给不同的本地聊天对话框处理,所以刚才说的在创建聊天对话框的时候的参数就非常重要了,处理不好可能会出现差错。诸多细节在这里还是比较难以细说。虽然采用了udp传输协议,但是我通过消息回执来确保消息发送成功,这个回执将决定是否进行打洞处理。而在文件传输功能上的实现,采用了tcp传输层协议(我也不知道为什么自己就选择了这个,估计是但是第一感觉需要accept和connect),我是在主程序运行时就挂起一个文件监听线程,当然这个监听端口是在程序运行是,没有登录服务器之前就首先动态获取的,我只是循环地查找没有被占用的端口并绑定套接字。在有客户发来文件传送请求时,就创建一个文件接收和发送线程。感觉以上这些还是比较容易实现的。当然采用类的思想才会比较清晰,否则会比较乱。 再讲讲其他一些小小细节,比如那个菜单的实现,如果采用对话框的默认菜单,我们都会觉得比较恶心,的确有点难看,所以我把对话框的菜单栏却掉了,然后添加了on_wm_nchittest()消息,实现无菜单的客户区拖动,然后重写个button类来实现png图片的装饰,实现鼠标经过、悬停和按下的状态(就像qq的最小化和关闭按钮那样的效果),当然,我使用的是vc6开发的,不能直接使用gdi+,所以配置了一下才行(具体方法自己网上一查就知道了)。然后那个对话框的主背景,也是通过把一张png图片绘上去的,当然还要解决一些闪烁的问题,可以采用双缓冲来解决。在做界面的时候,我深感自己缺乏艺术细胞,ps技术实在太烂,做的按钮图片比较难看,颜色搭配和渐变效果实在难以控制。而文件实现拖拽发送也比较简单,增加个on_wm_dropfiles()消息函数,对话框拓展属性勾上accept file就好了,剩下的就是处理路径的问题了,还有多个文件的同时拖拽问题。还有就是那个表情是比较难以处理的一个模块,当时就调试了我一个星期才解决,为了添加表情功能,我不得不放弃原来使用的edit控件(由于以前都只是使用edit),使用了richedit控件,使用该控件还是有很多细节要处理的,比如初始化才能使用啊什么的,当然为了实现表情的功能,我还是得重新写richedit这个类,拓展一下。因为我是使用转义码来实现的,每一个表情对应一个转义码,就像c语言中\n代表换行一样。重写的类中要实现,文本的添加和当文本改变时要处理一些诸如是否写入了转义码,超链接等等,至于那个表情布,只是一张小小的银白色的图片为底,然后再图片上分出很多个小小的矩形来容纳一个个小小的表情按钮,很多按钮吧,没错!每个小小的表情都是覆盖在按钮上的,同样要实现鼠标经过悬停和按下的事件,还得画一下那个蓝色的边框。。总之这个表情功能的添加,我耗费较多的时间了,明白一点:微软提供的控件都是令我们不够满意的,我们得自己重写这些控件类,也就是继承他!!!!(记得保存下来以后再用哦)。。 讲到这里,这个即时聊天软件的主要思想也介绍差不多了。。提几点软件开发的体会,要注意代码的编写习惯,不要写那么多全局变量和外部变量(不到比不得以的话),注意内存的释放防止泄露,调试能力很重要(否则很多时候看卡你怎么不知所措)。 谢谢您的指点。 该文章在 2014/1/27 23:46:50 编辑过 |
关键字查询
相关文章
正在查询... |