基于linux的socket網(wǎng)絡(luò)編程聊天工具課程設(shè)計_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  摘 要</b></p><p>  這個課程設(shè)計整體采用在linux平臺下,在同一局域網(wǎng)內(nèi)實現(xiàn)聊天功能。整體框架主要分為服務(wù)端和客戶端兩個部分,設(shè)置好ip和端口號,在Linux下編譯和調(diào)試兩主大塊程序,實現(xiàn)服務(wù)端和客戶端的連接,然后以服務(wù)端作為中繼轉(zhuǎn)實現(xiàn)客戶端之間的通信。使用socket網(wǎng)絡(luò)編程采用TCP/IP協(xié)議保證連接可靠,并在項目管理中采用linux流行的

2、gcc和makefile編譯,提高了編譯和調(diào)試效率,加快了項目的完成速度。</p><p>  本次設(shè)計的聊天工具采用字符串命令行的方式進行通信,主要實現(xiàn)了五個功能:用戶之間一對一的聊天、編輯、換行、用戶之間聊天記錄保存、聊天記錄調(diào)取。經(jīng)過測試,程序運行可靠,能滿足在linux中實現(xiàn)網(wǎng)絡(luò)聊天的要求。</p><p>  關(guān)鍵詞 linux,socket,gedit,服務(wù)端,客戶端,網(wǎng)絡(luò)編

3、程</p><p><b>  Abstract</b></p><p>  The course design of the overall use in the Linux platform, within the same LAN chat functions.Overall framework consists of server and client two

4、 parts, set up IP and port number, two main large program under Linux compiling and debugging, to connect server and client, and then turn to the server as a relay to realize the communication between the client.Use the

5、socket network programming using TCP/IP protocol to ensure reliable connect, and using Linux popular GCC in project management and com</p><p>  Keywords Linux, socket, gedit, server, client, network program

6、ming</p><p><b>  目錄</b></p><p><b>  摘 要II</b></p><p>  AbstractII</p><p>  第一章 緒論- 1 -</p><p>  1.1、背景- 1 -</p><p>

7、;  1.2、網(wǎng)絡(luò)聊天的發(fā)展狀況- 1 -</p><p>  1.3、 Linux系統(tǒng)- 2 -</p><p>  1.3.1 、Linux的簡介- 2 -</p><p>  1.3.2 、Linux發(fā)展歷程- 3 -</p><p>  第二章 系統(tǒng)應(yīng)用技術(shù)- 4 -</p><p>  2.1 、s

8、ocket概念及功能- 4 -</p><p>  2.2、 socket類型- 5 -</p><p>  2.3 、socket函數(shù)- 5 -</p><p>  2.3.1 、API功能介紹- 5 -</p><p>  2.3.2、套接口地址結(jié)構(gòu)- 7 -</p><p>  2.3.3、基本轉(zhuǎn)換函數(shù)

9、- 8 -</p><p>  2.3.4、socket編程流程- 8 -</p><p>  2.4、TCP/IP 協(xié)議- 10 -</p><p>  2.4.1、協(xié)議概述- 10 -</p><p>  2.4.2、TCP/IP層次結(jié)構(gòu)- 10 -</p><p>  第三章 需求分析- 13 -&l

10、t;/p><p>  3.1 、功能需求- 13 -</p><p>  3.2、性能需求- 13 -</p><p>  3.3 、模塊劃分- 13 -</p><p>  3.3.1、 界面需求設(shè)計- 14 -</p><p>  3.3.2 、通信需求- 14 -</p><p> 

11、 3.3.3 、數(shù)據(jù)存儲- 14 -</p><p>  3.4、系統(tǒng)總流程圖- 14 -</p><p>  第四章 系統(tǒng)測試- 15 -</p><p>  4.1、測試說明- 15 -</p><p>  4.2、模塊測試- 15 -</p><p>  4.3、測試結(jié)果分析- 16 -</p&

12、gt;<p>  第五章 設(shè)計和實現(xiàn)- 16 -</p><p>  5.1、窗體的設(shè)計- 16 -</p><p>  5.2、實現(xiàn)服務(wù)器與客戶端的連接- 17 -</p><p>  5.3、聊天功能- 18 -</p><p>  5.4、編輯功能的實現(xiàn)- 19 -</p><p>  5

13、.5、換行功能的實現(xiàn)- 20 -</p><p>  5.6、數(shù)據(jù)庫的創(chuàng)建與連接- 21 -</p><p>  5.6.1、MySQL數(shù)據(jù)庫的簡介- 21 -</p><p>  5.6.2、MYSQL環(huán)境搭建- 21 -</p><p>  5.7 、顯示聊天記錄- 23 -</p><p><b&

14、gt;  結(jié)論- 25 -</b></p><p><b>  致謝- 26 -</b></p><p><b>  第一章 緒論</b></p><p><b>  1.1、背景</b></p><p>  隨著Internet的快速發(fā)展和普及,網(wǎng)絡(luò)已經(jīng)遍布世

15、界各個角落。由于網(wǎng)路的快速便捷,使得人們深深的愛上了它,因此網(wǎng)絡(luò)在人們的交流中顯得越來越重要,使得人們的交流方式也變得越來越豐富。由于市場的需求和發(fā)展空間的很大,各種通信軟件迅速成長。比如現(xiàn)在的QQ,MSN,微信,微博等網(wǎng)絡(luò)聊天軟件。通過網(wǎng)絡(luò),人們可以迅速的了解各種有用信息,使人們足不出門就可以了解天下大事。并且不管兩個人離的有多遠,都可以隨時保持聯(lián)系,因此拉近了人與人之間的距離。更重要的是,當遇見一些自然災(zāi)害使得電話通訊不好使用時,這

16、些網(wǎng)絡(luò)聊天工具就發(fā)揮了極大作用。</p><p>  1.2、網(wǎng)絡(luò)聊天的發(fā)展狀況</p><p>  網(wǎng)絡(luò)的誕生從某種意義上來說改變了我們的生活,它將這個世界的上不同地域的人之間的距離拉近了。伴隨著網(wǎng)絡(luò)的誕生,網(wǎng)絡(luò)聊天軟件也隨之而來。最初的網(wǎng)絡(luò)聊天軟件只是有簡單的文本界面,功能也十分有限,隨著技術(shù)的不斷發(fā)展與強大,擁有更多功能和美觀界面的聊天程序走進了我們的生活,也有越來越多的人將網(wǎng)絡(luò)聊天

