伺服器端編程心得(七)——開源一款即時通訊軟體的源碼

在我的《伺服器端編程心得》這個系列的第一篇至第六篇都是講了一些零散的不成體系的網路編程細節。今天,在這篇文章中,我將介紹一款我自主開發的即時通訊軟體flamingo(中文:火烈鳥),並開源其伺服器和pc客戶端代碼。以此來對前幾篇文章中說到的理論進行實踐。

代碼在github和csdn.net上各上傳了一份:

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

csdn地址:

伺服器端代碼地址:download.csdn.net/detai

pc客戶端代碼:download.csdn.net/detai

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問題頁面留言(github.com/baloonwj/fla),我看到會盡量回復你的。

歡迎加入群:49114021,進行技術討論與交流。


推薦閱讀:

可不可以發明一種工具用C++同時開發iOS和Android呢?
Qt 為什麼在桌面應用(Windows 平台)中不流行呢?
C++中int(a) 為什麼沒有轉型?
c/cpp 中從源代碼到可執行文件的過程,鏈接是必須的嗎?
C++11 function 實現委託機製為什麼會自動釋放委託的函數?

TAG:伺服器架構 | 網路編程 | C |