課程設(shè)計(論文)-基于linux嵌入式的聊天室系統(tǒng)設(shè)計_第1頁
課程設(shè)計(論文)-基于linux嵌入式的聊天室系統(tǒng)設(shè)計_第2頁
課程設(shè)計(論文)-基于linux嵌入式的聊天室系統(tǒng)設(shè)計_第3頁
課程設(shè)計(論文)-基于linux嵌入式的聊天室系統(tǒng)設(shè)計_第4頁
課程設(shè)計(論文)-基于linux嵌入式的聊天室系統(tǒng)設(shè)計_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 專業(yè)方向課程設(shè)計任務(wù)書嵌入式方向題 目: 基于linux嵌入式的聊天室系統(tǒng)設(shè)計 初始條件:軟帝嵌入式ARM9開發(fā)教學設(shè)備;PC機及相關(guān)應(yīng)用軟件;要求完成的主要任務(wù): 了解TCP方面socket編程。實現(xiàn)客戶端與效勞器端的聊天功能。撰寫課程設(shè)計說明書。課程設(shè)計說明書要求:引言、設(shè)計要求、系統(tǒng)結(jié)構(gòu)、原理設(shè)計、各個模塊的設(shè)計與實現(xiàn)、軟件設(shè)計、調(diào)試過程、體會及總結(jié)、參考文獻、源程序。說明書使用A4紙打印或手寫。序號階 段 內(nèi) 容所需時間周1 下達課程設(shè)計任務(wù)書和日程安排,根據(jù)任務(wù)書查找資料,了解觸摸屏工作原理;第13周 2 熟悉ARM的C語言程序設(shè)計;第14周 3 程序的編寫和調(diào)試;結(jié)果分析整理、撰

2、寫課程設(shè)計報告,驗收和辯論。 合 計 4 周指導(dǎo)教師簽名: 年 月 日摘 要本系統(tǒng)建立在嵌入式系統(tǒng)網(wǎng)絡(luò)平臺上,系統(tǒng)的設(shè)計使用了面向?qū)ο蠹夹g(shù)和面向?qū)ο蟮脑O(shè)計原那么。系統(tǒng)采用C/S與B/S結(jié)合的結(jié)構(gòu),客戶端與客戶端以及客戶端與效勞器端之間通過Socket傳送消息。使用嵌入式C+語言編寫,開發(fā)工具采用linux下的Qt環(huán)境。效勞器設(shè)計與實現(xiàn)過程中,采用了多線程技術(shù),可以在單個程序當中同時運行多個不同的線程,執(zhí)行不同的任務(wù)。大大增強了程序?qū)π谄髻Y源的利用。在Linux下編寫并調(diào)試效勞器端程序和客戶端程序,實現(xiàn)了客戶、效勞器之間的連接和通信。關(guān)鍵字:Linux ; Qt; TCP/IP;多人聊天目錄

3、TOC o 1-3 h z u HYPERLINK l _Toc312423278 目錄 PAGEREF _Toc312423278 h 3 HYPERLINK l _Toc312423279 第一章 總體方案設(shè)計 PAGEREF _Toc312423279 h 4 HYPERLINK l _Toc312423280 1.1 系統(tǒng)實現(xiàn)原理 PAGEREF _Toc312423280 h 4 HYPERLINK l _Toc312423281 1.2. 總體方案設(shè)計 PAGEREF _Toc312423281 h 4 HYPERLINK l _Toc312423282 1.1 效勞器流程圖 PA

4、GEREF _Toc312423282 h 5 HYPERLINK l _Toc312423283 1.2 客戶端流程圖 PAGEREF _Toc312423283 h 6 HYPERLINK l _Toc312423284 第二章 軟件功能實現(xiàn) PAGEREF _Toc312423284 h 7 HYPERLINK l _Toc312423285 PAGEREF _Toc312423285 h 7 HYPERLINK l _Toc312423286 網(wǎng)絡(luò)套接字socket PAGEREF _Toc312423286 h 7 HYPERLINK l _Toc312423287 C/S結(jié)構(gòu) PA