17、軟件作為他們?nèi)粘I罱涣骱屯ㄐ诺墓ぞ摺?lt;/p><p>  網(wǎng)絡(luò)聊天軟件在國外有ICQ等,在國內(nèi)主要有OICQ、Ticq和一些基于網(wǎng)頁的即時通訊工具,像tianmao網(wǎng)站上的旺旺等等,都做得即美觀,簡潔,且功能強大,OICQ現(xiàn)在擁有非常大的用戶群。</p><p>  現(xiàn)在也有很多在網(wǎng)絡(luò)上不使用服務(wù)器的通訊軟件,這種軟件小巧且方便,也能解決一部分問題。但是有服務(wù)器的通訊軟件,有著不可比擬的

18、優(yōu)勢:可以發(fā)送離線消息,不管用戶當時是否在線,下次上線時,就可以看到這條消息了。可以保存用戶的個人信息或個人簡介,供人查看。而且,無服務(wù)器的通訊軟件,是以機器為通訊單元的,而有服務(wù)器的聊天軟件是以人為通訊單元的。所以,帶服務(wù)器的聊天軟件在網(wǎng)絡(luò)上,有著非常廣泛的用途,為網(wǎng)絡(luò)上的通訊帶來了極大的方便,它使人與人之間的交流不再只局限于某一個范圍,并且它的開銷也是很小的,你只需要擁有一部可以聯(lián)網(wǎng)的PC機就足夠了</p><p

19、>  1.3、 Linux系統(tǒng)</p><p>  1.3.1 、Linux的簡介</p><p>  在本次課題設(shè)計是在linux系統(tǒng)中完成的,所以首先需要了解linux系統(tǒng)的來龍去脈。Linux是在Unix的基礎(chǔ)上修改實現(xiàn)的,其主要的改變就是內(nèi)核源碼在網(wǎng)上完全公開。所有人都可以把下載的內(nèi)核源碼拿來直接用或者任意的修改,并且經(jīng)修改過后的源碼也必須是公開的。經(jīng)過幾年的發(fā)展,linux

20、已經(jīng)有很大的改變,所以現(xiàn)在linux有很多版本,但它們都遵循Linux最初的內(nèi)核。Linux系統(tǒng)的可移植性很高而且投資相對于其它系統(tǒng)而言較低,所以各種類型的計算機硬件設(shè)備中都選擇安裝linux系統(tǒng),特別是現(xiàn)在很熱的嵌入式設(shè)備中。在現(xiàn)在的IT行業(yè)中,Linux就是一種表示內(nèi)核,是大家普遍都認同的說法,因為linux是使用GNU 工程中各種工具和數(shù)據(jù)庫的一種操作系統(tǒng)。Linux得名于計算機業(yè)余愛好者Linus Torvalds。</p

21、><p>  Linux支持各種各樣的軟件(包括大量免費軟件),因此為用戶提供了很大的方便。Linux在其創(chuàng)始人開發(fā)過后,就由世界上各種IT精英愛好者共同開發(fā),提出他們自己的看法并進行修改,作為一個操作系統(tǒng),它具有Unix、Mac、Windows和WindowsNT同樣的功能。從本質(zhì)上講,Linux是Unix系統(tǒng)的克隆,在源碼級上兼容絕大部分的Unix標準,它遵循POSIX規(guī)范。</p><p&g

22、t;  只要是使用linux就不得不提到GNU,GNU項目開始于1984年,旨在開發(fā)一個類似 Unix、并且是自由軟件的完整操作系統(tǒng):GNU系統(tǒng)。(GNU 是GNU Not Unix的遞歸縮寫)。由于GNU操作系統(tǒng)的核心是linux,所以GUN的使用正在一步步變大。Linux操作系統(tǒng)在早期開發(fā)和使用中有許多軟件比如:gcc編譯程序、make編譯管理程序、gas匯編程序、bash命令解釋程序等等。GNU和linux是相互依存的,沒有GNU

23、 linux就是一個簡單的框架,毫無使用之處,同時沒有l(wèi)inux GNU也不會受到人們的歡迎。Linux 操作系統(tǒng)作為一個開源的操作系統(tǒng)被很多IT同行的人所認同,它能夠吸引人最大的地方就是下載內(nèi)核源碼不需要成本。只要使用遵循使用原則就可以任意使用并修改它的源代碼。</p><p>  1.3.2 、Linux發(fā)展歷程</p><p>  Linux的創(chuàng)始人,是一名叫Linus Torval

24、ds的芬蘭大學生。他當時發(fā)現(xiàn)了Unix系統(tǒng)的一些薄弱功能給他帶來了很多的不便,于是他決定在Unix的基礎(chǔ)上繼續(xù)開發(fā)出來有別于Unix系統(tǒng)的操作系統(tǒng),該系統(tǒng)彌補了Unix系統(tǒng)的缺點,同時又添加了新功能。通過他不懈的努力,在linux內(nèi)核中能實現(xiàn)一些基本的應(yīng)用程序。由于Linux一開始就把Linux的源代碼放在網(wǎng)絡(luò)上,引起了很多的愛好者的注意,因此這些愛好者也加入到linux內(nèi)核開發(fā)中,隨著越來越多的高水平的愛好者加入,該系統(tǒng)的發(fā)展迅速膨脹

25、,很快各種版本的linux產(chǎn)生。由于大量的增添和修改,使linux的文件框架越來越大,越來越穩(wěn)定,而且實現(xiàn)了基本的TCP/IP功能,使得linux在Internet中迅速成長。 </p><p>  經(jīng)過二十多年的發(fā)展,現(xiàn)在Linux系統(tǒng)已經(jīng)以成熟的一面展現(xiàn)在人們面前?,F(xiàn)在的Linux內(nèi)核更加穩(wěn)定和健全,而且獲取內(nèi)核源碼更加的簡單實用,所以現(xiàn)在的商家抓住這些特點,開始大量普遍的運用linux系統(tǒng)。由于linux到

26、目前為止幾乎沒有被木馬和病毒所困擾,所以也把它當作一種強壯而安全的防火墻。剛開始linux系統(tǒng)進入過后只是命令字符界面,還沒有一個成型的桌面系統(tǒng)。一個系統(tǒng)要受到人們的歡迎,必須要圖形界面,并且圖形界面要美觀且操作簡單。所以桌面上的Linux也在不斷的完善之中?,F(xiàn)在推行出來的ubuntu,centos等圖形界面都很受人們的喜愛,可以和微軟的界面系統(tǒng)一比高下。</p><p>  由于linux系統(tǒng)內(nèi)核小,兼容性好

