Solo开源代码下载地址:
http://weizengke.download.csdn.net/

早就想写个属于自己的即时聊天软件,现在总算拥有了!

  其他不多说,直接进入正题,把我的想法和感受和他家分享一下。

  当然要做一个聊天软件,首先要懂得网络通信的基础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代表换行一样。重写的类中要实现,文本的添加和当文本改变时要处理一些诸如是否写入了转义码,超链接等等,至于那个表情布,只是一张小小的银白色的图片为底,然后再图片上分出很多个小小的矩形来容纳一个个小小的表情按钮,很多按钮吧,没错!每个小小的表情都是覆盖在按钮上的,同样要实现鼠标经过悬停和按下的事件,还得画一下那个蓝色的边框。。总之这个表情功能的添加,我耗费较多的时间了,明白一点:微软提供的控件都是令我们不够满意的,我们得自己重写这些控件类,也就是继承他!!!!(记得保存下来以后再用哦)。。

讲到这里,这个即时聊天软件的主要思想也介绍差不多了。。提几点软件开发的体会,要注意代码的编写习惯,不要写那么多全局变量和外部变量(不到比不得以的话),注意内存的释放防止泄露,调试能力很重要(否则很多时候看卡你怎么不知所措)。

谢谢您的指点。

http://user.qzone.qq.com/269574524/infocenter

软件介绍和下载地址

1登陆界面

2主界面

3私聊

4群聊

  

即时聊天软件开发体会相关推荐

  1. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  2. uniapp开发的即时聊天软件app

    uniapp开发的即时聊天软件app,实时聊天,前端用的是uniapp开发,后端用php+gatewayworker开发,不走第三方接口,完全自己独立开发,有需要源码的伙伴可以留言, app下载地址百 ...

  3. 中油即时通信电脑版_一文看懂云视频会议与即时聊天软件的差别

    进入互联网时代,便捷.高效的云视频会议受到中小企业的青睐,人们通过租赁云视频会议账号,即可在视频会议室.个人电脑.智能手机上发起远程视频会议.不过随着5G等通信网络的普及,人们基于即时聊天软件进行视频 ...

  4. 即时聊天app开发-即时通讯app开发方案分析

    如今,即时聊天APP层出不穷,它已经成为人们日常生活中密不可分的社交工具.如今,即时聊天APP不仅是聊天工具,也是企业营销的利器.我们经常可以在聊天主页上看到一些广告.如有必要,用户可以直接点击广告了 ...

  5. ChatGPT聊天软件开发

    ChatGPT聊天软件是一款基于OpenAI技术训练的智能AI对话软件,具有自然语言处理.问答系统.语音交互等多种功能.用户可以通过输入文字或语音与ChatGPT进行互动,询问问题,获取信息以及进行娱 ...

  6. 【基于Android聊天软件开发-哔哩哔哩】 https://b23.tv/109B82i

    [基于Android聊天软件开发-哔哩哔哩] https://b23.tv/109B82i https://b23.tv/109B82i Android聊天软件开发(仿QQ) 要求: Android ...

  7. 最简单的P2P加密聊天软件开发准备

    今天准备写个最简单的加密聊天软件练练手.核心的就三样东西: P2P通信 密钥交换 加密解密消息 暂时不支持图片等复杂的聊天功能,只支持字符聊天. 下面是我做的两个功能测试代码: 1. AES-128位 ...

  8. 基于android的个人理财软件 android stu_Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)...

    OKhttp封装 IRequest package heath.com.chat.OKhttp;import java.util.Map;public interface IRequest {publ ...

  9. 视频聊天软件开发技术

    网络视频犹如一个万花筒,它让所有痴迷于可视.可听的人群找到了一条畅快淋漓的途径,它为网民带来了视听的真实和画面灵动的刺激.这个产业的迅速崛起让网络更贴近现实生活,更让信息时代的网络服务焕发出鲜活的魅力 ...

  10. 北理工计科小学期Qt聊天室:WeTalk——基于云服务器与QML前端的多人广域网即时聊天软件

    文章目录 请到github仓库或者百度云下载 项目概述 效果 架构 需求分析 运行环境 项目设计 我们这个项目在同一届中算做的很好的了,之所以没有做到最好,是因为有两个技术点没有实现: 服务器多线程并 ...

最新文章

  1. NYOJ 1068 ST(线段树之 成段更新+区间求和)
  2. oracle某些服务在有其他服务,oracle 监听无法启动,出现某些服务再未由其他服务或程序使用时自动停止。...
  3. pip install安装php,详述Python、pip、easy_install的安装教程
  4. 1979. 找出数组的最大公约数
  5. Mahout的一些推荐算法
  6. Tomcat Maven插件分环境运行配置
  7. map 和 hash_map 的使用方法
  8. HttpClient 通过资源URL下载资源
  9. 彻底卸载VS2015
  10. stm32串口c语言程序,STM32串口通信-代码实现
  11. python汇率换算注释_【菜鸟学Python】案例一:汇率换算
  12. 3w最简单led灯电路图_怎么选择自己合适的LED驱动IC?(十大LED驱动IC典型应用电路图)...
  13. 【C语言】位段(详解)
  14. pygame 躲避僵尸
  15. 物联网主要应用在哪些领域
  16. 安全尽职是企业的阿克琉斯之踵
  17. 高效下载论文----谷歌SCI-HUB插件
  18. iPhone手机移除锁屏密码的三大攻略分享
  19. openfire + spark
  20. CSS Spritec下载,精灵图,雪碧图,初探之原理、使用

热门文章

  1. 计算机磁盘文件怎么加密,怎么加密磁盘-文件夹加密超级大师加密磁盘的方法 - 河东软件园...
  2. WPS Office 2020 for Mac(wps2020)3.8.0(6081)中文
  3. python xlsxwriter dict_使用python库xlsxwriter库来输出各种xlsx文件的示例
  4. 如何在Google地图上找到经度和纬度
  5. 关于select和option下拉框样式问题
  6. 基于C#的学生综合教务管理系统
  7. 逻辑回归算法深度思考-优点和缺点
  8. 专门查英语单词的软件_查英语单词的工具
  9. 图像检索与识别(Bag-Of-Words Models)
  10. paypal android sdk,Android Paypal SDK错误:商家不接受此类付款