Linux環境基於GTK+的圖形聊天軟件設計 php
cnyinlinux 2016/02 西安 linux
目 錄 數據庫
1.GTK+介紹 編程
2.C/S聊天程序網絡模型 服務器
3.聊天圖形界面設計 網絡
本人業餘時間玩兒了下GTK+,簡單總結下寫成這篇博客,若是有淺薄疏漏之處,請指正! 數據結構
1.GTK+介紹 多線程
GTK+是Unix/Linux家族最大的開源圖形庫之一。名字中有個加號,它表明了面向對象特性和可擴展性。知名的gnome桌面環境就是它的表明做(RHEL7或者CentOS7的默認窗體)。 併發
官方網站:http://www.gtk.org/ 負載均衡
因爲Linux圖形編程並非很普遍,因此流傳的中文資料尤爲稀缺。所需文檔都來自其官網(英文)。
本文基於GTK+ 3.0成文。
1-1.GTK+體系
以下圖所示,GTK+並非一個軟件包,而是一個體系庫,它包含了多個組件。
目前GTK+已經支持多種高級語言,包括C/C++,Python等。
用一句話歸納下每一個組件的做用:
Cairo是支持多種設備輸出的2D圖像顯示庫;
GLib是C語言的底層庫,提升數據結構定義和接口包裝;
Pango是顯示佈局和字體渲染的庫;
ATK是底層接口的集合庫;
GDK是窗體和圖形系統的底層函數庫;
GIO是Glib的Input, Output and Streaming Library;
GTK+就是最終的圖形庫了,它提供最直接的圖形元素接口(內部會調用到其餘模塊功能)。
1-2.GTK+庫的使用
須要在操做系統上安裝該庫。紅帽系的Linux都將其作入到了yum倉庫裏。
Debian系列的APT源也支持在線安裝。若是想要本身下載離線包安裝的話,請參考下面連接:http://www.gtk.org/download/index.php
1-3.GTK+編程
圖形庫已經安裝好了,如今就是調用其組件實現圖形編程了。
它是面向對象的圖形編程模式,於是須要有OOP的圖形設計思想。在咱們的高級語言程序中調用GTK+接口,而後編譯時給GCC導入連接選項,即命令 pkg-config --libs --cflags gtk+-3.0 的執行結果。如:
----------------------------------------------------------------------
gcc test_gtk.c $(pkg-config --libs --cflags gtk+-3.0)
----------------------------------------------------------------------
其接口手冊連接爲:https://developer.gnome.org/gtk3/3.18/
PS:海量API。。。
2.C/S聊天程序網絡模型
2-0.閒話
本文着重描述GTK+圖形編程的樂趣,因此聊天內容的網絡程序並未考慮某訊那樣數以億計的用戶量併發問題。服務端也沒有集羣化負載均衡。也沒使用數據庫使用戶信息持久化。
也沒有支持拖動傳送文件功能(Linux下SSH可替代)。客戶端以IP爲標識進行聊天。
2-1.採用UDP協議,文本聊天內容可靠性要求不高,面向無鏈接節省資源,減少服務器壓力,支持更多客戶連接。
2-2.羣聊功能
只支持大羣聊(即全部客戶端在一個羣中),後面有空了再支持用戶自定義羣聊(即建羣功能)。因此服務端採用單進程多線程。按功能劃分爲文本接收線程,和羣轉發線程。暫時不支持海量文本信息同時到達時的併發處理,由於考慮到用戶的聊天是手動輸入,其速度遠低於CPU速度,因此這種及其高壓的場景不存在。
2-3.重大缺陷
除了說的不支持建羣外,最顯著的就是沒有考慮CC攻擊。若惡意程序蓄意攻擊形成高併發的話,服務器會卡頓,甚至轉發嚴重延遲。
能夠考慮從兩個方面去解決,一是從程序邏輯自己着手,增強對文本內容或請求的甄別從而識別惡意客戶端。二是經過防火牆策略,監視客戶端數據傳輸速率,超過人類聊天的可達速度太多就可判斷爲惡意攻擊。
2-4.私聊功能
私聊比較交單,若是客戶端是私聊的話直接P2P就能夠了。目前是經過IP來標識客戶端,因此能夠直接連通。
若是採用暱稱或者ID來標識的話,則需先由服務器來進行客戶端信息認證。而後客戶端獲知對方IP後鏈接。
也能夠採用服務端轉發的方式,我的以爲這樣會耗費服務器資源。
固然,若是要保存聊天信息的話,也須要向服務器發送每一條記錄。
3.聊天圖形界面設計
我們如今來講說界面設計。
3-1.啓動窗體
啓動程序以後先進用戶認證,會彈出用戶名和密碼輸入窗體。
本程序沒有經過服務端認證(服務器沒有保存用戶信息),因此設計上考慮可擴展性,於是設計了這個認證狀體,實際上點擊login的時候進行的是本地認證(客戶端本身記着一個合法的用戶名和密碼)。
經過下面代碼來講明吧:
------------------------------------------------------------------------------------------------------------
GtkWidget *window
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//生成窗體
gtk_widget_set_size_request(window,450,380); //設置窗體大小
gtk_window_set_title(GTK_WINDOW(window),"glogin");//設置窗體標題
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);//窗體啓動時位置
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);//窗體是否可縮放
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);//點擊X觸發窗體銷燬
------------------------------------------------------------------------------------------------------------
有了窗體還得有按鈕啊,按鈕還得佈局啊,點擊後有觸發事件啊。。。等等,
這些就要用到fixed,button,以及label了。這裏就不一一說明了,請讀者參考官網接口說明書。
#本窗體設計的代碼量爲250L。
3-2.在登錄成功之後,就自動銷燬登錄窗體,生存新窗體,就是聊天界面了。
這個窗體就複雜多了,除了按鈕,還有文本框,並且支持滾動條。
#本窗體設計代碼量爲1000L。
羣聊與私聊功能的切換經過圖中的【Public】按鈕實現。可重複點擊,在羣裏與私聊之間轉換。在聊天中不可切換,需斷開當前聊天模式才能點擊按鈕,不然灰色狀態不可觸發。
Linux下圖形編程庫還有QT,顯得華麗,smplayer就是它的產品。還有curses字符圖形庫。請感興趣的讀者本身學習完善吧。