基于Linux的socket網(wǎng)絡編程聊天工具課程設計_第1頁
基于Linux的socket網(wǎng)絡編程聊天工具課程設計_第2頁
基于Linux的socket網(wǎng)絡編程聊天工具課程設計_第3頁
基于Linux的socket網(wǎng)絡編程聊天工具課程設計_第4頁
基于Linux的socket網(wǎng)絡編程聊天工具課程設計_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、*軟件綜合開發(fā)案例教程課程設計報告課程設計題目小組成員:*,*,*,*任課講師和助教:*,*2014年 10 月 29 日摘 要這個課程設計整體采用在linux平臺下,在同一局域網(wǎng)內(nèi)實現(xiàn)聊天功能。整體框架主要分為服務端和客戶端兩個部分,設置好ip和端口號,在Linux下編譯和調(diào)試兩主大塊程序,實現(xiàn)服務端和客戶端的連接,然后以服務端作為中繼轉(zhuǎn)實現(xiàn)客戶端之間的通信。使用socket網(wǎng)絡編程采用TCP/IP協(xié)議保證連接可靠,并在項目管理中采用linux流行的gcc和makefile編譯,提高了編譯和調(diào)試效率,加快了項目的完成速度。本次設計的聊天工具采用字符串命令行的方式進行通信,主要實現(xiàn)了五個功能:

2、用戶之間一對一的聊天、編輯、換行、用戶之間聊天記錄保存、聊天記錄調(diào)取。經(jīng)過測試,程序運行可靠,能滿足在linux中實現(xiàn)網(wǎng)絡聊天的要求。關鍵詞 linux,socket,gedit,服務端,客戶端,網(wǎng)絡編程IIAbstractThe course design of the overall use in the Linux platform, within the same LAN chat functions.Overall framework consists of server and client two parts, set up IP and port number, two mai

3、n 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 socket network programming using TCP/IP protocol to ensure reliable connect, and using Linux popular GCC in project manage

4、ment and compile a makefile, improve the efficiency of the compiling and debugging, to speed up the completion of the project. The design way of chat tool USES the string on the command line to communicate, has realized the five main functions: the one-on-one chat between users, editing, line feeds,

5、 chat records, chat records obtained between users.After testing, the program runs, reliable and can meet the requirements of the implementation in the Linux network chat.Keywords Linux, socket, gedit, server, client, network programming目錄摘 要IIAbstractII第一章 緒論- 1 -1.1、背景- 1 -1.2、網(wǎng)絡聊天的發(fā)展狀況- 1 -1.3、 L

6、inux系統(tǒng)- 2 -1.3.1 、Linux的簡介- 2 -1.3.2 、Linux發(fā)展歷程- 3 -第二章 系統(tǒng)應用技術- 4 -2.1 、socket概念及功能- 4 -2.2、 socket類型- 5 -2.3 、socket函數(shù)- 5 -2.3.1 、API功能介紹- 5 -2.3.2、套接口地址結構- 7 -2.3.3、基本轉(zhuǎn)換函數(shù)- 8 -2.3.4、socket編程流程- 8 -2.4、TCP/IP 協(xié)議- 10 -2.4.1、協(xié)議概述- 10 -2.4.2、TCP/IP層次結構- 10 -第三章 需求分析- 13 -3.1 、功能需求- 13 -3.2、性能需求- 13 -3

7、.3 、模塊劃分- 13 -3.3.1、 界面需求設計- 14 -3.3.2 、通信需求- 14 -3.3.3 、數(shù)據(jù)存儲- 14 -3.4、系統(tǒng)總流程圖- 14 -第四章 系統(tǒng)測試- 15 -4.1、測試說明- 15 -4.2、模塊測試- 15 -4.3、測試結果分析- 16 -第五章 設計和實現(xiàn)- 16 -5.1、窗體的設計- 16 -5.2、實現(xiàn)服務器與客戶端的連接- 17 -5.3、聊天功能- 18 -5.4、編輯功能的實現(xiàn)- 19 -5.5、換行功能的實現(xiàn)- 20 -5.6、數(shù)據(jù)庫的創(chuàng)建與連接- 21 -5.6.1、MySQL數(shù)據(jù)庫的簡介- 21 -5.6.2、MYSQL環(huán)境搭建-

8、21 -5.7 、顯示聊天記錄- 23 -結論- 25 -致謝- 26 -V惠普(洛陽)國際軟件人才及產(chǎn)業(yè)基地 第一章 緒論1.1、背景隨著Internet的快速發(fā)展和普及,網(wǎng)絡已經(jīng)遍布世界各個角落。由于網(wǎng)路的快速便捷,使得人們深深的愛上了它,因此網(wǎng)絡在人們的交流中顯得越來越重要,使得人們的交流方式也變得越來越豐富。由于市場的需求和發(fā)展空間的很大,各種通信軟件迅速成長。比如現(xiàn)在的QQ,MSN,微信,微博等網(wǎng)絡聊天軟件。通過網(wǎng)絡,人們可以迅速的了解各種有用信息,使人們足不出門就可以了解天下大事。并且不管兩個人離的有多遠,都可以隨時保持聯(lián)系,因此拉近了人與人之間的距離。更重要的是,當遇見一些自然災