27、,效率高,穩(wěn)定性強等特點,所以幾乎在各個行業(yè)都能看見linux的身影,比如:軍事,金融,電信以及政府。當今計算機領(lǐng)域比較巨型的服務(wù)器大多采用LINUX操作系統(tǒng)??梢奓INUX在網(wǎng)絡(luò)和分布式系統(tǒng)的應(yīng)用將是很有前景的。Linux以后必將成為一種新的系統(tǒng)潮流。</p><p>  第二章 系統(tǒng)應(yīng)用技術(shù)</p><p>  2.1 、socket概念及功能</p><p>

28、  (1)概念:socket直接翻譯過來的意思是插座,聽起來挺古怪的,但是它的作用就類似于這個插座的作用。作為了解socket的人都有另一種喊法:套接字。它包含有IP地址和端口號的信息,是通信的必要條件。套接字就是一個文件,是int型數(shù)字,它與文件描述符共用一段數(shù)值空間0-65535。應(yīng)用程序中使用套接字來調(diào)用套接口,套接字可以認為是指向套接口的指針。Socket是網(wǎng)絡(luò)傳輸層供給應(yīng)用層的編程接口,它提供了許多函數(shù)和例程,程序員可以使用它

29、們來開發(fā)TCP/IP網(wǎng)絡(luò)應(yīng)用程序。套接字歸根結(jié)底就是文件描述符。使用Socket進行數(shù)據(jù)傳輸?shù)暮喴襟E如下:建立一個Socket,返回該套接字的描述符;按要求配置socket的端口和ip地址,將socket連接到服務(wù)端和客戶端;按要求通過socket發(fā)送和接收數(shù)據(jù);關(guān)閉此socket。</p><p>  (2)功能:在Internet上的主機大多數(shù)情況都會有很多應(yīng)用程序,每種應(yīng)用程序?qū)?yīng)著一個服務(wù)相當與就是客戶

30、端。每種服務(wù)都打開一個Socket,并把服務(wù)端和客戶端指定綁定到系統(tǒng)中的同一個端口上,而且這個端口必須相同且不能為系統(tǒng)所占用的端口。進程之間的通信需要端點這樣的標志,socket就提供了這種標志。所以不同進程之間要通過socket提供的端點才能使進程之間相關(guān)聯(lián)起來進行數(shù)據(jù)傳輸。</p><p>  服務(wù)端和客戶端的數(shù)據(jù)通信,我們可以這樣理解,就是把客戶端套接字里面的內(nèi)容傳輸?shù)椒?wù)端套接字里面去,兩個套接字建立一種

31、關(guān)聯(lián),該關(guān)聯(lián)應(yīng)該包含多個元素用來建立多個Socket,使多個客戶端與指定的ip和端口號建立聯(lián)系。</p><p>  這里值得一提的是,socket 是面向客戶/服務(wù)器模型而設(shè)計的面對不同客戶端和服務(wù)端程序提供不同的socket系統(tǒng)調(diào)用。Socket實際上是網(wǎng)絡(luò)傳輸層和應(yīng)用層之間的橋梁??蛻粝騼?nèi)核任意請求一個socket,系統(tǒng)會立刻為之分配一個socket號,服務(wù)器擁有全局公認的 socket ,所有在局域網(wǎng)或者

32、在Internet網(wǎng)上的客戶端可以進行連接請求。socket利用C/S模式很好地解決了不同進程之間數(shù)據(jù)傳輸?shù)膯栴},所以它可以在本地局域網(wǎng)上進行通信,也可以通過互聯(lián)網(wǎng)在世界范圍內(nèi)通信。</p><p>  2.2、 socket類型</p><p><b>  主要有三種類型:</b></p><p>  流式套接字(SOCK_STREAM):流

33、套接字用在提供面向連接、可靠的數(shù)據(jù)傳輸環(huán)境中。這種套接字類型能達到數(shù)據(jù)傳輸?shù)姆€(wěn)定可靠性。流套接字能夠保證數(shù)據(jù)傳輸?shù)臏蚀_和可靠性,原因在于其使用了TCP協(xié)議。 </p><p>  數(shù)據(jù)報套接字(DGRAM):該類型套接字適用于無連接的環(huán)境中。對數(shù)據(jù)是否成功傳達,不做檢測,所以數(shù)據(jù)丟失風險很大,也無法保證順序地接收到數(shù)據(jù)。這就是我們所說的udp協(xié)議。數(shù)據(jù)報最大長度為64KB。 </p><p&g

34、t;  原始套接字(SOCK_RAW) :允許對較低層的協(xié)議,如IP,ICMP進行直接訪問。用于檢驗新的協(xié)議和服務(wù)中配置的新裝備。因此,如果要訪問其他協(xié)議發(fā)送數(shù)據(jù)必須使用原始套接字。</p><p>  2.3 、socket函數(shù)</p><p>  2.3.1 、API功能介紹</p><p>  (1) Socket()</p><p>

35、  作用:向系統(tǒng)注冊一個套接字。</p><p>  格式:int socket(int add_f,int mode,int deal)。</p><p><b>  參數(shù)說明:</b></p><p>  add_f:表示地址族,可以是AF_UNLX和AF_INT。這里我們要使用AF_INT。</p><p>  m

36、ode:網(wǎng)絡(luò)程序所采用的通信協(xié)議,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP協(xié)議,提供可靠連接;SOCKE_DGRAM表明使用的是UDP協(xié)議,提供不可靠連接。</p><p>  deal:一般默認為0。</p><p>  (2) bind()</p><p>  作用:用來設(shè)置名稱,具體設(shè)置如下:</

37、p><p>  Struct sockaddr_in server_addr;</p><p>  server_addr.sin_family=AF_INET;//協(xié)議類型,這里是TCP/IP協(xié)議</p><p>  server_addr.sin_port=htons(PORT);//指定端口號 </p><p>  server_addr.

