亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Linux平臺(tái)下基于GTK+的聊天室設(shè)計(jì)

        2012-10-27 06:35:14余長(zhǎng)江周淵平呂海龍
        通信技術(shù) 2012年5期
        關(guān)鍵詞:網(wǎng)絡(luò)通信程序

        余長(zhǎng)江, 周淵平, 呂海龍

        (四川大學(xué) 電子信息學(xué)院,四川 成都 610065)

        0 引言

        Linux作為一種開放源代碼的操作系統(tǒng),對(duì)于軟件未來(lái)的發(fā)展方向起著一定的引導(dǎo)作用,其主要特點(diǎn)有:源代碼完全開放;具有多用戶特性并支持多進(jìn)程與多線程;系統(tǒng)安全性可靠;擁有良好的用戶界面;網(wǎng)絡(luò)功能強(qiáng)大;支持多平臺(tái);良好的兼容性等等。由于 Linux系統(tǒng)的諸多特性,使其在服務(wù)器和個(gè)人應(yīng)用以及企業(yè)開發(fā)領(lǐng)域中的應(yīng)用越來(lái)越普遍[1],在Linux環(huán)境下開發(fā)圖形界面也成為了眾多編程者的選擇。

        GIMP是一種基于 Linux平臺(tái)且能與Photoshop相媲美的圖像處理軟件,而 GTK+最初則是 GIMP的專用開發(fā)庫(kù),后來(lái)逐漸發(fā)展為L(zhǎng)inux下開發(fā)圖形界面應(yīng)用程序的主流工具之一,它使用 C語(yǔ)言開發(fā),可以靈活的應(yīng)用于不同系統(tǒng),備受開源軟件開發(fā)者矚目。GTK+具有的特性如下:動(dòng)態(tài)類型系統(tǒng);用C語(yǔ)言編寫對(duì)象系統(tǒng);實(shí)現(xiàn)了繼承、類型檢驗(yàn),以及信號(hào)/回調(diào)函數(shù)的基礎(chǔ)結(jié)構(gòu);類型和對(duì)象系統(tǒng)不特別針對(duì)GUI;GTK Widget對(duì)象使用對(duì)象系統(tǒng),它定義了GTK+的圖形組件的使用接口;大量的 GTKWidget構(gòu)件[2]。GTK+2.0的協(xié)議 GNU寬通用公共許可證(LGPL,GNU Lesser General Public License),允許任何開發(fā)者使用(包括那些開發(fā)中的專利軟件)且不收取任何費(fèi)用。GTK+2.0是當(dāng)今唯一100%零付費(fèi)的工業(yè)級(jí)的圖形界面開發(fā)工具 。采用GTK+2.0編程技術(shù)設(shè)計(jì)出一個(gè)聊天室,再結(jié)合多線程技術(shù),可實(shí)現(xiàn)在服務(wù)器端和客戶端之間的聊天功能。

        1 聊天窗口的設(shè)計(jì)

        本聊天室分為服務(wù)器端和客戶端兩部分,采用GTK+2.0,即可用簡(jiǎn)短的代碼來(lái)編寫窗口并向窗口中插入各個(gè)控件,通過(guò)靈活地使用信號(hào)/回調(diào)函數(shù)機(jī)制,實(shí)現(xiàn)通信連接、信息發(fā)送、關(guān)閉窗口等功能,聊天室如圖1和圖2所示。首先運(yùn)行服務(wù)器端,單擊“開啟”按鈕后服務(wù)器端等待客戶端連接,再運(yùn)行客戶端,在登陸框輸入服務(wù)器端IP,單擊“登錄”按鈕即可與服務(wù)器端連接,然后雙方就可以進(jìn)行通信了。

        圖1 服務(wù)器端聊天室

        圖2 客戶端聊天室

        2 聊天過(guò)程的實(shí)現(xiàn)

        聊天過(guò)程采用TCP/IP協(xié)議下的Client/Server網(wǎng)絡(luò)通信模式實(shí)現(xiàn),通過(guò)套接字(Socket)接口可方便的實(shí)現(xiàn)TCP、UDP傳輸協(xié)議完成數(shù)據(jù)的網(wǎng)絡(luò)傳輸[4],對(duì)可靠性要求高的數(shù)據(jù)通訊系統(tǒng)往往使用TCP協(xié)議傳輸數(shù)據(jù) 。Socket是網(wǎng)絡(luò)通信的基本構(gòu)件,可看作網(wǎng)絡(luò)通信的一個(gè)端點(diǎn),在網(wǎng)絡(luò)通信中使用 Socket函數(shù)必須有客戶和服務(wù)器2個(gè)進(jìn)程,以實(shí)現(xiàn)網(wǎng)絡(luò)端點(diǎn)之間的連接和數(shù)據(jù)交換[6]。在雙方進(jìn)行通信前,要先運(yùn)行服務(wù)器端程序,等待客戶端的連接。開啟服務(wù)器端后主要有以下工作。

        (1)建立一個(gè)socket通信

        調(diào)用函數(shù)socket(int domain, int type, int protocol)來(lái)建立一個(gè)套接字,即向系統(tǒng)注冊(cè),通知系統(tǒng)建立一個(gè)通信端口。參數(shù) domain 表示所采用的地址類型,此處取值為AF_INET,即ARPA internet地址格式;type為新套接口的類型描述,取值為SOCK_STREAM,表示提供雙向連續(xù)且可信賴的數(shù)據(jù)流,即 TCP;protocol表示 socket所使用傳輸協(xié)議的編號(hào),通常取值為0。若成功則返回一個(gè)socket描述符。

        (2)對(duì) socket定位

        調(diào)用函數(shù) bind(int sockfd, struct sockaddr *my_addr, int addrlen)將新建的套接字與本地網(wǎng)絡(luò)地址聯(lián)系起來(lái)。sockfd即為調(diào)用socket函數(shù)后所返回的socket描述符;my_addr為包含本機(jī)IP地址和端口號(hào)的指針;addrlen為sockaddr的結(jié)構(gòu)長(zhǎng)度。

        (3)等待客戶端的連接

        調(diào)用函數(shù)listen(int sockfd, int backlog)使socket處于監(jiān)聽(tīng)模式。參數(shù)backlog表示同時(shí)能處理的最大連接數(shù)目。listen()并未開始接收連線,只是設(shè)置socket為監(jiān)聽(tīng)模式,調(diào)用accept()成功后才是真正接收客戶端的連線。所以listen()應(yīng)該在socket(),bind()之后,在accept()之前調(diào)用。

        (4)接收客戶端socket連線

        調(diào)用函數(shù)accept(int sockfd, struct sockaddr *addr,int *addrlen)來(lái)接收客戶端的連線請(qǐng)求。sockfd是被監(jiān)聽(tīng)的socket的描述符;連線成功后,addr所指的結(jié)構(gòu)會(huì)被填入客戶端主機(jī)的地址數(shù)據(jù);addrlen是sockaddr的結(jié)構(gòu)長(zhǎng)度。若連接成功則返回新的socket處理代碼。

        相對(duì)服務(wù)器端復(fù)雜的過(guò)程而言,客戶端的工作比較簡(jiǎn)單。

        運(yùn)行客戶端程序后,在登錄框輸入服務(wù)器端IP地址,該點(diǎn)間隔地址將被函數(shù) inet_addr()轉(zhuǎn)換成in_addr結(jié)構(gòu)的地址,然后單擊“登陸”按鈕,此時(shí)程序首先調(diào)用函數(shù)socket(),像服務(wù)器端那樣建立一個(gè)套接字,然后調(diào)用函數(shù) connect(int sockfd, struct sockaddr *serv_addr, int addrlen)將客戶端連接至服務(wù)器端。sockfd即為新建的客戶端的socket描述符;serv_addr所指向的結(jié)構(gòu)被填入經(jīng) inet_addr()轉(zhuǎn)換后的地址;參數(shù)addrlen為sockaddr的結(jié)構(gòu)長(zhǎng)度。

        客戶端與服務(wù)器端連接成功后,雙方即可進(jìn)行通信,send()和recv()這兩個(gè)函數(shù)用來(lái)在面向連接的socket上進(jìn)行數(shù)據(jù)傳輸,其調(diào)用方式如下:

        1)函數(shù)send(int sockfd, const void *msg, int len,int flags)用來(lái)發(fā)送數(shù)據(jù)。sockfd是建立好連接的socket描述符;msg指針指向要發(fā)送的數(shù)據(jù);len是以字節(jié)為單位的數(shù)據(jù)的長(zhǎng)度,flags設(shè)置為0。

        2)函 數(shù) recv(int sockfd, void *buf, int len,unsigned int flags)用來(lái)接收數(shù)據(jù)。sockfd是建立好連接的socket描述符;buf指向存放接收數(shù)據(jù)的緩沖區(qū);len是緩沖的長(zhǎng)度;flags設(shè)置為0。

        3 多線程技術(shù)

        進(jìn)入聊天程序后,程序要不斷檢測(cè)是否有新的信息發(fā)送過(guò)來(lái),如果只是簡(jiǎn)單的采用無(wú)限循環(huán)這個(gè)操作,程序會(huì)進(jìn)入死機(jī)狀態(tài),此時(shí)就無(wú)法進(jìn)行發(fā)送信息等其他的操作了,而使用多線程技術(shù),就可將接收信息的操作置于一個(gè)新的線程,從而避免無(wú)法發(fā)送信息的情況。所謂多線程,就是將一個(gè)進(jìn)程分成多個(gè)執(zhí)行線程,各個(gè)線程可以獨(dú)立運(yùn)行。多線程程序采用一種多任務(wù)、并發(fā)的工作方式,主要優(yōu)點(diǎn)有:提高應(yīng)用程序的響應(yīng);更有效的使用多處理器;改善程序結(jié)構(gòu);占用較少的系統(tǒng)資源。

        在 main函數(shù)中創(chuàng)建多個(gè)線程,則該程序運(yùn)行時(shí),操作系統(tǒng)為每個(gè)線程分配不同的CPU時(shí)間片,并根據(jù)線程優(yōu)先級(jí)進(jìn)行調(diào)度。由于每個(gè)時(shí)間片的時(shí)間很短,雖然實(shí)際上同一時(shí)刻只有一個(gè)線程在運(yùn)行,但是看上去好像多個(gè)線程是并發(fā)運(yùn)行[7]。客戶端程序中的多線程代碼框架如下:

        若使用線程,在初始化 GTK+庫(kù)函數(shù)之前必須運(yùn)行 g_thread_init(NULL)和 gdk_threads_init()來(lái)初始化線程應(yīng)用。創(chuàng)建線程調(diào)用函數(shù)g_thread_create(),如上面程序中,g_thread_create()函數(shù)用來(lái)生成接收消息的線程,get_message()即為線程的具體事件回調(diào)函數(shù)。當(dāng)線程例程(即線程執(zhí)行的代碼)開始時(shí),通過(guò)gdk_threads_enter()來(lái)獲得一個(gè)唯一的全局鎖,當(dāng)線程例程返回時(shí),通過(guò)gdk_threads_leave()釋放該全局鎖。線程創(chuàng)建成功后,新創(chuàng)建的線程開始運(yùn)行回調(diào)函數(shù)且不影響原來(lái)的線程繼續(xù)運(yùn)行。同樣,服務(wù)器端的多線程編程與此類似。

        4 結(jié)語(yǔ)

        隨著開源編程的迅猛發(fā)展,在Linux下開發(fā)程序已成為一種潮流,XWindow和 GNU編譯系統(tǒng)已成為L(zhǎng)inux上最主要的軟件系統(tǒng),GTK+作為這兩者相結(jié)合的編程開發(fā)包更是廣受歡迎。通過(guò)對(duì)GTK+編程技術(shù)的研究,設(shè)計(jì)了一個(gè)簡(jiǎn)單的聊天室,采用TCP/IP協(xié)議下的Client/Server網(wǎng)絡(luò)通信模式,詳細(xì)介紹了聊天時(shí)雙方通信的建立和信息收發(fā)的方法,再結(jié)合多線程技術(shù),實(shí)現(xiàn)了雙方正常的聊天功能。

        [1]初振林.Linux安全強(qiáng)化方案[J].信息安全與通信保密,2007(11):49-50.

        [2]張同光,潘紅.Linux中GTK+編程技術(shù)研究及其應(yīng)用[J].軟件導(dǎo)刊, 2007(08):38-40.

        [3]宋國(guó)偉.GTK+2.0編程范例[M].北京:清華大學(xué)出版社,2002.

        [4]陳周國(guó).基于Linux QT技術(shù)的遠(yuǎn)程監(jiān)控GUI設(shè)計(jì)[J].通信技術(shù), 2009, 42(12):234-236.

        [5]李磊,劉嘉勇.關(guān)于對(duì) QQ文件傳輸特點(diǎn)的研究[J].信息安全與通信保密, 2011(04):36-37.

        [6]曹玲芝.基于DDE和Socket技術(shù)的網(wǎng)絡(luò)控制系統(tǒng)仿真平臺(tái)[J].通信技術(shù), 2009,42(08):30-33.

        [7]金衛(wèi)民,魯志康.GTK環(huán)境下的多線程設(shè)計(jì)[J].微計(jì)算機(jī)信息, 2008, 24(07):310-312.

        猜你喜歡
        網(wǎng)絡(luò)通信程序
        海上軍用網(wǎng)絡(luò)通信的安全控制技術(shù)
        基于網(wǎng)絡(luò)通信的智能照明系統(tǒng)設(shè)計(jì)
        電子制作(2019年15期)2019-08-27 01:11:48
        試論我國(guó)未決羈押程序的立法完善
        計(jì)算機(jī)網(wǎng)絡(luò)通信常見(jiàn)問(wèn)題與技術(shù)發(fā)展研究
        電子制作(2018年10期)2018-08-04 03:24:46
        網(wǎng)絡(luò)通信中信息隱藏技術(shù)的應(yīng)用
        基于網(wǎng)絡(luò)通信的校園智能音箱設(shè)計(jì)
        電子制作(2018年1期)2018-04-04 01:48:30
        失能的信仰——走向衰亡的民事訴訟程序
        談?dòng)?jì)算機(jī)網(wǎng)絡(luò)通信常見(jiàn)問(wèn)題及技術(shù)發(fā)展
        電子制作(2017年17期)2017-12-18 06:41:06
        “程序猿”的生活什么樣
        英國(guó)與歐盟正式啟動(dòng)“離婚”程序程序
        亚洲中文字幕第一页免费| 亚洲综合色一区二区三区小说| 国产尻逼视频| 免费观看在线一区二区| 国产剧情无码中文字幕在线观看不卡视频| 淫秽在线中国国产视频| 日韩精品人妻久久久一二三| 久久久久久久久蜜桃| 囯产精品无码va一区二区| 丝袜美腿诱惑一二三区| 亚洲av免费手机在线观看| 性一交一乱一伧国产女士spa | av资源在线永久免费观看| 国产又大大紧一区二区三区| 亚洲日韩成人无码| 精品国内自产拍在线观看| 亚洲公开免费在线视频| 日本a级片一区二区三区| av中文字幕一区不卡| 久久久久人妻一区精品色欧美| 无码熟妇人妻AV影音先锋| 免费国产自拍视频在线观看| 欧美性色欧美a在线播放| 国产免费av片在线观看播放| 欧美日韩高清一本大道免费| 久久少妇呻吟视频久久久| 亚洲精品视频在线一区二区| 天码人妻一区二区三区| 国产乱子伦精品免费女| 国产在线观看一区二区三区av| 亚洲国产成人一区二区精品区| 人妻去按摩店被黑人按中出| 国产一区二区三区四区色| 国产香蕉一区二区三区在线视频| 国产无遮挡又黄又爽在线观看| 日韩亚洲制服丝袜中文字幕 | 国产激情一区二区三区在线| 亚洲av无码一区二区三区人妖 | 99在线国产视频| 日本一二三区免费在线| 国产精品无码av无码|