9、害使得電話通訊不好使用時,這些網(wǎng)絡聊天工具就發(fā)揮了極大作用。1.2、網(wǎng)絡聊天的發(fā)展狀況網(wǎng)絡的誕生從某種意義上來說改變了我們的生活,它將這個世界的上不同地域的人之間的距離拉近了。伴隨著網(wǎng)絡的誕生,網(wǎng)絡聊天軟件也隨之而來。最初的網(wǎng)絡聊天軟件只是有簡單的文本界面,功能也十分有限,隨著技術的不斷發(fā)展與強大,擁有更多功能和美觀界面的聊天程序走進了我們的生活,也有越來越多的人將網(wǎng)絡聊天軟件作為他們?nèi)粘I罱涣骱屯ㄐ诺墓ぞ?。網(wǎng)絡聊天軟件在國外有ICQ等,在國內(nèi)主要有OICQ、Ticq和一些基于網(wǎng)頁的即時通訊工具,像tianmao網(wǎng)站上的旺旺等等,都做得即美觀,簡潔,且功能強大,OICQ現(xiàn)在擁有非常大的用戶群

10、?,F(xiàn)在也有很多在網(wǎng)絡上不使用服務器的通訊軟件,這種軟件小巧且方便,也能解決一部分問題。但是有服務器的通訊軟件,有著不可比擬的優(yōu)勢:可以發(fā)送離線消息,不管用戶當時是否在線,下次上線時,就可以看到這條消息了??梢员4嬗脩舻膫€人信息或個人簡介,供人查看。而且,無服務器的通訊軟件,是以機器為通訊單元的,而有服務器的聊天軟件是以人為通訊單元的。所以,帶服務器的聊天軟件在網(wǎng)絡上,有著非常廣泛的用途,為網(wǎng)絡上的通訊帶來了極大的方便,它使人與人之間的交流不再只局限于某一個范圍,并且它的開銷也是很小的,你只需要擁有一部可以聯(lián)網(wǎng)的PC機就足夠了1.3、 Linux系統(tǒng) 1.3.1 、Linux的簡介在本次課題設計

11、是在linux系統(tǒng)中完成的,所以首先需要了解linux系統(tǒng)的來龍去脈。Linux是在Unix的基礎上修改實現(xiàn)的,其主要的改變就是內(nèi)核源碼在網(wǎng)上完全公開。所有人都可以把下載的內(nèi)核源碼拿來直接用或者任意的修改,并且經(jīng)修改過后的源碼也必須是公開的。經(jīng)過幾年的發(fā)展,linux已經(jīng)有很大的改變,所以現(xiàn)在linux有很多版本,但它們都遵循Linux最初的內(nèi)核。Linux系統(tǒng)的可移植性很高而且投資相對于其它系統(tǒng)而言較低,所以各種類型的計算機硬件設備中都選擇安裝linux系統(tǒng),特別是現(xiàn)在很熱的嵌入式設備中。在現(xiàn)在的IT行業(yè)中,Linux就是一種表示內(nèi)核,是大家普遍都認同的說法,因為linux是使用GNU 工程

12、中各種工具和數(shù)據(jù)庫的一種操作系統(tǒng)。Linux得名于計算機業(yè)余愛好者Linus Torvalds。Linux支持各種各樣的軟件(包括大量免費軟件),因此為用戶提供了很大的方便。Linux在其創(chuàng)始人開發(fā)過后,就由世界上各種IT精英愛好者共同開發(fā),提出他們自己的看法并進行修改,作為一個操作系統(tǒng),它具有Unix、Mac、Windows和WindowsNT同樣的功能。從本質(zhì)上講,Linux是Unix系統(tǒng)的克隆,在源碼級上兼容絕大部分的Unix標準,它遵循POSIX規(guī)范。只要是使用linux就不得不提到GNU,GNU項目開始于1984年,旨在開發(fā)一個類似 Unix、并且是自由軟件的完整操作系統(tǒng):GNU系統(tǒng)

13、。(GNU 是GNU Not Unix的遞歸縮寫)。由于GNU操作系統(tǒng)的核心是linux,所以GUN的使用正在一步步變大。Linux操作系統(tǒng)在早期開發(fā)和使用中有許多軟件比如:gcc編譯程序、make編譯管理程序、gas匯編程序、bash命令解釋程序等等。GNU和linux是相互依存的,沒有GNU linux就是一個簡單的框架,毫無使用之處,同時沒有l(wèi)inux GNU也不會受到人們的歡迎。Linux 操作系統(tǒng)作為一個開源的操作系統(tǒng)被很多IT同行的人所認同,它能夠吸引人最大的地方就是下載內(nèi)核源碼不需要成本。只要使用遵循使用原則就可以任意使用并修改它的源代碼。1.3.2 、Linux發(fā)展歷程Linu