38、sin_addr.s_addr=htonl(INADDR_ANY);//表示任意IP</p><p>  這里有個小知識需要我們關(guān)注一下,不然在運行程序時可能報錯。問題就是當申明的時候是用的Struct sockaddr,而在使用的時候總是強制轉(zhuǎn)換成struct sockaddr_in。而對于sin_port和sin_addr.s_addr需要轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)優(yōu)先順序。</p><p>  

39、格式:int bind(int b_fd,struct sockaddr *server_addr,int addrlen)。</p><p><b>  參數(shù)說明:</b></p><p>  b_fd:綁定的套接字符。</p><p>  server_addr:用來存放源主機信息比如IP地址和端口。</p><p>

40、;  Addrlen:設(shè)置結(jié)構(gòu)大小長度。</p><p>  (3) listen()和accept()</p><p>  作用:監(jiān)聽客戶端連接請求,接收客戶端請求。</p><p>  格式:int listen(int s, int backlog)。</p><p>  格式:int accept (int s1, void *add

41、r, int *addrlen)。</p><p><b>  參數(shù)說明:</b></p><p>  s:服務(wù)端監(jiān)聽客戶端的套接字符。</p><p>  Backlog:表示接入隊列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個,</p><p>  也可以自定義5~10個。</p><p><b

42、>  參數(shù)說明:</b></p><p>  s1:服務(wù)端接收客戶端的套接字符。</p><p>  Addr:包含主機地址數(shù)據(jù)的結(jié)構(gòu)。</p><p>  Addrlen:表示地址的長度。</p><p>  (4) connet()</p><p>  作用:將socket連接至serv_addr

43、指定的網(wǎng)絡(luò)地址。</p><p>  格式:int connect( int sockfd , struct sockaddr *serv_addr , int addrlen)。</p><p><b>  參數(shù)說明:</b></p><p>  sockfd:客戶端的描述符。</p><p>  serv-addr:

44、表示來訪目的端口和ip地址(套接字)的數(shù)據(jù)結(jié)構(gòu)。</p><p>  Addrlen:表示地址的長度。</p><p>  (5) send()和recv()</p><p>  作用:發(fā)送和接收信息。</p><p>  格式:int send (int sockfd, const vod *msg,int len, unsigned in

45、t flags)。</p><p>  int recv (int sockfd 1, void *buf,int len1, usigned int flags)。</p><p><b>  參數(shù)說明:</b></p><p>  Sockfd:指定寫入數(shù)據(jù)的套接字描述符。</p><p>  Sockfd1:指定讀

46、出數(shù)據(jù)的套接字描述符。</p><p>  Msg:存入寫入數(shù)據(jù)存放的緩沖區(qū)。</p><p><b>  Len:數(shù)據(jù)長度。</b></p><p>  Flags:一般設(shè)置為0。</p><p>  Buf:讀出數(shù)據(jù)存放的緩沖區(qū)。</p><p>  Len1:buf的長度。</p>

47、;<p>  (6) close() </p><p>  作用:關(guān)閉文件描述符。</p><p>  格式:Close( int sockfd)。</p><p><b>  參數(shù)信息:</b></p><p>  Sockfd:關(guān)閉服務(wù)端或者客戶端的描述符</p><p>  2

48、.3.2、套接口地址結(jié)構(gòu)</p><p>  Linux中支持很多的套接口地址結(jié)構(gòu),這里只說明了IPV4套接口地址結(jié)構(gòu)。在這些地址機構(gòu)中包括了幾個很重要的網(wǎng)絡(luò)信息,它們是:本地主機端口,目的主機端口,通信協(xié)議,本地協(xié)議地址,目的主機地址。這幾個協(xié)議在網(wǎng)絡(luò)連接中起到重要作用。</p><p>  /*用來存儲套接字地址*/</p><p>  struct socka