5、GEREF _Toc312423287 h 8 HYPERLINK l _Toc312423288 2.1.3多線程 PAGEREF _Toc312423288 h 9 HYPERLINK l _Toc312423289 2.2 聊天室系統(tǒng)功能實現(xiàn) PAGEREF _Toc312423289 h 9. HYPERLINK l _Toc312423290 Linux提供的有關(guān)Socket的系統(tǒng)調(diào)用 PAGEREF _Toc312423290 h 9 HYPERLINK l _Toc312423291 2.通信實現(xiàn) PAGEREF _Toc312423291 h 10 HYPERLINK l _T

6、oc312423292 第三章 運行結(jié)果 PAGEREF _Toc312423292 h 11 HYPERLINK l _Toc312423293 心得體會 PAGEREF _Toc312423293 h 13 HYPERLINK l _Toc312423294 參考文獻 PAGEREF _Toc312423294 h 14第一章 總體方案設(shè)計 1.1 系統(tǒng)實現(xiàn)原理聊天系統(tǒng)的設(shè)計跟普通網(wǎng)站設(shè)計有著許多不同的地方,普通網(wǎng)站設(shè)計所考慮的因素,例如,普通網(wǎng)站需要對布局進入大量美化以及動畫設(shè)計等等,而聊天室只要提供滿足訪客雙方直接實時聊天即可。因此,在設(shè)計聊天系統(tǒng)的過程中,必須要考慮好以下幾個設(shè)計要點

7、:在Internet上的聊天程序一般都是以效勞器提供效勞端連接響應(yīng),使用者通過客戶端程序登錄到效勞器,就可以與登錄在同一效勞器上的用戶交談,這是一個面向連接的通信過程。因此,程序要在TCP/IP環(huán)境下,實現(xiàn)效勞器端和客戶端兩局部程序。圖1-1 系統(tǒng)實現(xiàn)原理 1.2 總體方案設(shè)計 效勞器的主要任務(wù)是偵聽建立連接的請求,這是由我們創(chuàng)立的特定效勞器對象完成的。而客戶機的任務(wù)是試著與一臺效勞器建立連接,這是由我們創(chuàng)立的特定客戶機對象完成的。一旦連接建好,那么無論在效勞器端還是客戶機端,連接只是魔術(shù)般地變成了一個IO數(shù)據(jù)流對象。從這時開始,我們可以象讀寫一個普通的文件那樣對待連接。圖1-3 效勞器和客戶

8、機的連接 效勞器流程圖2021-07-21 15:51 上傳下載次數(shù): 34每個客戶端開啟兩個進程,開啟兩個TCP Socket 通信。一個進程響應(yīng)用戶的操作,它還把用戶輸入的聊天信息發(fā)送給效勞器;另外一個進程的功能是接收信息,單獨開辟一個接收信息的原因是因為中的進程設(shè)計到輸入,可能會導(dǎo)致接收報文的阻塞效勞器端開啟。剛開始只有一個父進程,當有一個新的連接時,那么會開啟一個新的進程, 用這個開啟的新的進程來實現(xiàn)“接收對應(yīng)客戶端信息,分析解碼后,再發(fā)送重組報文信息給其他客戶端。.2 客戶端流程圖 2021-07-21 15:51 上傳下載次數(shù): 34端口通知報文,等客戶端連接上效勞器之后,效勞器會

9、新建一個進程,使用一個新的Socket來和客戶端通信,需要發(fā)送一個報文來告訴客戶端新的端口號。 聊天消息報文,A對B發(fā)送消息,組裝成報文,供效勞器分析,然后播送給其他客戶 用戶列表更新,當用戶狀態(tài)發(fā)生變化時,效勞器會播送此報文,來通知所有客戶。第二章 軟件功能實現(xiàn) 本多人聊天系統(tǒng)設(shè)計采用linux環(huán)境下的QT編程,利用C/S結(jié)構(gòu)來實現(xiàn)聊天界面的功能,在通信方面主要是通過Socket網(wǎng)絡(luò)套接字多線程技術(shù)來實現(xiàn)。本聊天室程序在linux下,采用C語言實現(xiàn),結(jié)構(gòu)為Client/Server結(jié)構(gòu);效勞端程序通過共享存儲區(qū)存儲聊天數(shù)據(jù),并發(fā)送給每個連接的客戶端;效勞端程序和客戶端程序都是通過父子進程分別

