雷文禮等
摘 要: 隨著智能通信設備性能的日益提升,即時通信系統(tǒng)移植的需求也越來越高,作為一種基于IP協(xié)議的應用程序,即時通信系統(tǒng)能夠使不同智能設備的用戶進行通信。Linux作為一種開源的操作系統(tǒng)平臺,在開發(fā)即時通信系統(tǒng)方面具有很好的應用前景?;贚inux平臺采用Socket網絡編程設計并實現(xiàn)了即時網絡通信系統(tǒng),服務器經過測試后,能夠穩(wěn)定運行,客戶端圖形界面效果良好。該系統(tǒng)的設計為后續(xù)基于Linux平臺的軟件開發(fā)應用提供了參考和借鑒。
關鍵詞: Linux; 開源; Socket; 通信
中圖分類號: TN915.4?34 文獻標識碼: A 文章編號: 1004?373X(2015)17?0030?04
Design and implementation of communication software based on Linux platform
LEI Wenli, REN Xincheng, GAO Ying
(College of Physics and Electronic Information, Yanan University, Yanan 716000, China)
Abstract: With the improvement of intelligent communication equipment performance, the demand of instant communication system transplantation has become higher. As a kind of application program based on IP protocol, instant communication system can make different intelligent equipment users communicate with each other. As an open source operating system platform, Linux has better application prospect in developing instant communication system. The instant network communication system was designed and realized by using Socket network programming based on Linux platform. The tested server can operate stably, and the effect of GUI in client side is good. The system design provides the reference for subsequent software development and application based on Linux platform.
Keywords: Linux; open source; Socket; communication
0 引 言
在互聯(lián)網高度發(fā)達的今天,MSN,QQ等網絡聊天軟件,使世界各地的相互聯(lián)系越來越緊密,不論身在何處,只要上網,打開這些軟件,就可以和朋友聊天。Linux作為一個開源的操作系統(tǒng),正被越來越多的人認識并應用,它的特點在于操作系統(tǒng)源代碼的公開化[1]。然而,基于Linux平臺的聊天軟件仍然存在操作不夠人性化、交互界面不夠美觀等問題。因此,制作一個在Linux 操作系統(tǒng)下并且擁有人性化界面的即時通信工具,將給Linux操作系統(tǒng)的用戶帶來極大的方便。
本文基于Linux平臺采用Qt編程設計并實現(xiàn)了即時網絡通信系統(tǒng),并對該系統(tǒng)進行ADB在線調試,測試結果證明,設計的發(fā)送框和接收框的通信功能能夠順暢運行。本系統(tǒng)的設計為后期設計某些相關通信系統(tǒng)提供了部分應用基礎和開發(fā)經驗。
1 Linux平臺
Linux操作系統(tǒng)是Unix操作系統(tǒng)的一種克隆系統(tǒng),它誕生于1991年的10月5日(這是第一次正式向外公布的時間)。以后借助于Internet網絡,并經過全世界各地計算機愛好者的共同努力,現(xiàn)已成為今天世界上使用最多的一種Unix類操作系統(tǒng)[2],并且使用人數(shù)還在迅猛增長。
在Linux平臺上運行的軟件都是免費使用的,且可以隨意的改動代碼部分,只要他們是完全基于GNU的即可。
2 系統(tǒng)設計
本系統(tǒng)設計的基于Linux的聊天軟件采用C語言和Qt圖形開發(fā)軟件進行編寫,利用TCP方式進行連接[3?4]。通信服務方式整體采用C/S架構。
2.1 系統(tǒng)功能模塊劃分
(1) 服務器功能模塊劃分
登陸信息處理模塊:檢查登陸信息是否正確,并向客戶端返回登陸信息。如果信息正確,就將服務器端在線用戶信息發(fā)送給該用戶,并在服務器端將該用戶在線信息顯示出來。
聊天信息處理模塊:給指定的用戶發(fā)送消息。
申請信息處理模塊:注冊新用戶,確認后保存該用戶信息。
發(fā)布系統(tǒng)消息模塊:負責將用戶登錄信息發(fā)給每個客戶端,并改寫用戶在服務器端和客戶端的狀態(tài)。
整個服務器功能模塊圖如圖1所示[5]。
(2) 客戶端功能模塊劃分
登陸功能模塊:連接服務器并登陸,并返回登陸信息。
界面顯示模塊:顯示用戶好友及當前狀態(tài)。
聊天功能模塊:負責用戶間的聊天信息。
離線消息模塊:接收和發(fā)送離線消息,并做相應處理。
配置信息模塊:負責用戶基本信息配置。
2.2 服務器端設計
服務器開始運行后即處于監(jiān)聽狀態(tài),當監(jiān)聽到有客戶端發(fā)出連接請求時,服務器立刻進入消息處理流程,由于采用并發(fā)服務器,所以可同時響應多個請求。具體流程如圖2所示。
2.2.1 服務器主要變量和函數(shù)
服務器端用到的主要變量和函數(shù)如下:
套接字描述字:int sockfd, client_sockfd
套接字地址結構:struct sockaddr_in servAddr, cliAddr
線程ID標識:pthread_t pthd
線程調用函數(shù):void gif_handle_client(int client_sockfd)
發(fā)送聯(lián)系人狀態(tài)函數(shù):
void gif_send_clients_contact_list(chat *client_loginid,int client_sockfd, int type)
該函數(shù)的主要作用是當用戶的在線狀態(tài)發(fā)生變動時,服務器要及時地做出更新,并向該用戶的聯(lián)系人發(fā)送該用戶狀態(tài)變更后的信息。
獲取系統(tǒng)時間函數(shù):char *gif_get_system_time()
該函數(shù)讀取當前系統(tǒng)時間并隨消息一同發(fā)出。
2.2.2 服務器消息處理模塊的設計與實現(xiàn)
服務器的消息處理模塊主要由7部分組成,分別如下:
用戶登錄消息處理模塊:當服務器接收到用戶消息并判斷是登錄消息后,服務器將根據(jù)用戶發(fā)送過來的用戶名和密碼到users.db表中進行匹配,如果匹配成功則把該用戶加入到online.db表中,設置用戶在線狀態(tài)為真的,同時調用發(fā)送聯(lián)系人在線列表函數(shù),向添加該用戶為好友的用戶發(fā)送該用戶的上線信息。如果匹配不成功,服務器將發(fā)送登錄失敗消息給客戶端,要求用戶重新登錄。
添加好友信息處理模塊:當服務器收到用戶請求加好友的消息時,服務器首先在users.db中查找要被添加的用戶是否存在,如果該用戶存在則把該用戶的信息存儲到當前用戶的好友文件中,同時在被添加好友用戶的_as.db表中保存當前用戶的信息。
刪除好友信息處理模塊:當服務器接收到用戶的該消息請求時,服務器根據(jù)用戶提供的好友用戶名刪除被指定的好友,同時將用戶聯(lián)系人表進行更新,在被刪除的好友的被添加好友表_as.db中將當前用戶刪除。
用戶聊天信息轉發(fā)的處理模塊:當服務器判斷用戶所請求的信息為聊天消息后,服務器根據(jù)用戶所指定的聊天對象到online.db表中查找被指定用戶是否在線,如果被指定用戶在線則提取他的套接字地址結構,并按照該套接字信息將消息轉發(fā)。如果用戶不在線則將消息標識設定為離線消息,并將該消息寫入被指定用戶的離線消息文件中。
用戶下線消息處理模塊:當服務器判斷用戶所請求的信息為下線消息后,服務器將把用戶從online.db中刪除,設置該用戶狀態(tài)為下線,同時調用發(fā)送聯(lián)系人狀態(tài)函數(shù),將標志位設置為離線向該用戶的聯(lián)系人發(fā)送。
離線消息處理模塊:當服務器判斷用戶所請求的信息為讀取離線消息后,服務器讀用戶的離線消息文件,如果該文件中有被標識為新的離線消息時,服務器將把該消息提取出來發(fā)送給用戶,同時把該消息標識為已讀。
刪除離線消息處理模塊:如果客戶做出了刪除離線消息的動作,那么服務器端將會根據(jù)用戶的發(fā)送信息把該用戶的離線消息文件中的離線消息刪除。
2.3 客戶端設計
軟件的客戶端采用圖形化用戶接口方式,Qt圖形界面的主要特點就是事件觸發(fā),當某一窗體消息需要被處理時,處理引擎就會按照設計做出處理,圖3描述了客戶端的操作處理流程。
客戶端運行后,首先登錄服務器,如果登陸成功,服務器將在線的用戶信息發(fā)送給客戶端,此時客戶端即可查看到用戶信息。當用戶會話時,聊天信息窗體負責發(fā)送和接收用戶的聊天信息;用戶離線時,該信息通過服務器轉發(fā)方式發(fā)送給離線用戶,當對方上線時便可查看該離線消息。
2.3.1 客戶端主要窗口設計
本文設計的客戶端提供圖形用戶界面,程序運行后,在主窗體上點擊相應狀態(tài)的按鈕就會產生一個相應的操作,包括主窗體,登錄窗口,添加用戶窗口,系統(tǒng)消息窗口,離線消息窗口,聊天窗口。
主窗體:該窗體中包含了所有的用戶操作按鈕和好友列表,用戶的操作都在這個窗體中完成,如圖4所示。
當用戶的操作成功或者失敗時,系統(tǒng)會顯示一條消息給用戶,以便提示用戶操作是否成功。在相關的函數(shù)內將該窗口的激活屬性打開,消息窗口便會自動彈出并顯示消息,如圖5所示。
2.3.2 客戶端功能模塊的設計
用戶認證模塊:主要用到的函數(shù)為:connect(),send(),pthread_create()。當用戶啟動程序后,首先需要用戶登陸到服務器才能進一步對軟件進行操作,這一部分即為用戶認證模塊。
界面顯示模塊:當用戶成功登陸后,在聯(lián)系人列表中將會顯示用戶的聯(lián)系人信息,在離線消息窗口中會顯示接收到的離線消息,這兩個視圖均是用列表視圖來實現(xiàn)的。
消息處理模塊:當客戶端和服務器建立連接后,客戶端會創(chuàng)建一個專門的線程維護客戶端和服務器之間的連接,該線程調用函數(shù)根據(jù)從服務器接收到的消息類型選擇消息處理模塊。
更新聯(lián)系人列表信息:當判斷接收到的消息為GIF_ADDRLIST_MSG時,程序將對聯(lián)系人視圖進行刷新以便及時地顯示聯(lián)系人的當前狀態(tài)。實現(xiàn)刷新的方法是,先將以前的樹移除,然后按照新的聯(lián)系人狀態(tài)進行樹的繪制。
聊天信息:當接收服務器發(fā)送的消息類型為GIF_CHAT_MSG時,程序首先要確定是誰發(fā)出的聊天請求,然后判斷聊天窗口是否開啟,如果未開啟則將開啟標識設為真,然后打開聊天窗口。同時設置用戶和聯(lián)系人的顯示顏色,以便區(qū)分聊天消息的來源。
消息請求成功或失敗信息:如果接收到了GIF_SUCCESS_N_ERROR_MSG類型的消息,則程序還會進一步根據(jù)另外一個標識符判斷是何種系統(tǒng)消息,并通過系統(tǒng)消息窗口顯示給用戶。
離線消息:如果接收到的消息類型為GIF_OFFLINE_MSG,程序會按照界面顯示模塊中對樹視圖的創(chuàng)建步驟,創(chuàng)建一個顯示離線消息的視圖用來顯示離線消息。
以上幾大模塊構成了客戶端功能處理的主體,大部分操作和消息處理都是由這些模塊完成。
3 結 語
本文采用Qt編程技術,設計并實現(xiàn)了基于Linux平臺的聊天軟件功能,詳細描述了系統(tǒng)服務器端和客戶機端的實現(xiàn)過程,并對系統(tǒng)的工作流程和原理進行了詳細論述。服務器經過測試后,能夠穩(wěn)定運行,客戶端圖形界面效果良好。本系統(tǒng)的設計為后續(xù)基于Linux平臺的軟件開發(fā)應用提供了參考和借鑒。
參考文獻
[1] 黃偉敏.基于XMPP協(xié)議的Android即時通信系統(tǒng)設計[J].電子設計工程,2011,19(8):57?59.
[2] 毛紅閣,郭紅,陳東,等.Android移動通信序列化協(xié)議研究[J].南陽師范學院學報,2012,11(6):47?49.
[3] 攀建.ASP.NET+ADO.NET項目開發(fā)實例[M].北京:清華大學出版社,2004.
[4] JONES A R.ASP.NET從入門到精通[M].高春蓉,谷宇,閻雋,等譯.北京:電子工業(yè)出版社,2002.
[5] WORLEY S.ASP.NET技術內幕[M].王文龍,劉湘寧,譯.北京:人民郵電出版社,2002.
[6] 吉昂,袁杰,卞春華.Linux平臺上的網絡測試系統(tǒng)研究[J].現(xiàn)代電子技術,2010,33(20):110?113.