49、ddr {</p><p>  unsigned short sa_family; //地址族 </p><p>  char sa_data[14];</p><p><b>  };</b></p><p>  sa_family一般都是“AF_xxx”的形式,主要用來表示所選的是那種協(xié)議。通常大多用的

50、是都是AF_INET,表示TCP/IP協(xié)議。sa_data是按照字節(jié)存放的,存放的信息只能是字節(jié)序轉(zhuǎn)換后的ip地址和端口號。</p><p>  2.3.3、基本轉(zhuǎn)換函數(shù)</p><p><b>  (1)網(wǎng)絡(luò)字節(jié)順序</b></p><p>  在每一個pc機上對變量的字節(jié)順序存儲不同,也就是我們所謂的大端字節(jié)序(低地址放高位數(shù)據(jù),高地址放地

51、位數(shù)據(jù))和小端字節(jié)序(低地址放低位數(shù)據(jù),高地址放高位數(shù)據(jù))。由于IP地址是按照網(wǎng)絡(luò)字節(jié)序存放的, Internt上數(shù)據(jù)以大端字節(jié)序在網(wǎng)絡(luò)上傳輸,但是在內(nèi)部是小端字節(jié)序存放的,所以在Internet上傳輸數(shù)據(jù)時需要對數(shù)據(jù)進行字節(jié)序轉(zhuǎn)換,否則系統(tǒng)無法自動識別獲取數(shù)據(jù)。</p><p>  (2) 具體轉(zhuǎn)化函數(shù)</p><p>  Ntons:將網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換成unsigned short 型

52、數(shù)據(jù)。</p><p>  Htons:將主機 unsigned short 型數(shù)據(jù)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。</p><p>  Htonl:將主機 unsigned int 型數(shù)據(jù)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。</p><p>  Ntohl:將網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換成unsigned int型數(shù)據(jù)。</p><p>  2.3.4、socket編程流程<

53、;/p><p>  本次設(shè)計中網(wǎng)絡(luò)編程采用的是c/s架構(gòu),即一個服務(wù)端和客戶端端。由于套接字之間的API存在著一定的相關(guān)聯(lián),所以套接字之間的流程主要可以分為三個步驟:服務(wù)端處于監(jiān)聽狀態(tài),客戶端發(fā)送請求,連接成功并通信。詳細的過程為首先服務(wù)端調(diào)用socket函數(shù)創(chuàng)建一個套接字,然后把協(xié)議,端口號,ip信息通過bind函數(shù)進行綁定。以上操作完后服務(wù)端就開始監(jiān)聽客戶端的請求,并設(shè)置監(jiān)聽的最大數(shù)目。當客戶端發(fā)送鏈接請求時,服

54、務(wù)端就調(diào)用accept函數(shù)接受客戶端的請求。然后對于客戶端來說,也是要先調(diào)用socket函數(shù)創(chuàng)建客戶端的套接字,這里是用的tcp協(xié)議,所以可以不用bind函數(shù)。接著調(diào)用connect函數(shù)與服務(wù)端建立連接。當服務(wù)端和客戶端建立連接時,可以通過彼此之間的套接字描述符來進行數(shù)據(jù)傳輸。其中一方通過send函數(shù)把數(shù)據(jù)寫入數(shù)據(jù)緩沖區(qū),有TCP層負責寫向網(wǎng)絡(luò)層進行傳輸,另一方通過recv函數(shù)從緩沖區(qū)內(nèi)讀出數(shù)據(jù),這樣就完成了服務(wù)端與客戶端之間的數(shù)據(jù)傳輸

55、。當雙方數(shù)據(jù)傳輸完成后,由函數(shù)close關(guān)閉各自的套接字,使客戶端和服務(wù)端通信中斷。具體流程圖如下: </p><p><b>  服務(wù)端</b></p><p><b>  客戶端</b></p><p>  圖2.1 socket流程圖</p>&

56、lt;p>  2.4、TCP/IP 協(xié)議</p><p>  2.4.1、協(xié)議概述</p><p>  1、TCP/IP概述</p><p>  TCP/IP全稱“Transport Control Protocol/Internet Protocol”,即傳輸控制協(xié)議/網(wǎng)際協(xié)議。是國際互聯(lián)網(wǎng)Internet采用的協(xié)議標準。TCP/IP協(xié)議早期用于ARPANe

57、t網(wǎng)絡(luò),后來開放后用于民用,誕生了Internet。TCP/IP是一種異構(gòu)網(wǎng)絡(luò)互連的通信協(xié)議,它實現(xiàn)了不同網(wǎng)絡(luò)之間的互相通信。同樣在局域網(wǎng)內(nèi)的不同網(wǎng)絡(luò)也是適合的。運行TCP/IP協(xié)議的網(wǎng)絡(luò)是一種采用包(或稱分組)交換的網(wǎng)絡(luò)。TCP/IP協(xié)議是用100多種協(xié)議組成的協(xié)議棧。</p><p>  TCP協(xié)議:傳輸控制協(xié)議,在TCP/IP體系結(jié)構(gòu)中屬于傳輸層,它提供全雙工的和可交付的服務(wù)。要注意的是TCP協(xié)議是面向字節(jié)

58、的。</p><p>  IP協(xié)議:互聯(lián)網(wǎng)絡(luò)協(xié)議,在TCP/IP體系結(jié)構(gòu)中屬于網(wǎng)絡(luò)層,提供數(shù)據(jù)包協(xié)議的服務(wù),負責網(wǎng)際主機間無連接、不糾錯的網(wǎng)際尋址及數(shù)據(jù)包傳輸。</p><p>  2.4.2、TCP/IP層次結(jié)構(gòu)</p><p>  1、應(yīng)用層(application layer)</p><p>  該層包含了所有的高層協(xié)議,對于不同的網(wǎng)

59、絡(luò)層應(yīng)用引用不同的網(wǎng)絡(luò)應(yīng)用協(xié)議。如HTTP、FTP、telnet、SMTP、DNS、SNMP等協(xié)議。</p><p>  2、傳輸層(transport layer)</p><p>  負責在源主機和目的主機的應(yīng)用程序間提供端到端的數(shù)據(jù)傳輸服務(wù)。主要有TCP和UDP兩個傳輸協(xié)議。TCP協(xié)議是一個面向連接的、可靠的協(xié)議,UDP協(xié)議是不可靠、無連接的協(xié)議。</p><p&

60、gt;  3、網(wǎng)絡(luò)層(internet layer)</p><p>  在源主機和目的主機之間進行數(shù)據(jù)傳輸,主要解決路由選擇、擁塞控制和網(wǎng)絡(luò)互聯(lián)等問題。如最重要的協(xié)議是IP。</p><p>  4、網(wǎng)絡(luò)接口層(network access layer)(物理層)</p><p>  負責將IP分組封裝成幀格式轉(zhuǎn)換成比特流在以太網(wǎng)中進行傳輸,或者將數(shù)據(jù)幀轉(zhuǎn)換成數(shù)據(jù)

61、包交給網(wǎng)絡(luò)層進行傳輸。</p><p>  TCP/IP層次結(jié)構(gòu)如下圖:</p><p>  圖2.2 TCP/IP五層結(jié)構(gòu)</p><p>  TCP是傳輸控制協(xié)議的簡稱,它提供一條全雙工的、可靠的信道。TCP提供面向連接可靠的服務(wù)。至于連接就是要在傳送數(shù)據(jù)之前先要建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。TCP不提供廣播和多播服務(wù)。由于TCP要提供可靠的、面向連接的運

62、輸服務(wù),所以不可避免地增加了許多系統(tǒng)開銷,比如擁塞控制、流量控制、重傳機制等都需要占用許多系統(tǒng)的時空資源。 兩個計算機之間如果使用TCP通信,其連接過程需要三次握手實現(xiàn),第一次握手:客戶端發(fā)送syn包(syn=k)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認;第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=m+1),同時自己也發(fā)送一個SYN包(syn=m),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);第

63、三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認包ACK(ack=m+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手。不過這里需要注意的是,在握手過程中傳送的數(shù)據(jù)包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主 動關(guān)閉</p><p>  其中三次握手如下圖:</p><p&

64、gt;  圖2.3TCP三次握手</p><p><b>  第三章 需求分析</b></p><p><b>  3.1 、功能需求</b></p><p>  該聊天工具是在linux平臺下進行開發(fā)與實現(xiàn)的,它適合于局域網(wǎng)內(nèi)所有人進行通信和交流。由于這個系統(tǒng)采用了tcp/ip協(xié)議和socket接口,所以主框架采用c/s

65、架構(gòu)。從總體來講,該聊天系統(tǒng)主要包含服務(wù)端和客戶端。</p><p>  服務(wù)端功能實現(xiàn)模塊:</p><p>  能夠接受從客戶端發(fā)送的信息,并顯示在輸出框內(nèi)</p><p>  能夠向客戶端發(fā)送信息</p><p><b>  能夠查詢聊天記錄</b></p><p><b>  實

66、現(xiàn)基本的關(guān)閉功能</b></p><p>  客戶端功能實現(xiàn)模塊:</p><p>  能夠接受從服務(wù)器發(fā)送的信息,并顯示在輸出框內(nèi)</p><p>  能夠向服務(wù)器發(fā)送信息</p><p><b>  能夠查詢聊天記錄</b></p><p> ?。?)實現(xiàn)基本的關(guān)閉功能</p