14、x的創(chuàng)始人,是一名叫Linus Torvalds的芬蘭大學生。他當時發(fā)現(xiàn)了Unix系統(tǒng)的一些薄弱功能給他帶來了很多的不便,于是他決定在Unix的基礎上繼續(xù)開發(fā)出來有別于Unix系統(tǒng)的操作系統(tǒng),該系統(tǒng)彌補了Unix系統(tǒng)的缺點,同時又添加了新功能。通過他不懈的努力,在linux內(nèi)核中能實現(xiàn)一些基本的應用程序。由于Linux一開始就把Linux的源代碼放在網(wǎng)絡上,引起了很多的愛好者的注意,因此這些愛好者也加入到linux內(nèi)核開發(fā)中,隨著越來越多的高水平的愛好者加入,該系統(tǒng)的發(fā)展迅速膨脹,很快各種版本的linux產(chǎn)生。由于大量的增添和修改,使linux的文件框架越來越大,越來越穩(wěn)定,而且實現(xiàn)了基本的T

15、CP/IP功能,使得linux在Internet中迅速成長。 經(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到目前為止幾乎沒有被木馬和病毒所困擾,所以也把它當作一種強壯而安全的防火墻。剛開始linux系統(tǒng)進入過后只是命令字符界面,還沒有一個成型的桌面系統(tǒng)。一個系統(tǒng)要受到人們的歡迎,必須要圖形界面,并且圖形界面要美觀且操作簡單。所以桌面上的Linux也在不斷的完善之中?,F(xiàn)在推行出來的ubuntu,centos等圖形界面都很受人們的

16、喜愛,可以和微軟的界面系統(tǒng)一比高下。由于linux系統(tǒng)內(nèi)核小,兼容性好,效率高,穩(wěn)定性強等特點,所以幾乎在各個行業(yè)都能看見linux的身影,比如:軍事,金融,電信以及政府。當今計算機領域比較巨型的服務器大多采用LINUX操作系統(tǒng)??梢奓INUX在網(wǎng)絡和分布式系統(tǒng)的應用將是很有前景的。Linux以后必將成為一種新的系統(tǒng)潮流。第二章 系統(tǒng)應用技術2.1 、socket概念及功能(1)概念:socket直接翻譯過來的意思是插座,聽起來挺古怪的,但是它的作用就類似于這個插座的作用。作為了解socket的人都有另一種喊法:套接字。它包含有IP地址和端口號的信息,是通信的必要條件。套接字就是一個文件,是i

17、nt型數(shù)字,它與文件描述符共用一段數(shù)值空間0-65535。應用程序中使用套接字來調(diào)用套接口,套接字可以認為是指向套接口的指針。Socket是網(wǎng)絡傳輸層供給應用層的編程接口,它提供了許多函數(shù)和例程,程序員可以使用它們來開發(fā)TCP/IP網(wǎng)絡應用程序。套接字歸根結底就是文件描述符。使用Socket進行數(shù)據(jù)傳輸?shù)暮喴襟E如下:建立一個Socket,返回該套接字的描述符;按要求配置socket的端口和ip地址,將socket連接到服務端和客戶端;按要求通過socket發(fā)送和接收數(shù)據(jù);關閉此socket。(2)功能:在Internet上的主機大多數(shù)情況都會有很多應用程序,每種應用程序?qū)粋€服務相當與就

18、是客戶端。每種服務都打開一個Socket,并把服務端和客戶端指定綁定到系統(tǒng)中的同一個端口上,而且這個端口必須相同且不能為系統(tǒng)所占用的端口。進程之間的通信需要端點這樣的標志,socket就提供了這種標志。所以不同進程之間要通過socket提供的端點才能使進程之間相關聯(lián)起來進行數(shù)據(jù)傳輸。服務端和客戶端的數(shù)據(jù)通信,我們可以這樣理解,就是把客戶端套接字里面的內(nèi)容傳輸?shù)椒斩颂捉幼掷锩嫒ィ瑑蓚€套接字建立一種關聯(lián),該關聯(lián)應該包含多個元素用來建立多個Socket,使多個客戶端與指定的ip和端口號建立聯(lián)系。這里值得一提的是,socket 是面向客戶/服務器模型而設計的面對不同客戶端和服務端程序提供不同的soc

19、ket系統(tǒng)調(diào)用。Socket實際上是網(wǎng)絡傳輸層和應用層之間的橋梁??蛻粝騼?nèi)核任意請求一個socket,系統(tǒng)會立刻為之分配一個socket號,服務器擁有全局公認的 socket ,所有在局域網(wǎng)或者在Internet網(wǎng)上的客戶端可以進行連接請求。socket利用C/S模式很好地解決了不同進程之間數(shù)據(jù)傳輸?shù)膯栴},所以它可以在本地局域網(wǎng)上進行通信,也可以通過互聯(lián)網(wǎng)在世界范圍內(nèi)通信。2.2、 socket類型主要有三種類型:流式套接字(SOCK_STREAM):流套接字用在提供面向連接、可靠的數(shù)據(jù)傳輸環(huán)境中。這種套接字類型能達到數(shù)據(jù)傳輸?shù)姆€(wěn)定可靠性。流套接字能夠保證數(shù)據(jù)傳輸?shù)臏蚀_和可靠性,原因在于其使用

