国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Linux下基于Qt4的跨平臺聊天系統(tǒng)設(shè)計

2014-07-24 04:59吳捷杜慶平
電腦知識與技術(shù) 2014年15期
關(guān)鍵詞:跨平臺

吳捷++杜慶平

摘要:在對當(dāng)前聊天系統(tǒng)研究和分析的基礎(chǔ)上,針對企業(yè)的實際需求,設(shè)計和開發(fā)了一種基于Qt4的跨平臺聊天系統(tǒng),該軟件能夠在局域網(wǎng)內(nèi)部實現(xiàn)消息的即時傳遞。詳細(xì)描述了系統(tǒng)的基本框架以及運行流程,重點講述了利用UDP 實現(xiàn)高效可靠傳輸?shù)幕驹砗蛯崿F(xiàn)方法。軟件采用典型的C/S(服務(wù)器/客戶端)架構(gòu),用Socket編程設(shè)計網(wǎng)絡(luò)通訊。運行結(jié)果表明,該系統(tǒng)工作情況良好。

關(guān)鍵詞:Qt4;跨平臺;UDP;Socket編程

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)15-3535-03

An Implementation of Cross-platform Chat Room Application Based on QT4 in LINUX

WU Jie, DU Qing-ping

(School of Information and Engineering, Taizhou Polytechnic College,Taizhou 225300, China )

Abstract: On the basis of research and analysis on existing chat system, and according to the requirements of enterprise, the developer designs and develops a system of cross-platform chat room which is based on Qt4. This software can realize the real-time delivery of messages on the LAN. This paper introduces the basic framework of this software and operation process, focusing on the basic principle and the implement method to achieve efficient and reliable transmission using UDP. The software uses typical C/S (client / server) architecture, socket programming of network communication. The results show that the system runs well.

Key words: Qt4; cross-platform; UDP; Socket programming

科學(xué)技術(shù)日新月異,全球信息化進(jìn)程飛速發(fā)展,計算機和網(wǎng)絡(luò)已經(jīng)成為這個時代的“信息基礎(chǔ)設(shè)施”。對企業(yè)而言,借助于網(wǎng)絡(luò),可以簡化信息流程,提高信息交換的速度,從而提高工作效率。在企業(yè)內(nèi)部,員工之間的信息交互是非常頻繁的,在交互過程中,避免企業(yè)內(nèi)部機密通過Internet泄露到外部是每個企業(yè)管理者需要重點考慮的問題。為了解決上述問題,人們提出了開發(fā)局域網(wǎng)聊天軟件的構(gòu)想,通過局域網(wǎng)聊天軟件,企業(yè)員工可以進(jìn)行即時消息傳遞,召開網(wǎng)絡(luò)會議,發(fā)送內(nèi)部文件等,在進(jìn)行信息交互的同時又保護了企業(yè)內(nèi)部信息的安全性。

聊天系統(tǒng)的實現(xiàn)有多種方式,其中比較流行的一種是基于Socket的集中式聊天系統(tǒng)[1]。這種聊天系統(tǒng)一般采用C/S(服務(wù)器/客戶端)架構(gòu),其中服務(wù)器端實現(xiàn)與客戶端的連接,接收來自客戶端的聊天消息,并且根據(jù)客戶端的要求把這些信息轉(zhuǎn)發(fā)到另外一個或多個聊天客戶中。并實現(xiàn)對客戶端登錄用戶的管理與控制,實現(xiàn)客戶端聊天信息的監(jiān)控與保存??蛻舳藢崿F(xiàn)與服務(wù)器端的連接,向服務(wù)器發(fā)送本客戶的聊天內(nèi)容,同時從服務(wù)器接受對方的響應(yīng),實現(xiàn)與其他用戶的文本的發(fā)送,并實現(xiàn)聊天的功能。