67、><p><b>  3.2、性能需求 </b></p><p>  (1) 高效性和可靠性:在一個pc機上一個服務(wù)端和一個客戶端同時開啟,對pc機cpu性能要求有點高,設(shè)計的程序應(yīng)該最大限度的提高系統(tǒng)性能,減少系統(tǒng)的沒有必要的消耗。如果操作不當,或者由于系統(tǒng)原因,比如端口被占用等,要使程序能夠盡量安全的退出。</p><p>  (2) 程序模塊

68、兼容性好:對于程序的主框架需要添加各種功能來完善,這必然就會產(chǎn)生模塊和主框架之間的融合性,所以在編寫程序時,因注意對函數(shù)和變量的規(guī)范。</p><p>  (3) 最后程序應(yīng)該使每個人都能理解,并且很容易進行操作。</p><p><b>  3.3 、模塊劃分</b></p><p>  3.3.1、 界面需求設(shè)計</p>&l

69、t;p><b>  1、 界面美觀</b></p><p><b>  2、 布局合理</b></p><p>  3、 易于用戶理解操作</p><p>  4、 實現(xiàn)基本操作所需按鈕</p><p>  3.3.2 、通信需求</p><p>  1、客戶端服務(wù)器能

70、正常接收發(fā)送數(shù)據(jù)</p><p>  2、端到端數(shù)據(jù)接收時間達到用戶可接受</p><p>  3、每次發(fā)送數(shù)據(jù)長度限制達到用戶可接受度 </p><p>  3.3.3 、數(shù)據(jù)存儲</p><p>  1、接收和發(fā)送的數(shù)據(jù)能寫入數(shù)據(jù)庫</p><p>  2、寫入數(shù)據(jù)庫中的內(nèi)容帶有時間標識</p>&l

71、t;p>  3、能正常被客戶端和服務(wù)器讀取</p><p>  4、接受同時多用戶訪問</p><p>  3.4、系統(tǒng)總流程圖</p><p>  發(fā)送數(shù)據(jù) 接收數(shù)據(jù)</p><p>  接收數(shù)據(jù) 發(fā)送數(shù)據(jù)</p><p><b>  第四章 系統(tǒng)測試

72、</b></p><p><b>  4.1、測試說明</b></p><p>  本測試的測試目的是驗證Linux聊天系統(tǒng)能否實現(xiàn)正常的聊天、編輯、換行、聊天記錄的調(diào)取等基本功能,以及并發(fā)訪問的性能。為此我們在虛擬機平臺下在Linux系統(tǒng)中進行簡單的程序運行以測試上述功能能否實現(xiàn)以及程序的運行狀況。</p><p><b&g

73、t;  4.2、模塊測試</b></p><p>  運行聊天程序打開服務(wù)器端和客戶端,服務(wù)器端建立好socket,就一直處于等待連接狀態(tài),當有客戶端連接服務(wù)器的時候,服務(wù)器接收連接請求,打開客戶端與服務(wù)器端連接,實現(xiàn)程序的運行。</p><p>  然后進行程序各個模塊的功能性測試,聊天信息的發(fā)送功能,當服務(wù)器端向客戶端發(fā)送信息和客戶端向服務(wù)器端發(fā)送信息均能成功實現(xiàn),且聊天信

74、息在顯示框中均能正常顯示,并不斷進行聊天功能。</p><p>  編輯功能:顯示框中我們用控制按鈕來實現(xiàn)對可編輯與不可編輯的控制,當我們選擇編輯按鈕時,我們可以對顯示框中的內(nèi)容進行編輯,也可以自己寫入,當我們?nèi)∠庉嫊r,我們不能對顯示框里的內(nèi)容進行編輯和自由寫入,編輯功能能正常使用。</p><p>  換行功能:聊天信息在顯示框中顯示時由于顯示框大小有限,當聊天內(nèi)容大于顯示框的寬度時會

75、存在能不能換行顯示的問題,我們通過添加換行按鈕來控制聊天信息的顯示問題,當我們選擇換行按鈕時,聊天內(nèi)容大于顯示框?qū)挾葧r會自動在下一行顯示,當取消換行按鈕時,聊天內(nèi)容會在一行顯示大于顯示框?qū)挾葧r會自動顯示滾動條通過滾動條查看聊天信息全部內(nèi)容,換行功能能正常使用。</p><p>  聊天信息:我們進行聊天時聊天信息不但會顯示在顯示框中,聊天記錄還會被寫進數(shù)據(jù)庫之中,這樣我們就能通過調(diào)取數(shù)據(jù)庫中的信息來查看聊天記錄。

76、我們添加一個聊天記錄按鈕從數(shù)據(jù)庫中來調(diào)取聊天記錄,當我們運行聊天程序,并實現(xiàn)聊天功能進行聊天,聊天記錄被儲存在數(shù)據(jù)庫中,我們點擊聊天記錄按鈕,會發(fā)現(xiàn)聊天記錄會被調(diào)取出來顯示在顯示框中,聊天記錄功能能正常實現(xiàn)。</p><p>  4.3、測試結(jié)果分析</p><p>  由于設(shè)計的聊天軟件功能比較簡單,沒有進行復(fù)雜的測試,只是進行各個模塊的功能能否正常實現(xiàn),以及所有模塊組合后能否正常運行整

77、個聊天程序的運行,進行簡單的功能測試,最終所有功能均能正常實現(xiàn),符合設(shè)計標準。</p><p><b>  第五章 設(shè)計和實現(xiàn)</b></p><p><b>  5.1、窗體的設(shè)計</b></p><p>  利用Gtk構(gòu)件,使用窗體構(gòu)件、組裝盒GtkBox、表格構(gòu)件GtkTable、錄入構(gòu)件GtkEntry等一系列構(gòu)件

78、綜合運用,完成窗體的設(shè)計。</p><p>  // 創(chuàng)建窗口,參數(shù)GTK_WINDOW_TOPLEVEL 指明窗口的類型為最上層的主窗口。</p><p>  window=gtk_window_new(GTK_WINDOW_TOPLEVEL) ;</p><p>  // 設(shè)置滾動屏幕自適應(yīng) gtk_scrolled_window_set_policy(GT