20、了TCP協(xié)議。 數(shù)據(jù)報套接字(DGRAM):該類型套接字適用于無連接的環(huán)境中。對數(shù)據(jù)是否成功傳達,不做檢測,所以數(shù)據(jù)丟失風險很大,也無法保證順序地接收到數(shù)據(jù)。這就是我們所說的udp協(xié)議。數(shù)據(jù)報最大長度為64KB。 原始套接字(SOCK_RAW) :允許對較低層的協(xié)議,如IP,ICMP進行直接訪問。用于檢驗新的協(xié)議和服務中配置的新裝備。因此,如果要訪問其他協(xié)議發(fā)送數(shù)據(jù)必須使用原始套接字。2.3 、socket函數(shù)2.3.1 、API功能介紹(1) Socket()作用:向系統(tǒng)注冊一個套接字。格式:int socket(int add_f,int mode,int deal)。參數(shù)說明:add_f

21、:表示地址族,可以是AF_UNLX和AF_INT。這里我們要使用AF_INT。mode:網(wǎng)絡程序所采用的通信協(xié)議,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP協(xié)議,提供可靠連接;SOCKE_DGRAM表明使用的是UDP協(xié)議,提供不可靠連接。deal:一般默認為0。(2) bind()作用:用來設置名稱,具體設置如下:Struct sockaddr_in server_addr;server_addr.sin_family=AF_INET;/協(xié)議類型,這里是TCP/IP協(xié)議server_addr.sin_port=htons(PORT);/指

22、定端口號 server_addr.sin_addr.s_addr=htonl(INADDR_ANY);/表示任意IP這里有個小知識需要我們關注一下,不然在運行程序時可能報錯。問題就是當申明的時候是用的Struct sockaddr,而在使用的時候總是強制轉(zhuǎn)換成struct sockaddr_in。而對于sin_port和sin_addr.s_addr需要轉(zhuǎn)化成網(wǎng)絡字節(jié)優(yōu)先順序。格式:int bind(int b_fd,struct sockaddr *server_addr,int addrlen)。參數(shù)說明:b_fd:綁定的套接字符。server_addr:用來存放源主機信息比如IP地址和端

23、口。Addrlen:設置結構大小長度。(3) listen()和accept()作用:監(jiān)聽客戶端連接請求,接收客戶端請求。格式:int listen(int s, int backlog)。格式:int accept (int s1, void *addr, int *addrlen)。參數(shù)說明:s:服務端監(jiān)聽客戶端的套接字符。Backlog:表示接入隊列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個,也可以自定義510個。參數(shù)說明:s1:服務端接收客戶端的套接字符。Addr:包含主機地址數(shù)據(jù)的結構。Addrlen:表示地址的長度。(4) connet()作用:將socket連接至serv_addr指定

24、的網(wǎng)絡地址。格式:int connect( int sockfd , struct sockaddr *serv_addr , int addrlen)。參數(shù)說明:sockfd:客戶端的描述符。serv-addr:表示來訪目的端口和ip地址(套接字)的數(shù)據(jù)結構。Addrlen:表示地址的長度。(5) send()和recv()作用:發(fā)送和接收信息。格式:int send (int sockfd, const vod *msg,int len, unsigned int flags)。 int recv (int sockfd 1, void *buf,int len1, usigned int

25、 flags)。參數(shù)說明:Sockfd:指定寫入數(shù)據(jù)的套接字描述符。Sockfd1:指定讀出數(shù)據(jù)的套接字描述符。Msg:存入寫入數(shù)據(jù)存放的緩沖區(qū)。Len:數(shù)據(jù)長度。Flags:一般設置為0。Buf:讀出數(shù)據(jù)存放的緩沖區(qū)。Len1:buf的長度。(6) close() 作用:關閉文件描述符。格式:Close( int sockfd)。參數(shù)信息:Sockfd:關閉服務端或者客戶端的描述符2.3.2、套接口地址結構Linux中支持很多的套接口地址結構,這里只說明了IPV4套接口地址結構。在這些地址機構中包括了幾個很重要的網(wǎng)絡信息,它們是:本地主機端口,目的主機端口,通信協(xié)議,本地協(xié)議地址,目的主機地

26、址。這幾個協(xié)議在網(wǎng)絡連接中起到重要作用。/*用來存儲套接字地址*/struct sockaddr unsigned short sa_family; /地址族 char sa_data14;sa_family一般都是“AF_xxx”的形式,主要用來表示所選的是那種協(xié)議。通常大多用的是都是AF_INET,表示TCP/IP協(xié)議。sa_data是按照字節(jié)存放的,存放的信息只能是字節(jié)序轉(zhuǎn)換后的ip地址和端口號。2.3.3、基本轉(zhuǎn)換函數(shù)(1)網(wǎng)絡字節(jié)順序在每一個pc機上對變量的字節(jié)順序存儲不同,也就是我們所謂的大端字節(jié)序(低地址放高位數(shù)據(jù),高地址放地位數(shù)據(jù))和小端字節(jié)序(低地址放低位數(shù)據(jù),高地址放高位數(shù)

27、據(jù))。由于IP地址是按照網(wǎng)絡字節(jié)序存放的, Internt上數(shù)據(jù)以大端字節(jié)序在網(wǎng)絡上傳輸,但是在內(nèi)部是小端字節(jié)序存放的,所以在Internet上傳輸數(shù)據(jù)時需要對數(shù)據(jù)進行字節(jié)序轉(zhuǎn)換,否則系統(tǒng)無法自動識別獲取數(shù)據(jù)。(2) 具體轉(zhuǎn)化函數(shù)Ntons:將網(wǎng)絡字節(jié)順序轉(zhuǎn)換成unsigned short 型數(shù)據(jù)。Htons:將主機 unsigned short 型數(shù)據(jù)轉(zhuǎn)換成網(wǎng)絡字節(jié)順序。Htonl:將主機 unsigned int 型數(shù)據(jù)轉(zhuǎn)換成網(wǎng)絡字節(jié)順序。Ntohl:將網(wǎng)絡字節(jié)順序轉(zhuǎn)換成unsigned int型數(shù)據(jù)。2.3.4、socket編程流程本次設計中網(wǎng)絡編程采用的是c/s架構,即一個服務端和客戶