10、負責發(fā)送和接收數(shù)據(jù)的,以防止數(shù)據(jù)沖撞;需按以下格式調(diào)用客戶端程序:client.exe 效勞端主機IP 端口號(本),用戶名(在聊天室中顯示的用戶名)。網(wǎng)絡(luò)套接字socketSocket接口上TCP/IP網(wǎng)絡(luò)應(yīng)用程序接口API,它提供了許多函數(shù)和例程,程序員可以使用它們來開發(fā)TCP/IP網(wǎng)絡(luò)應(yīng)用程序。使用Socket接口進行網(wǎng)絡(luò)通信的過程如下圖,簡要步驟如下:建立一個Socket.按要求配置socket,將socket連接到遠程主機或給socket指定以各本地協(xié)議端口。按要求通過socket發(fā)送和接受數(shù)據(jù)。關(guān)閉此socket。這是通過Socket實現(xiàn)點對點通信需要掌握的4個編程要點。 TCP是

11、傳輸控制協(xié)議的簡稱,它是提供一條全雙工的、可靠的信道。TCP提供面向連接的效勞,在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。TCP不提供播送和多播效勞。由于TCP要提供可靠的、面向連接的運輸效勞,所以不可防止地增加了許多系統(tǒng)開銷,比方確認、流量控制、計時器以及連接管理等都需要占用許多系統(tǒng)的時空資源。 兩個計算機之間如果使用TCP通信,其連接過程需要三次握手實現(xiàn),如實驗圖2-1所示。圖2-1 用三次握手建立TCP連接 對于兩個計算機之間連接的釋放過程也需要類似的3次握手的互相確認的過程,如實驗圖2-2所示。圖2-2 TCP連接的釋放過程網(wǎng)絡(luò)套接字socket在C/S結(jié)構(gòu)中,多個相互通

12、信的計算機都作為客戶端,與網(wǎng)絡(luò)效勞器進行連接,并通過效勞器進行信息的傳遞。所以多個客戶端之間的通信就變?yōu)榱丝蛻舳伺c效勞端的通信。所以,采用客戶/效勞器模型進行網(wǎng)絡(luò)聊天需要分別編寫效勞器端和客戶端的程序,效勞器和客戶端之間相互通信的同步關(guān)系和各自的程序流程如實驗圖1-3所示。圖2-3 Socket通信流程圖2.多線程上述點對點通信的實現(xiàn)知識完成了主機進程與效勞器進程之間的連接,建立連接的進程之間是一對一的聯(lián)系,即主機的一個進程與效勞器的一個進程之間建立的連接。而每個進程進行通信的環(huán)節(jié)都包括了發(fā)送信息和接口信息兩個任務(wù),這兩個任務(wù)通過一個端口地址發(fā)送和接收。在網(wǎng)絡(luò)通信中,端口地址是以進程為單位進程

13、分配的,而一個進程與外界的消息發(fā)送與接收必須通過分配給它的同一個端口進行。因此,不能通過創(chuàng)立進程方式來解決上訴問題,因為兩個進程會分別對應(yīng)兩個不同的端口,而發(fā)送和接收必須使用同一端口。2.2 聊天室系統(tǒng)功能實現(xiàn) Linux提供的有關(guān)Socket的系統(tǒng)調(diào)用Socket() 作用:socket函數(shù)為客戶機或效勞器創(chuàng)立一個sokcet格式:int socket(int family,int type,int protocol);bind( )格式: int bind(int sockfd,struct sockaddr *addr,int addrlen); 參數(shù)說明: Sockfd:socket的

14、文件描述符號。 Sockaddr:表示名字所用的一個數(shù)據(jù)結(jié)構(gòu),用來保存地址(包括IP地址和端口) Addrlen:設(shè)置結(jié)構(gòu)大小長度。listen()格式: int listen(int sockfd, int backlog); 作用:監(jiān)聽連接信號,和accepted函數(shù)合同。 參數(shù)說明: Sockfd:表示socket調(diào)用返回的文件描述符。 Backlog:表示接入隊列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個,也可以子定義510個。accept() 格式: Int accept (int sockfd, void *addr, int *addrlen); 作用:與listen函數(shù)合用,監(jiān)聽信息