79、K_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); </p><p>  // 建立text輸入框 </p><p>  text = gtk_text_view_new(); </p><p>  // 將text框加入view</p><p>  gtk_

80、container_add(GTK_CONTAINER(view),text); </p><p>  // 將text值賦給buffer</p><p>  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); </p><p><b>  // 新增 輸入框</b></p>

81、;<p>  message_entry = gtk_entry_new(); </p><p>  // 創(chuàng)建橫向布局框</p><p>  hbox3=gtk_hbox_new(FALSE,0); </p><p>  // 將橫向布局框加入縱向布局框</p><p>  gtk_box_pack_start(GTK_BOX

82、(vbox),hbox3,FALSE,FALSE,5); </p><p>  圖5-1 聊天界面的實現(xiàn)</p><p>  5.2、實現(xiàn)服務(wù)器與客戶端的連接</p><p>  服務(wù)器端必須提供穩(wěn)定的連接,在客戶端未連接時處于等待連接。服務(wù)器端建立好socket,就一直處于等待連接狀態(tài),當有客戶端連接服務(wù)器的時候,服務(wù)器接收連接請求,并接受客戶端發(fā)送過來的消息,根

83、據(jù)接收到的結(jié)構(gòu)體所攜帶的協(xié)議來做相應(yīng)的功能。服務(wù)器端啟動后如圖所示:</p><p>  圖5-2 啟動服務(wù)器端</p><p>  服務(wù)器運行后即處于監(jiān)聽狀態(tài),當監(jiān)聽到有連接請求時服務(wù)器進入消息處理流程通過查看和修改綁定的socket和在線用戶隊列實現(xiàn)等待用戶,當用戶后發(fā)送連接請求時準備建立連接。</p><p>  圖5-3 服務(wù)器端與客戶端連接成功</p

84、><p><b>  5.3、聊天功能</b></p><p>  當客戶端發(fā)送聊天信息給服務(wù)器端,服務(wù)器端可以收到信息并顯示出來,這時服務(wù)器端可以選擇是否發(fā)送回復(fù)信息給客戶端,如果回復(fù)客戶端的信息,信息將發(fā)送到客戶端,客戶端接收信息并可顯示服務(wù)器端發(fā)送的信息,實現(xiàn)聊天功能。</p><p>  圖5-4 實現(xiàn)聊天功能</p><

85、;p>  5.4、編輯功能的實現(xiàn)</p><p>  當客戶端和服務(wù)器端都運行的情況下,我們可以進行聊天功能的實現(xiàn),并將聊天信息顯示在聊天界面上,此時我們可以通過控制顯示框的可編輯與不可編輯,實現(xiàn)對顯示框信息的編輯功能。</p><p>  我們通過gtk_text_view_set_editable控件來定義一個回調(diào)函數(shù)on_editable_clicked實現(xiàn)文本的可編輯與不可編

86、輯。</p><p>  void on_editable_clicked(GtkWidget *window,gpointer *data)</p><p><b>  {</b></p><p>  gtk_text_view_set_editable(GTK_TEXT_VIEW(text),</p><p>  g

87、tk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data)));</p><p><b>  }</b></p><p>  然后調(diào)用on_editable_clicked函數(shù)實現(xiàn)控制</p><p>  g_signal_connect(G_OBJECT(button4),"toggled

88、",G_CALLBACK(on_editable_clicked),button4);</p><p>  圖5-5 實現(xiàn)編輯功能</p><p>  5.5、換行功能的實現(xiàn)</p><p>  我們在實現(xiàn)聊天的時候會把聊天信息顯示在聊天界面上,當聊天內(nèi)容超過顯示框長度時就會面臨換行與不換行顯示的問題,此時我們通過gtk_text_view_set_wra

89、p_mode控件編寫一個on_WrapWords_clicked回調(diào)函數(shù)來控制是否換行。</p><p>  void on_WrapWords_clicked(GtkWidget *window,gpointer *data)</p><p><b>  {</b></p><p>  if(iswrap == FALSE)</p>

90、;<p><b>  {</b></p><p>  iswrap = TRUE;</p><p>  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD);</p><p><b>  }</b></p><p>

91、;<b>  else</b></p><p><b>  {</b></p><p>  iswrap = FALSE;</p><p>  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_NONE);</p><p><b&

92、gt;  }</b></p><p><b>  } </b></p><p>  然后調(diào)用on_WrapWords_clicked函數(shù)實現(xiàn)控制</p><p>  g_signal_connect(G_OBJECT(button5),"toggled",GTK_SIGNAL_FUNC(on_WrapWords

93、_clicked),button5); </p><p>  圖5-6 實現(xiàn)換行功能</p><p>  5.6、數(shù)據(jù)庫的創(chuàng)建與連接</p><p>  5.6.1、MySQL數(shù)據(jù)庫的簡介</p><p>  MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),目前屬于Oracle公司。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系

94、統(tǒng),在WEB應(yīng)用方面MySQL是最好的RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。本次試驗使用mysql數(shù)據(jù)庫管理系統(tǒng)實現(xiàn)對聊天記錄的存儲與查詢。</p&g

95、t;<p>  mysql是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)保存在一個大倉庫中,增加了速度并提高了靈活性mysql中的sql指的是“結(jié)構(gòu)化查詢語言”,適用于訪問數(shù)據(jù)庫的最常用標準化語言。符合ANSI/ISO SQL標準定義。</p><p>  mysql軟件是一種開放源碼軟件“開放源碼”意味著任何人都能使用和改變軟件。任何人都能從internet上下載My

96、SQL軟件,而無需支付任何費用。同時,還可以研究源碼并進行恰當?shù)母恼?,以滿足自己的需求。</p><p>  MySQL是完全網(wǎng)絡(luò)化的跨平臺關(guān)系型數(shù)據(jù)庫,一個真正的多用戶、多線程SQL數(shù)據(jù)庫服務(wù)器,同時具有客戶機、服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫管理系統(tǒng)。具有功能性強、使用簡便、管理方便、運行速度快、安全可靠性強等特點。</p><p>  5.6.2、MYSQL環(huán)境搭建</p>

97、<p>  1、將光盤中mysql-.0.18.tar。gz解壓到Linux的root下</p><p>  2、# cd mysql-5.0.18</p><p>  3、#./configure --prefix=/usr/local/mysql --sysconfdir=/etc -- localstatedir=/var/lib/mysql </p>