28、端端。由于套接字之間的API存在著一定的相關聯(lián),所以套接字之間的流程主要可以分為三個步驟:服務端處于監(jiān)聽狀態(tài),客戶端發(fā)送請求,連接成功并通信。詳細的過程為首先服務端調(diào)用socket函數(shù)創(chuàng)建一個套接字,然后把協(xié)議,端口號,ip信息通過bind函數(shù)進行綁定。以上操作完后服務端就開始監(jiān)聽客戶端的請求,并設置監(jiān)聽的最大數(shù)目。當客戶端發(fā)送鏈接請求時,服務端就調(diào)用accept函數(shù)接受客戶端的請求。然后對于客戶端來說,也是要先調(diào)用socket函數(shù)創(chuàng)建客戶端的套接字,這里是用的tcp協(xié)議,所以可以不用bind函數(shù)。接著調(diào)用connect函數(shù)與服務端建立連接。當服務端和客戶端建立連接時,可以通過彼此之間的套接字

29、描述符來進行數(shù)據(jù)傳輸。其中一方通過send函數(shù)把數(shù)據(jù)寫入數(shù)據(jù)緩沖區(qū),有TCP層負責寫向網(wǎng)絡層進行傳輸,另一方通過recv函數(shù)從緩沖區(qū)內(nèi)讀出數(shù)據(jù),這樣就完成了服務端與客戶端之間的數(shù)據(jù)傳輸。當雙方數(shù)據(jù)傳輸完成后,由函數(shù)close關閉各自的套接字,使客戶端和服務端通信中斷。具體流程圖如下: Socket()創(chuàng)建套接字Socket()創(chuàng)建套接字Bind()配置本地端口和ipBind()配置本地端口和ipListen()監(jiān)聽和接收請求Accpet()接收請求和建立連接Connect()與服務器連接Recv()h和send()接收和發(fā)送信息Send()和recv()發(fā)送和接收信息Close()關閉套接字C

30、lose()關閉套接字服務端 客戶端圖2.1 socket流程圖2.4、TCP/IP 協(xié)議2.4.1、協(xié)議概述1、TCP/IP概述TCP/IP全稱“Transport Control Protocol/Internet Protocol”,即傳輸控制協(xié)議/網(wǎng)際協(xié)議。是國際互聯(lián)網(wǎng)Internet采用的協(xié)議標準。TCP/IP協(xié)議早期用于ARPANet網(wǎng)絡,后來開放后用于民用,誕生了Internet。TCP/IP是一種異構網(wǎng)絡互連的通信協(xié)議,它實現(xiàn)了不同網(wǎng)絡之間的互相通信。同樣在局域網(wǎng)內(nèi)的不同網(wǎng)絡也是適合的。運行TCP/IP協(xié)議的網(wǎng)絡是一種采用包(或稱分組)交換的網(wǎng)絡。TCP/IP協(xié)議是用100多種

31、協(xié)議組成的協(xié)議棧。TCP協(xié)議:傳輸控制協(xié)議,在TCP/IP體系結構中屬于傳輸層,它提供全雙工的和可交付的服務。要注意的是TCP協(xié)議是面向字節(jié)的。IP協(xié)議:互聯(lián)網(wǎng)絡協(xié)議,在TCP/IP體系結構中屬于網(wǎng)絡層,提供數(shù)據(jù)包協(xié)議的服務,負責網(wǎng)際主機間無連接、不糾錯的網(wǎng)際尋址及數(shù)據(jù)包傳輸。2.4.2、TCP/IP層次結構1、應用層(application layer)該層包含了所有的高層協(xié)議,對于不同的網(wǎng)絡層應用引用不同的網(wǎng)絡應用協(xié)議。如HTTP、FTP、telnet、SMTP、DNS、SNMP等協(xié)議。2、傳輸層(transport layer)負責在源主機和目的主機的應用程序間提供端到端的數(shù)據(jù)傳輸服務。

32、主要有TCP和UDP兩個傳輸協(xié)議。TCP協(xié)議是一個面向連接的、可靠的協(xié)議,UDP協(xié)議是不可靠、無連接的協(xié)議。3、網(wǎng)絡層(internet layer)在源主機和目的主機之間進行數(shù)據(jù)傳輸,主要解決路由選擇、擁塞控制和網(wǎng)絡互聯(lián)等問題。如最重要的協(xié)議是IP。4、網(wǎng)絡接口層(network access layer)(物理層)負責將IP分組封裝成幀格式轉(zhuǎn)換成比特流在以太網(wǎng)中進行傳輸,或者將數(shù)據(jù)幀轉(zhuǎn)換成數(shù)據(jù)包交給網(wǎng)絡層進行傳輸。TCP/IP層次結構如下圖:目的主機源主機應用層應用層數(shù)據(jù)流傳輸層傳輸層數(shù)據(jù)包UDP或TCP網(wǎng)絡層網(wǎng)絡層IP數(shù)據(jù)報物理層物理層網(wǎng)絡幀數(shù)據(jù)鏈路層 圖2.2 TCP/IP五層結構TC