15、、接收客戶端請求。 參數(shù)說明: Sockfd:表示socket的文件描述符。 Addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu)struct sockaddr-in的指針。 Addrlen:表示地址的長度。connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向連接的系統(tǒng)中客戶及連接效勞器時使用,connect必須在bind后使用。 參數(shù)作用: Sockfd:表示socket的文件描述符。 Serv-addr:表示村訪目的端口和ip地址套接字的數(shù)據(jù)結(jié)構(gòu)。send() 和 recv() 格式1:

16、 Int send (int sockfd, const vod *msg,int len, int flags); 功能:發(fā)送信息。 格式2: Int recv (int sockfd , void *buf,int len, usigned int flags); 作用:用于流式socket、數(shù)據(jù)報socket內(nèi)部之間的通信。close( ) 和 shutdown ( )格式: Close( int sockfd)或 Int shutdown(int sockfd , int how); 通信實現(xiàn)監(jiān)聽連接 利用socket、bind、listen建立連接,步驟是: 先用socket函數(shù)初始

17、化socket,創(chuàng)立新的sockfd。Sockfd = socketAF_INT,SOCK_STREAM,0此步驟涉及到IP地址及其處理過程。參數(shù)說明: inet_addr 函數(shù) INADDR_ANY該函數(shù)把由小數(shù)點分開的十進制IP地址轉(zhuǎn)為unsinged long 類型,而在實驗中所使用的為INADDR_ANY,使用利用自已的IP地址自動填充。利用bind函數(shù)綁定端口和IP地址。My_addr.sin_family=AF_INET; /*將地址族類型設(shè)定好 */My_addr.sin_port=htons(MYPORT; /* 將端口給其賦值*/My_addr.sin_addr.s_addr

18、=INADDR_ANY; /*用連接地址自動填充ip*/Bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr);/*sockfd 是分配的socket名字,my-addr那么便是分配好的端口與IP,用bind綁定*/利用listen監(jiān)聽請求 發(fā)送請求1)利用gethostbyname獲取主機信息。2)初始化socket端口。3)利用connect函數(shù)將自己的IP地址等信息發(fā)送到主機,等待主機調(diào)用accept函數(shù)來接受請求。主機接收請求,進行數(shù)據(jù)通信1)主機利用accept接收請求。2)創(chuàng)立子進程,顯示歡送信息;3)接收返回信息,

19、顯示連接成功,并推出連接;4)關(guān)閉客戶端口socket;5)關(guān)閉效勞端socket,結(jié)束子線程。第三章 運行結(jié)果/效勞端/客戶端1:真水無香/客戶端2:蠟筆小新心得體會在剛開始要做這個實訓的時候,發(fā)現(xiàn)對Qt的知識掌握的并不牢靠,對于從何下手感到迷茫。最后,參考了在網(wǎng)絡(luò)找到的聊天工程源代碼,邊翻看PPT講義,邊請教同學,才順利的做了出來。這個過程是痛苦的,但在這個痛苦的過程中,我也把這個學期學習的QT知識系統(tǒng)地梳理了一遍。當我把眾多零散的QT知識點連串起來時,發(fā)現(xiàn)自己對于所學的知識有了一個全新的認識,QT是多么的強大。Qt是一門面向?qū)ο蟮木幊陶Z言,所以開發(fā)時必須對自己要創(chuàng)立的工程具有清楚認識、明

20、確的思路,嚴謹?shù)貙ο蟮墓δ芘c代碼聯(lián)系起來,才能順利完成Qt工程。在做這個工程的過程中,我更是明白了良好的大局思維對于一個開發(fā)人員來說有多么重要。要做一個工程,要先對工程的程序有大體上的想法思路,有個流程框架,然后利用代碼功能實現(xiàn)你的想法,在寫代碼過程中遇到具體問題時邊寫邊修正思路,完善思路。在做這個工程的過程中,遇到的最大問題是無法解決發(fā)生中文時出現(xiàn)亂碼的問題。中英文編碼格式不同,導(dǎo)致了亂碼的出現(xiàn),屢次嘗試后最終還是放棄了這一功能的實現(xiàn)。這也讓我認識到QT的知識是多么博大精深,幾個月的學習是遠遠不夠的。整個工程做了十多天,每每遇到不熟悉的知識點時就要查看講義,還不懂就請教同學,工程的完成離不