近年來關(guān)于局域網(wǎng)聊天系統(tǒng)研究與設(shè)計方面的文獻(xiàn)并不多,只有唐強等人[1-3] 做了相關(guān)工作。其中文獻(xiàn)1基于Windows和Qt設(shè)計了一個局域網(wǎng)聊天系統(tǒng);文獻(xiàn)2基于Linux和Qt設(shè)計了一個局域網(wǎng)聊天系統(tǒng);文獻(xiàn)3同樣是基于Linux和Qt設(shè)計了一個嵌入式聊天系統(tǒng);這三篇文獻(xiàn)的共同特點是使用Qt作為開發(fā)工具,用Socket編程設(shè)計網(wǎng)絡(luò)通訊,在網(wǎng)絡(luò)協(xié)議的選擇上都使用了TCP協(xié)議。使用TCP協(xié)議進(jìn)行事務(wù)處理時,每個客戶端都必須與服務(wù)器端保持連接狀態(tài)。這一方面需要消耗一定的服務(wù)器資源,另一方面,當(dāng)存在大量客戶端時,與每一個客戶端保持連接狀態(tài)是不現(xiàn)實的,因為通常Socket都有最大連接數(shù)限制,因此,該文改用無連接的UDP協(xié)議解決此問題。

本文設(shè)計并實現(xiàn)了一個跨平臺局域網(wǎng)聊天系統(tǒng),軟件的開發(fā)是在Linux下結(jié)合Qt4完成的,選擇UDP作為網(wǎng)絡(luò)通信協(xié)議,運用Socket編程實現(xiàn)網(wǎng)絡(luò)通訊,所開發(fā)軟件適合在企事業(yè)單位內(nèi)部使用,并可以快速移植到嵌入式設(shè)備中。

1 相關(guān)技術(shù)分析

1) Linux系統(tǒng)

Linux是一種自由和開放源碼的類Unix操作系統(tǒng),可運行在X86、Alpha、Sparc、MIPS、PPC、Motorola、NEC、ARM 等多種硬件平臺。如今越來越多的企業(yè)和研發(fā)機構(gòu)都轉(zhuǎn)向Linux 的開發(fā)和研究, 特別是在新興的嵌入式領(lǐng)域內(nèi)Linux獲得了飛速發(fā)展,得到了極其廣泛的應(yīng)用。Linux下的界面編程主要是通過Qt或者GTK[4]來實現(xiàn)。

2) Qt技術(shù)

Qt是諾基亞公司開發(fā)的一個跨平臺的C++圖形用戶界面應(yīng)用程序框架。Qt是完全面向?qū)ο蟮模苋菀讛U展,并且允許真正地組件編程,Qt也是流行的Linux桌面環(huán)境KDE的基礎(chǔ)。Qt具有優(yōu)良的跨平臺性、面向?qū)ο?,豐富的API、大量的開發(fā)文檔等優(yōu)點。Qt的“一次編寫,到處編譯”的特點使其非常易于部署在不同平臺之上。近年來,很多學(xué)者都選擇使用Qt開發(fā)應(yīng)用系統(tǒng)[5-7]。endprint

3) UDP協(xié)議

UDP協(xié)議的全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡(luò)中它被用于處理UDP數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。雖然UDP協(xié)議在可靠性方面不如TCP協(xié)議,但效率卻比TCP高,當(dāng)每次傳送的數(shù)據(jù)量很少而且網(wǎng)絡(luò)質(zhì)量較高時,UDP也同樣可以達(dá)到實用的可靠性要求。應(yīng)用于局域網(wǎng)的聊天系統(tǒng)非常適合采用UDP協(xié)議。

4) Socket編程

為了提供進(jìn)程間通信的一般方法和允許使用復(fù)雜的協(xié)議,實現(xiàn)不同主機之間的通信,Linux 使用了一種稱之為套接字(socket)的機制。套接字是一種雙向的通信端口,一對互聯(lián)的套接字提供通信接口,使兩端可以傳送數(shù)據(jù)。每一個套接字都是一個數(shù)據(jù)通信通道。在兩個進(jìn)程通過套接口建立連接后,它們就使用套接口描述字來從套接口中讀取數(shù)據(jù),并向套接口寫數(shù)據(jù)。

基于Socket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機制。它的實現(xiàn)無需對企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動,具有實現(xiàn)成本低廉的優(yōu)點,它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。

2 系統(tǒng)設(shè)計與實現(xiàn)

2.1 系統(tǒng)架構(gòu)

本系統(tǒng)采用客戶機/服務(wù)器(C/S)體系結(jié)構(gòu)。網(wǎng)絡(luò)通信雙方角色上分為服務(wù)器端與客戶端,如圖1。