33、P是傳輸控制協(xié)議的簡稱,它提供一條全雙工的、可靠的信道。TCP提供面向連接可靠的服務。至于連接就是要在傳送數(shù)據(jù)之前先要建立連接,數(shù)據(jù)傳送結束后要釋放連接。TCP不提供廣播和多播服務。由于TCP要提供可靠的、面向連接的運輸服務,所以不可避免地增加了許多系統(tǒng)開銷,比如擁塞控制、流量控制、重傳機制等都需要占用許多系統(tǒng)的時空資源。 兩個計算機之間如果使用TCP通信,其連接過程需要三次握手實現(xiàn),第一次握手:客戶端發(fā)送syn包(syn=k)到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=m+1),同時自己也發(fā)送一個SYN包(syn=m),

34、即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);第三次握手:客戶端收到服務器的SYNACK包,向服務器發(fā)送確認包ACK(ack=m+1),此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手。不過這里需要注意的是,在握手過程中傳送的數(shù)據(jù)包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主 動關閉連接之前,TCP 連接都將被一直保持下去。其中三次握手如下圖:clientserver服務端發(fā)送syn+ack報文,并設置發(fā)送序號為Y,在確認序號為X+1SYN=1 Seq = X客戶端發(fā)送syn報文并設置

35、發(fā)送序號為XSYN=1 ACK=X+1Seq = Y客戶端發(fā)送ack報文,并 設置發(fā)送序號為Z,在確認序號為Y+1ACK=Y+1 Seq = Z 圖2.3TCP三次握手- 12 -第三章 需求分析3.1 、功能需求該聊天工具是在linux平臺下進行開發(fā)與實現(xiàn)的,它適合于局域網(wǎng)內(nèi)所有人進行通信和交流。由于這個系統(tǒng)采用了tcp/ip協(xié)議和socket接口,所以主框架采用c/s架構。從總體來講,該聊天系統(tǒng)主要包含服務端和客戶端。服務端功能實現(xiàn)模塊:(1) 能夠接受從客戶端發(fā)送的信息,并顯示在輸出框內(nèi)(2) 能夠向客戶端發(fā)送信息(3) 能夠查詢聊天記錄(4) 實現(xiàn)基本的關閉功能客戶端功能實現(xiàn)模塊:(1

36、) 能夠接受從服務器發(fā)送的信息,并顯示在輸出框內(nèi)(2) 能夠向服務器發(fā)送信息(3) 能夠查詢聊天記錄(4)實現(xiàn)基本的關閉功能3.2、性能需求 (1) 高效性和可靠性:在一個pc機上一個服務端和一個客戶端同時開啟,對pc機cpu性能要求有點高,設計的程序應該最大限度的提高系統(tǒng)性能,減少系統(tǒng)的沒有必要的消耗。如果操作不當,或者由于系統(tǒng)原因,比如端口被占用等,要使程序能夠盡量安全的退出。(2) 程序模塊兼容性好:對于程序的主框架需要添加各種功能來完善,這必然就會產(chǎn)生模塊和主框架之間的融合性,所以在編寫程序時,因注意對函數(shù)和變量的規(guī)范。(3) 最后程序應該使每個人都能理解,并且很容易進行操作。3.3

37、、模塊劃分3.3.1、 界面需求設計1、 界面美觀2、 布局合理3、 易于用戶理解操作4、 實現(xiàn)基本操作所需按鈕3.3.2 、通信需求1、客戶端服務器能正常接收發(fā)送數(shù)據(jù)2、端到端數(shù)據(jù)接收時間達到用戶可接受3、每次發(fā)送數(shù)據(jù)長度限制達到用戶可接受度 3.3.3 、數(shù)據(jù)存儲1、接收和發(fā)送的數(shù)據(jù)能寫入數(shù)據(jù)庫2、寫入數(shù)據(jù)庫中的內(nèi)容帶有時間標識3、能正常被客戶端和服務器讀取4、接受同時多用戶訪問 程序入口3.4、系統(tǒng)總流程圖服務器界面客戶端界面 發(fā)送數(shù)據(jù) 接收數(shù)據(jù) 接收數(shù)據(jù) 發(fā)送數(shù)據(jù) 插入/讀取數(shù)據(jù)庫第四章 系統(tǒng)測試4.1、測試說明本測試的測試目的是驗證Linux聊天系統(tǒng)能否實現(xiàn)正常的聊天、編輯、換行、聊

38、天記錄的調(diào)取等基本功能,以及并發(fā)訪問的性能。為此我們在虛擬機平臺下在Linux系統(tǒng)中進行簡單的程序運行以測試上述功能能否實現(xiàn)以及程序的運行狀況。4.2、模塊測試運行聊天程序打開服務器端和客戶端,服務器端建立好socket,就一直處于等待連接狀態(tài),當有客戶端連接服務器的時候,服務器接收連接請求,打開客戶端與服務器端連接,實現(xiàn)程序的運行。然后進行程序各個模塊的功能性測試,聊天信息的發(fā)送功能,當服務器端向客戶端發(fā)送信息和客戶端向服務器端發(fā)送信息均能成功實現(xiàn),且聊天信息在顯示框中均能正常顯示,并不斷進行聊天功能。編輯功能:顯示框中我們用控制按鈕來實現(xiàn)對可編輯與不可編輯的控制,當我們選擇編輯按鈕時,我們

