专栏首页高性能服务器开发(七)开源一款即时通讯软件的源码

(七)开源一款即时通讯软件的源码

在我的《服务器端编程心得》这个系列的第一篇至第六篇都是讲了一些零散的不成体系的网络编程细节。今天,在这篇文章中,我将介绍一款我自主开发的即时通讯软件flamingo(中文:火烈鸟),并开源其服务器和pc客户端代码。以此来对前几篇文章中说到的理论进行实践。

代码在github和http://csdn.net上各上传了一份:

github地址:https://github.com/baloonwj/flamingo

csdn地址:

服务器端代码地址:http://download.csdn.net/detail/analogous_love/9805797

pc客户端代码:http://download.csdn.net/detail/analogous_love/9805795

csdn上代码可能不是最新的,但是github上的代码是不断维护的,包括一些新功能的增加和bug的修复。如果你想关注flamingo的最新功能,请关注github上的更新。如果你只想研究下网络通信程序的基本原理和编码技巧,csdn上的代码就足够了。

目前即时通讯软件实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列,请自行发现):

  • 注册
  • 登录
  • 查找好友、查找群
  • 添加好友、添加群
  • 好友列表、群列表、最近会话
  • 单人聊天功能(包括发文字、表情、窗口抖动、离线文件)
  • 群聊功能(包括发文字、表情)
  • 修改密码
  • 修改个人信息(自定义昵称、签名、个性头像等个人信息)
  • 自动升级功能

下面是一些截图:

客户端还有很多细节功能,比如头像有三种显示模式、好友上线动画、聊天记录、聊天自动回复功能等,有兴趣的同学可以自己探索尝试一下吧,这里就不截图了。

下面介绍一下服务器代码和pc客户端代码的编译与运行环境:

flamingo服务器端代码使用cmake + makefile编译,使用了纯C++11开发,运行于linux系统下(我的系统是CentOS7.0),为了支持C++11,你的gcc版本至少要大于4.7,我的版本是4.8.5。另外,使用了mysql数据库,我的数据库版本是5.7.17。服务器代码不仅是一款即时通讯软件的服务器代码,同时也是一款通用的C++11服务器框架。

服务器代码使用方法:

编译方法:

1. 进入程序目录,输入cmake . (注意有一个点号,表示当前目录)

2. 没有错误,输入make

3.最终会产生两个可执行程序,mychatserver和myfilesever。编译完成

部署方法:

简单说明:mysql数据库的用户名为root,密码为空,请根据你自己的需要设置相应的用户名和密码(目前写死在程序中)。mychatserver是聊天服务器,myfileserver是文件服务器,文件服务器负责上传和下载聊天中发送的文件,myimgserver负责上传和下载聊天中的图片。三个服务相互独立,互不影响。聊天服务器监听端口是20000,文件服务器端口是20001,图片服务器端口号是20002,这三个端口供客户端连接,其中聊天端口和客户端是长连接,文件端口和图片可选择长连接或短连接。

第一次运行mychatserver时,如果能顺利连上mysql,mychatserver会自动检测是否存在名为myim的数据库,如果不存在则创建,并新建三张信息表,分别是用户信息表:t_user, 好友关系表t_user_relationship和聊天消息记录表t_chatmsg。第一次启动文件服务器时会创建filecache目录,这个目录用来存储聊天中的聊天图片和离线文件以及客户端升级包。

为了方便查看代码,我用Visual Studio来管理代码,可使用VS打开myserver.sln查看和管理代码。(VS版本必须是VS2013或以上版本)

客户端代码使用方法:

编译:

1.用VS2013打开程序目录下的:Flamingo.sln,你可以使用其他的VS版本,但是至少不低于VS2013,因为客户端代码也使用了大量C++11语法和库,VS2013及以上版本才能较好的支持C++11的语法。

2. 打开的解决方案包括三个项目:Flamingo是即时通讯主程序,CatchScreen是聊天中使用的截图工具,iUpdateAuto是升级功能中用到的解压工具。

3. 用VS2013编译整个解决方法即可,编译成功以后将在Bin目录下生成对应的程序。启动Flamingo.exe注册一个账号就可以开始使用flamingo了。

如果你暂时不想研究服务器代码,但又想使用客户端,你可以连接我的测试服务器,测试服务器地址是:

聊天服务器地址:120.55.94.78 端口号:20000

文件服务器地址:120.55.94.78 端口号:20001

图片服务器地址:120.55.94.78 端口号:20002

你可以在登录界面的网络设置里面进行设置(登录界面右上角最小化按钮左边的一个按钮)。

这篇文章暂且就这样了吧,如果有您对我的程序有任何意见或者建议,或者有不错的想法欢迎与我交流或者给我留言(QQ:906106643).。代码中也有些“拿来主义”,另外程序中使用的图片和图标来源于网络,仅供用于学习,请勿用于商业用途,如果不小心侵犯了您的版权,请联系我。

接下来的几篇文章,我会详细地介绍这款即时通讯软件服务器端与客户端代码的框架结构和实现细节。敬请期待。

当然,我保证,我会持续维护flamingo,让这款软件越来越好,欢迎关注github上的更新:https://github.com/baloonwj/flamingo。如果你有任何问题可以在博客或者github问题页面留言(https://github.com/baloonwj/flamingo/issues),我看到会尽量回复你的。

欢迎加入群:49114021,进行技术讨论与交流。

本文分享自微信公众号 - 高性能服务器开发(easyserverdev),作者:张小方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 7 QQ游戏百万人同时在线服务器架构实现

    QQ游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本不是QQ的对手,因...

    范蠡
  • 分享一套仿英雄联盟大型多人联机实时对战游戏源码(包含完整服务器和客户端源码)

    这是一款类似英雄联盟的 5V5 实时对战游戏,服务器端使用 C/C++ 开发,同时支持 Linux 和 Windows 系统部署;客户端使用 C# + Uni...

    范蠡
  • 2020 年好好读一读开源代码吧

    2019 年就这么结束了,2020 年也来临了,虽然我曾对过去 2019 年做了一份总结,但是认真的来说,其实我对自己的 2019 年的收获并不太满意,一个主要...

    范蠡
  • 谈谈Websockt

    它是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不...

    张炳
  • 【吊打面试,击中要害】http三次握手四次挥手,https证书验证阶段和数据传输阶段

    客户端发送一个SYN标记的数据包、Seq(Synchronize Sequence Numbers)同步序列编号x;发送完成后客户端进入SYN_SEND状态。

    java乐园
  • 类的本质-类对象

    今天整理了下自己电脑里的一些碎片笔记,时间有限只整理了这篇文章——类的本质,大家可以进行参考。

    VV木公子
  • 学习提升之HTTP状态码详解

    2016-11-1410:23:53 发表评论 315℃热度 1.URL 2.URL中常见的协议 3.TCP/IP协议簇 4.TCP/IP参考模型 ...

    timhbw
  • HTTP状态码详解

    HTTP状态码介绍 状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。 状态码的类...

    运维小白
  • Java 设计模式(三)《单例模式》

    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    星尘的一个朋友
  • 深度Q网络用语视觉格斗类游戏

    最近,基于视觉深度Q的学习在雅达利和视觉Doom AI平台被证明成功的结果。与以前的研究不同,格斗游戏假设两个玩家有相当多的动作,在这项研究中,采用深度Q网络(...

    计算机视觉研究院

扫码关注云+社区

领取腾讯云代金券