服務(wù)器端處理流程:建立套接字(socket())→綁定IP地址和端口號(bind())→客戶端將連接此IP地址和端口號→接收客戶端的數(shù)據(jù)請求(recvfrom())→事務(wù)處理→向客戶端發(fā)送應(yīng)答數(shù)據(jù)(send())→關(guān)閉服務(wù)器端socket。

客戶端處理流程:建立套接字(socket())→向服務(wù)器發(fā)送請求數(shù)據(jù)(sendto())→等待服務(wù)器應(yīng)答數(shù)據(jù)(recvfrom())→關(guān)閉客戶端socket。

以上流程是一個單一事務(wù)流程.實際應(yīng)用中需要進(jìn)行多事務(wù)處理,因此本系統(tǒng)設(shè)計時還考慮了如下幾個問題:

1)因為UDP是無連接狀態(tài),服務(wù)器端并不能感知客戶端的存在,同樣客戶端也不能感知服務(wù)器端的存在。所以必須有一種機制能讓對方知道彼此的存在狀態(tài)??蛻舳硕〞r向服務(wù)器端發(fā)送UDP數(shù)據(jù)包(稱為sync同步數(shù)據(jù)包)。服務(wù)器端定時檢查客戶端登錄狀態(tài),如果最后更新時間超過域設(shè)值,我們將認(rèn)為客戶端已斷開連接。

2)sync同步設(shè)計原則,數(shù)據(jù)包大小盡量少,服務(wù)器端處理此包所占資源盡量少,定時設(shè)置長度適中。

3)在服務(wù)器端客戶登錄信息的存儲方式問題。因為客戶端的連接數(shù)可能非常龐大,因此一個簡單的list隊列已不能滿足性能需求。我們采用哈希表來解決此問題。

4)事務(wù)包的設(shè)計問題。TCP有流的嚴(yán)格控制,數(shù)據(jù)的發(fā)送先后順序必須在服務(wù)器端得以保證;但UDP沒有流控制,客戶端向服務(wù)器端發(fā)送后就不管了,有可能先發(fā)送的包在服務(wù)器端后接收到。因此,為了保證數(shù)據(jù)完整性,一個完整的數(shù)據(jù)包不允許分開兩個數(shù)據(jù)塊發(fā)送。在服務(wù)器端也是一次性接收一個完整的數(shù)據(jù)包。

2.2 系統(tǒng)功能

本系統(tǒng)支持的主要功能如下:

用戶登陸;

用戶與系統(tǒng)交互,進(jìn)行文字傳送;

用戶好友登陸后,自動刷新列表;

聊天記錄的保存;

清空聊天記錄;

系統(tǒng)在實際開發(fā)時,沒有直接進(jìn)行套接字編程。因為 Qt中提供的Socket完全使用了類的封裝機制,使用戶不需要接觸底層的各種結(jié)構(gòu)體操作。并且,由于采用了其自身的信號和槽(signal—slot)機制,使編寫的程序更容易被理解[6]。在開發(fā)過程中主要使用了Qt封裝的QUdpSocket。下面就服務(wù)器端和客戶端的主要實現(xiàn)方法進(jìn)行具體分析。

1)UDP的服務(wù)器端

先創(chuàng)建一個QUdpSocket對象,綁定服務(wù)器端口號,監(jiān)聽客戶端請求。部分代碼如下:

void MainWindow::initSocket()

{

//綁定端口

udpSocket.bind(8888);

//接收消息信號槽 QObject::connect(&udpSocket,SIGNAL(readyRead()),this,SLOT(processDatagram()));

}

2)UDP的客戶端

創(chuàng)建一個綁定好端口的QUdpSocket對象,當(dāng)QUdpSocket對象每次要讀入一個新數(shù)據(jù)的時候,就發(fā)送信號readyRead();再來就是編寫我們自定義的接收數(shù)據(jù)函數(shù)了,利用QUdpSocket的readDatagram()函數(shù)即可獲取數(shù)據(jù)。部分代碼如下:

void Server::recvMessage(QByteArray *data)

{while(udpSocket→hasPendingDatagrams())

{data→resize(udpSocket→pendingDatagramSize()) udpSocket→readDatagram(data→data(),data→size(),&serv_ip,&serv_port);

}}

2.3 系統(tǒng)運行

系統(tǒng)開發(fā)完成后,在RedHat Linux企業(yè)版6下面運行該系統(tǒng)的服務(wù)器端和客戶端,運行結(jié)果良好(如圖1、圖2)。