39、可以對顯示框中的內(nèi)容進行編輯,也可以自己寫入,當我們?nèi)∠庉嫊r,我們不能對顯示框里的內(nèi)容進行編輯和自由寫入,編輯功能能正常使用。換行功能:聊天信息在顯示框中顯示時由于顯示框大小有限,當聊天內(nèi)容大于顯示框的寬度時會存在能不能換行顯示的問題,我們通過添加換行按鈕來控制聊天信息的顯示問題,當我們選擇換行按鈕時,聊天內(nèi)容大于顯示框?qū)挾葧r會自動在下一行顯示,當取消換行按鈕時,聊天內(nèi)容會在一行顯示大于顯示框?qū)挾葧r會自動顯示滾動條通過滾動條查看聊天信息全部內(nèi)容,換行功能能正常使用。聊天信息:我們進行聊天時聊天信息不但會顯示在顯示框中,聊天記錄還會被寫進數(shù)據(jù)庫之中,這樣我們就能通過調(diào)取數(shù)據(jù)庫中的信息來查看聊天

40、記錄。我們添加一個聊天記錄按鈕從數(shù)據(jù)庫中來調(diào)取聊天記錄,當我們運行聊天程序,并實現(xiàn)聊天功能進行聊天,聊天記錄被儲存在數(shù)據(jù)庫中,我們點擊聊天記錄按鈕,會發(fā)現(xiàn)聊天記錄會被調(diào)取出來顯示在顯示框中,聊天記錄功能能正常實現(xiàn)。4.3、測試結果分析由于設計的聊天軟件功能比較簡單,沒有進行復雜的測試,只是進行各個模塊的功能能否正常實現(xiàn),以及所有模塊組合后能否正常運行整個聊天程序的運行,進行簡單的功能測試,最終所有功能均能正常實現(xiàn),符合設計標準。第五章 設計和實現(xiàn)5.1、窗體的設計利用Gtk構件,使用窗體構件、組裝盒GtkBox、表格構件GtkTable、錄入構件GtkEntry等一系列構件綜合運用,完成窗體的

41、設計。/ 創(chuàng)建窗口,參數(shù)GTK_WINDOW_TOPLEVEL 指明窗口的類型為最上層的主窗口。window=gtk_window_new(GTK_WINDOW_TOPLEVEL) ;/ 設置滾動屏幕自適應 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); / 建立text輸入框 text = gtk_text_view_new(); / 將text框加入viewgtk_container_add(GTK_CONTAINER(view),tex

42、t); / 將text值賦給bufferbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text); / 新增 輸入框message_entry = gtk_entry_new(); / 創(chuàng)建橫向布局框hbox3=gtk_hbox_new(FALSE,0); / 將橫向布局框加入縱向布局框gtk_box_pack_start(GTK_BOX(vbox),hbox3,FALSE,FALSE,5); 圖5-1 聊天界面的實現(xiàn)5.2、實現(xiàn)服務器與客戶端的連接服務器端必須提供穩(wěn)定的連接,在客戶端未連接時處于等待連接。服務器端建立好socket,就一直處于

43、等待連接狀態(tài),當有客戶端連接服務器的時候,服務器接收連接請求,并接受客戶端發(fā)送過來的消息,根據(jù)接收到的結構體所攜帶的協(xié)議來做相應的功能。服務器端啟動后如圖所示:圖5-2 啟動服務器端服務器運行后即處于監(jiān)聽狀態(tài),當監(jiān)聽到有連接請求時服務器進入消息處理流程通過查看和修改綁定的socket和在線用戶隊列實現(xiàn)等待用戶,當用戶后發(fā)送連接請求時準備建立連接。圖5-3 服務器端與客戶端連接成功5.3、聊天功能當客戶端發(fā)送聊天信息給服務器端,服務器端可以收到信息并顯示出來,這時服務器端可以選擇是否發(fā)送回復信息給客戶端,如果回復客戶端的信息,信息將發(fā)送到客戶端,客戶端接收信息并可顯示服務器端發(fā)送的信息,實現(xiàn)聊天