21、開同學的幫助,所以我也非常感謝在不辭勞苦、不厭其煩給我講解的同學。做完這個工程后,我深深地感到自己知識的貧乏和以前學習方法上的一些缺乏。上課時老師講解的過程雖然是很清楚,但是比擬少去運用,對于程序、代碼實現(xiàn)的功能沒有一個清楚、深刻的認識。課堂后又沒有復(fù)習,導(dǎo)致一段時間后會遺忘局部的知識,到這次做工程時就要不斷的看講義。知識只有在不斷地運用中才能牢固地掌握。因此,我覺得在學習QT時應(yīng)該不斷地做工程。但是個人地學習能力不同,有些人獨立地完成一個會比擬吃力,那么幾個人組成一個小組做工程就是相互促進、共同進步地效果。 學習是艱難的,但無論學什么,只要有持之以恒的精神,就沒有學不好的知識。參考文獻1何加

22、銘主編嵌入式32位微處理器系統(tǒng)設(shè)計與應(yīng)用電子工業(yè)出版社2006年2張義磊,丁:濤,安吉宇三星S3C2410在嵌入式工業(yè)控制系統(tǒng)中的應(yīng)用長春理工大學學 報20043魏洪興,胡亮,曲學樓嵌入式系統(tǒng)設(shè)計與實例開發(fā)實驗教材一基于ARM9處理器與 Linux操作系統(tǒng)清華大學出版社2005年 4許海燕,付炎著嵌入式系統(tǒng)技術(shù)與應(yīng)用機械工業(yè)出版社2002年5DavidARusling朱珂等譯Linux編程白皮書機械工業(yè)出版社2000年6田澤主編嵌入式系統(tǒng)開發(fā)與應(yīng)用教程北京航空航天大學出版社2005年7周立功主編ARM嵌入式系統(tǒng)根底教程北京航空航天人學出版社2005年8陳賾主編ARM9嵌入式技術(shù)及Linux高級

23、實踐教程北京航空航天大學出版社2005年程序附錄TCP 通信實現(xiàn)#include#include#include#include#include#include#include#include#include#define MYPORT 3490#define BACKLOG 10 #define MAXDATASIZE 1024int sockfd,new_fd;pthread_t accthread,recthread;void recmessage(void) while(1) int numbytes; char bufMAXDATASIZE; if(numbytes = recv(n

24、ew_fd,buf,MAXDATASIZE,0) = -1)perror(recv); exit(1); bufnumbytes = 0; if(strcmp(buf,exit) = 0)printf(Client is closedn);close(new_fd);close(sockfd);exit(1);printf(Client:%sn,buf); void acceptconnect(void) struct sockaddr_in their_addr; int sin_size; sin_size = sizeof(struct sockaddr_in); if(new_fd =

25、 accept(sockfd,(struct sockaddr*)&their_addr,&sin_size) = -1) perror(accept); exit(1); printf(server:got connection from %sn,inet_ntoa(their_addr.sin_addr); if(pthread_create(&recthread,NULL,(void *)recmessage,NULL)!= 0) printf(Create thread error!rn); exit(1); int main(void) struct sockaddr_in my_a

26、ddr; if(sockfd = socket(AF_INET,SOCK_STREAM,0) = -1) perror(socket); exit(1); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr) = -1) perror(bind); exit

27、(1); if(listen(sockfd,BACKLOG) = -1) perror(listen); exit(1); if(pthread_create(&accthread,NULL,(void *)acceptconnect,NULL) != 0) printf(Create thread error!rn); exit(1); while(1) char msgMAXDATASIZE; scanf(%s,msg); if(send(new_fd,msg,strlen(msg),0) = -1) perror(send); close(new_fd); exit(1); if(str

28、cmp(msg,exit) = 0) printf(Byebye!n); close(new_fd); close(sockfd); exit(1); return 0;客戶端源程序清單如下,設(shè)文件名為#include#include#include#include#include#include#include#include#include#define PORT 3490#define MAXDATASIZE 1024int sockfd;pthread_t recthread;void recmessage(void) while(1) int numbytes; char bufMAXDATASIZE; if(numbytes = recv(sockfd,buf,MAXDATASIZE,0) = -1) perror(recv); exit(1); bufnumbytes=0; if(strcmp(buf,exit) = 0) printf(Server is closedn); close(sockfd); exit(1); printf(Server:%sn,buf); int main(int argc,

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論