圖1 客戶端登陸界面 圖2 服務(wù)器端登錄信息

圖1是客戶端登陸之后的界面,從中可以看到每個用戶都能從自己的用戶列表中看到系統(tǒng)中當(dāng)前在線的用戶;圖2是服務(wù)器端運行之后的界面,其中包含客戶端的登陸信息,并且可以給客戶端群發(fā)消息;該系統(tǒng)也可以在Windows下重新編譯代碼,或者經(jīng)過交叉編譯移植到嵌入式系統(tǒng)中進(jìn)行測試,在這里就不詳細(xì)敘述了。

3 結(jié)束語

本文在成熟的Linux操作系統(tǒng)下,采用Qt跨平臺的C++圖形用戶界面應(yīng)用程序框架,設(shè)計并實現(xiàn)了一個局域網(wǎng)聊天系統(tǒng)。該系統(tǒng)采用UDP作為通信協(xié)議,可以實現(xiàn)高效的信息傳輸,并且能在多個平臺下編譯運行,可移植性很強。將來的改進(jìn)方向主要是進(jìn)一步優(yōu)化系統(tǒng)界面,增強其功能,使之成為一款成熟的產(chǎn)品投入使用。

參考文獻(xiàn):

[1] 唐強.基于C/S 架構(gòu)的局域網(wǎng)通信工具設(shè)計[J].計算機光盤軟件與應(yīng)用,2012 (21):191-192.

[2] 王蘇敏,陳淦,廖晶晶.Linux下基于QT的局域網(wǎng)聊天系統(tǒng)[J].計算機光盤與軟件,2012 (22):130-132.

[3] 趙祖龍.基于Qt /Embedded的嵌入式跨平臺聊天系統(tǒng)設(shè)計[J].信息技術(shù),2010 (12):144-147.

[4] 林慶,呂智慧,李松年,等.基于Linux平臺同步教學(xué)課件播放工具的設(shè)計與實現(xiàn)[J].計算機應(yīng)用與軟件,2008,25(2):4-6,23.

[5] 蔣業(yè)軍,葉艷,吳敏.基于Qt 的計算機輔助英語系統(tǒng)的考試作答系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機應(yīng)用與軟件,2012,29(12):196-197,236.

[6] 周名陽,韓秀玲.基于Qt的圖像數(shù)據(jù)網(wǎng)絡(luò)傳輸應(yīng)用研究[J].計算機工程與設(shè)計,2011,32(6):1901-1905.

[7] 劉超,周紀(jì)超,張紅星.基于Linux Qt的列車人機界面設(shè)計與實現(xiàn)[J].計算機與現(xiàn)代化,2013(4):215- 219.

猜你喜歡
跨平臺
跨層級網(wǎng)絡(luò)、跨架構(gòu)、跨平臺的數(shù)據(jù)共享交換關(guān)鍵技術(shù)研究與系統(tǒng)建設(shè)
一款游戲怎么掙到全平臺的錢?
潛力雙跨平臺:進(jìn)階:誰將跨入下一個“十大”?
跨平臺APEX接口組件的設(shè)計與實現(xiàn)
基于C++語言的跨平臺軟件開發(fā)的設(shè)計
基于C++語言的跨平臺軟件開發(fā)
移動互聯(lián)網(wǎng)應(yīng)用跨平臺開發(fā)
一種虛擬現(xiàn)實應(yīng)用程序跨平臺方法的研究
基于QT的跨平臺輸電鐵塔監(jiān)控終端軟件設(shè)計與實現(xiàn)
基于OPC跨平臺通信的電機監(jiān)測與診斷系統(tǒng)
阜宁县| 读书| 缙云县| 顺昌县| 蒙城县| 容城县| 阿克陶县| 景洪市| 通山县| 门头沟区| 樟树市| 巧家县| 盘锦市| 天全县| 太仆寺旗| 甘泉县| 甘南县| 玉环县| 东平县| 蓬溪县| 台中县| 石狮市| 樟树市| 肇东市| 太谷县| 遵化市| 寿宁县| 任丘市| 清镇市| 涡阳县| 金山区| 天等县| 娄烦县| 荥阳市| 大方县| 玛纳斯县| 金山区| 全州县| 都江堰市| 北川| 三河市|