44、功能。圖5-4 實現(xiàn)聊天功能5.4、編輯功能的實現(xiàn)當客戶端和服務器端都運行的情況下,我們可以進行聊天功能的實現(xiàn),并將聊天信息顯示在聊天界面上,此時我們可以通過控制顯示框的可編輯與不可編輯,實現(xiàn)對顯示框信息的編輯功能。我們通過gtk_text_view_set_editable控件來定義一個回調(diào)函數(shù)on_editable_clicked實現(xiàn)文本的可編輯與不可編輯。void on_editable_clicked(GtkWidget *window,gpointer *data)gtk_text_view_set_editable(GTK_TEXT_VIEW(text),gtk_toggle_bu

45、tton_get_active(GTK_TOGGLE_BUTTON(data);然后調(diào)用on_editable_clicked函數(shù)實現(xiàn)控制g_signal_connect(G_OBJECT(button4),"toggled",G_CALLBACK(on_editable_clicked),button4);圖5-5 實現(xiàn)編輯功能5.5、換行功能的實現(xiàn)我們在實現(xiàn)聊天的時候會把聊天信息顯示在聊天界面上,當聊天內(nèi)容超過顯示框長度時就會面臨換行與不換行顯示的問題,此時我們通過gtk_text_view_set_wrap_mode控件編寫一個on_WrapWords_clicked

46、回調(diào)函數(shù)來控制是否換行。void on_WrapWords_clicked(GtkWidget *window,gpointer *data)if(iswrap = FALSE)iswrap = TRUE;gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD);elseiswrap = FALSE;gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_NONE); 然后調(diào)用on_WrapWords_clicked函數(shù)實現(xiàn)控制g_signal_connect(G_OB

47、JECT(button5),"toggled",GTK_SIGNAL_FUNC(on_WrapWords_clicked),button5); 圖5-6 實現(xiàn)換行功能5.6、數(shù)據(jù)庫的創(chuàng)建與連接5.6.1、MySQL數(shù)據(jù)庫的簡介MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),目前屬于Oracle公司。MySQL是最流行的關系型數(shù)據(jù)庫管理系統(tǒng),在WEB應用方面MySQL是最好的RDBMS(Relational Database Management System:關系數(shù)據(jù)庫管理系統(tǒng))應用軟件之一。MySQL是一種關聯(lián)數(shù)據(jù)庫管理系統(tǒng),關聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不

48、同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。本次試驗使用mysql數(shù)據(jù)庫管理系統(tǒng)實現(xiàn)對聊天記錄的存儲與查詢。mysql是一種關聯(lián)數(shù)據(jù)庫管理系統(tǒng),關聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)保存在一個大倉庫中,增加了速度并提高了靈活性mysql中的sql指的是“結構化查詢語言”,適用于訪問數(shù)據(jù)庫的最常用標準化語言。符合ANSI/ISO SQL標準定義。mysql軟件是一種開放源碼軟件“開放源碼”意味著任何人都能使用和改變軟件。任何人都能從internet上下載MySQL軟件,而無需支付任何費用。

49、同時,還可以研究源碼并進行恰當?shù)母恼?,以滿足自己的需求。MySQL是完全網(wǎng)絡化的跨平臺關系型數(shù)據(jù)庫,一個真正的多用戶、多線程SQL數(shù)據(jù)庫服務器,同時具有客戶機、服務器體系結構的分布式數(shù)據(jù)庫管理系統(tǒng)。具有功能性強、使用簡便、管理方便、運行速度快、安全可靠性強等特點。5.6.2、MYSQL環(huán)境搭建1、將光盤中mysql-.0.18.tar。gz解壓到Linux的root下2、# cd mysql-5.0.183、#./configure -prefix=/usr/local/mysql -sysconfdir=/etc - localstatedir=/var/lib/mysql 4、#cd/us

50、r、local、mysql5、#cd bin 6、#./mysql_install_db7、將mysql目錄下的mysql-5.0.18、support_files/mysql.server文件拷貝到/etc/rc.d/init.d8、chmod 777 mysqld1、MySQL啟動service mysqld startetc/rc.d/init.d/mysqld startusr/local/mysql/bin/mysql -uroot mysql創(chuàng)建shell文件,執(zhí)行sh mysqldstart.sh2、MySQL關閉etc/rc.d/init.d/mysqld start創(chuàng)建she

51、ll文件,執(zhí)行sh mysqldstop.shservice mysqld stop5.6.3、MySQL API的使用步驟1、調(diào)用mysql_init()初始化mysql數(shù)據(jù)庫2、調(diào)用mysql_real_connect()連接到服務器3、mysql_query()實施查詢4、對數(shù)據(jù)庫執(zhí)行結構化查詢語言進行信息處理5、調(diào)用mysql_close()關閉與服務器的連接5.6.4、發(fā)送消息時插入數(shù)據(jù)庫實現(xiàn)方式void on_mysql_send(GtkWidget *widget,gpointer *data)char buf200;char *neirong;time_t t; time(&a

52、mp;t); /同步系統(tǒng)時間neirong= gtk_entry_get_text(GTK_ENTRY(message_entry)/獲取文本框內(nèi)容sprintf(buf,"insert into record values('%s','%s')",ctime(&t),neirong);/存入臨時緩存區(qū)g_print("send success!n");mysql_query(mysql,buf);/寫入數(shù)據(jù)庫5.7 、顯示聊天記錄我們進行聊天時聊天信息不但會顯示在顯示框中,聊天記錄還會被寫進數(shù)據(jù)庫之中,這樣我們就能通過調(diào)取數(shù)據(jù)庫中的信息來查看聊天記錄。通過以下函數(shù)我們可以連接數(shù)據(jù)庫,并把聊天記錄寫進數(shù)據(jù)庫之中,并創(chuàng)建on_mysql_select回調(diào)函數(shù)來調(diào)用數(shù)據(jù)庫中的聊天記錄。void on_mysql_select(

溫馨提示

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

評論

0/150

提交評論