98、<p>  4、#cd/usr、local、mysql</p><p>  5、#cd bin 6、#./mysql_install_db</p><p>  7、將mysql目錄下的mysql-5.0.18、support_files/mysql.server文件拷貝到/etc/rc.d/init.d</p><p>  8、chmod 777

99、mysqld</p><p><b>  1、MySQL啟動</b></p><p>  service mysqld start</p><p>  etc/rc.d/init.d/mysqld start</p><p>  usr/local/mysql/bin/mysql -uroot mysql</p&g

100、t;<p>  創(chuàng)建shell文件,執(zhí)行sh mysqldstart.sh</p><p><b>  2、MySQL關(guān)閉</b></p><p>  etc/rc.d/init.d/mysqld start</p><p>  創(chuàng)建shell文件,執(zhí)行sh mysqldstop.sh</p><p>  

101、service mysqld stop5.6.3、MySQL API的使用步驟</p><p>  1、調(diào)用mysql_init()初始化mysql數(shù)據(jù)庫</p><p>  2、調(diào)用mysql_real_connect()連接到服務(wù)器</p><p>  3、mysql_query()實施查詢</p><p>  4、對數(shù)據(jù)庫執(zhí)行結(jié)構(gòu)化查

102、詢語言進行信息處理</p><p>  5、調(diào)用mysql_close()關(guān)閉與服務(wù)器的連接</p><p>  5.6.4、發(fā)送消息時插入數(shù)據(jù)庫實現(xiàn)方式</p><p>  void on_mysql_send(GtkWidget *widget,gpointer *data)</p><p><b>  {</b>&

103、lt;/p><p>  char buf[200];</p><p>  char *neirong;</p><p>  time_t t; </p><p>  time(&t); //同步系統(tǒng)時間</p><p>  neirong= gtk_entry_get_text(GTK_ENTRY(messag

104、e_entry))//獲取文本框內(nèi)容</p><p>  sprintf(buf,"insert into record values('%s','%s')",ctime(&t),neirong);//存入臨時緩存區(qū)</p><p>  g_print("send success!\n");</p>

105、<p>  mysql_query(mysql,buf);//寫入數(shù)據(jù)庫</p><p>  5.7 、顯示聊天記錄</p><p>  我們進行聊天時聊天信息不但會顯示在顯示框中,聊天記錄還會被寫進數(shù)據(jù)庫之中,這樣我們就能通過調(diào)取數(shù)據(jù)庫中的信息來查看聊天記錄。通過以下函數(shù)我們可以連接數(shù)據(jù)庫,并把聊天記錄寫進數(shù)據(jù)庫之中,并創(chuàng)建on_mysql_select回調(diào)函數(shù)來調(diào)用數(shù)據(jù)庫

106、中的聊天記錄。</p><p>  void on_mysql_select(GtkButton *button,gpointer *data)</p><p><b>  {</b></p><p>  char buf[1024];</p><p>  GtkTextIter iter;</p><

107、;p>  MYSQL_RES *mysql_res;</p><p>  MYSQL_ROW mysql_row;</p><p><b>  int rows;</b></p><p>  int count;</p><p>  char temp[1024];</p><p>  st

108、rcpy(buf,"select * from record");</p><p>  if(mysql_query(mysql,buf)){</p><p>  printf("mysql_query wrong!");</p><p>  mysql_close(mysql);</p><p>&l

109、t;b>  exit(0);</b></p><p><b>  }</b></p><p>  mysql_res=mysql_store_result(mysql);</p><p>  rows=mysql_num_rows(mysql_res);</p><p>  if(rows==0){&l

110、t;/p><p>  printf("return null");</p><p>  mysql_free_result(mysql_res);</p><p>  mysql_close(mysql);</p><p><b>  exit(0);</b></p><p>&l

111、t;b>  }</b></p><p>  // 初始化get_buf</p><p>  bzero(temp,1024);</p><p>  for(count=0;count<rows;count++){</p><p>  mysql_row=mysql_fetch_row(mysql_res);</p

112、><p>  g_print("id:%s\n",mysql_row[0]);</p><p>  g_print("name:%s\n",mysql_row[1]);</p><p>  strcat(temp,mysql_row[0]);</p><p>  strcat(temp,mysql_row[

113、1]);</p><p>  strcat(temp,"\n");</p><p><b>  }</b></p><p>  g_print("temp:%s\n",temp);</p><p>  // 獲取buffer值,迭代</p><p>  gt

114、k_text_buffer_get_end_iter(buffer,&iter); </p><p>  // 將迭代的值與get_buf值相連接,賦給buffer</p><p>  gtk_text_buffer_insert(buffer,&iter,temp,-1);</p><p><b>  }</b></p&

115、gt;<p>  然后調(diào)用 on_mysql_select函數(shù)調(diào)取數(shù)據(jù)庫中的聊天記錄。</p><p><b>  圖5-7 聊天記錄</b></p><p><b>  第六章</b></p><p><b>  結(jié)論</b></p><p>  聊天程序設(shè)計最

116、初的時候,主要是對相關(guān)資料的收集和理論知識的學習。在這個階段,最好是同時結(jié)合資料和源碼一起來看,效果會比較好,學習效率較高。看資料和教程是從細節(jié)和基礎(chǔ)上去學習知識,而看相程序的源碼則是從整體和實現(xiàn)上去了解一個系統(tǒng)。這樣才能做到“見樹又見林”。在具體實現(xiàn)的時候,可以以模塊或分層次的思想來分析系統(tǒng)。重點掌握核心的模塊,其他模塊可以采用現(xiàn)有的類庫或開源的實現(xiàn),這樣可以提高開發(fā)的效率。軟件開發(fā)對于代碼量的積累是很重要的。當積累了一定的代碼量后,

117、看問題就會比較有程序的思想,能夠從層次,模塊的角度來分析問題,這樣思路就比較清晰了。</p><p>  這個簡單的網(wǎng)路聊天程序,可以實現(xiàn)聊天的功能,即客戶端發(fā)出消息后,服務(wù)器端能收到此消息。由于對知識理解深度的認識和時間的限制,本論文所闡述的系統(tǒng)還存在多處不足的地方,歡迎提出批評和建議。 </p><p><b>  致謝</b></p><p&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論