LINUX課程設計_第1頁
LINUX課程設計_第2頁
LINUX課程設計_第3頁
LINUX課程設計_第4頁
LINUX課程設計_第5頁
已閱讀5頁,還剩11頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、Linux課程設計網絡聊天小組成員介紹:王士?。蛻舳顺绦蛟O計,構建主要思想框架)趙荻131842223(客戶端程序設計,總結報告) 林雅潔131842198(服務端程序設計,查閱資料)張柯131842222(服務端程序設計,查閱資料)林麗(服務端程序設計,查閱資料)安徽工業大學工商學院1. 系統概述網絡聊天程序是目前應用極為廣泛的一種網絡軟件,對于方便人們的交流溝通非常有效,同時,作為一種典型的網絡應用,編寫網絡聊天程序是學習基于Linux的網絡編程的有效方法。本次課題設計是在使用Linux線程和Socket接口的基礎上,編寫網絡聊天程序,從而掌握Linux應用程序開發的基本方法,練習Lin

2、ux線程及Socket編程的方法,從而將所學知識融會貫通。2. 需求分析2.1 功能需求本次課程設計需要完成以下功能:(1) 實現在服務器的控制下,完成多人聊天,采用單機多終端模擬方式。(2) 在服務器端,使用多線程機制,為多個用戶服務。(3) 服務器能夠對要求接入的客戶端進行身份識別,完成聊天數據的轉發,并能夠將不同用戶聊天記錄存檔。2.2 性能需求(1) 可靠性高,能在由于系統問題或其它原因產生錯誤后,作出相對應處理,比如網絡初始化失敗、服務器不在線等,可以提示用戶安全退出本程序,在出現不可知的錯誤以后,可以盡量安全的退出程序。(2) 模塊化設計此軟件的功能,不同的模塊實現不同的功能,使得

3、軟件易于以后的維護與擴展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應用。(3) 宜操作性,程序簡單易懂,容易上手使用。2.3運行環境要求本項目開發主要完成軟件開發可在Linux平臺下開發3. 系統設計3.1 系統總體流程圖圖1 系統設計流程圖3.2系統模塊設計 轉發信息模塊 服務器定義readMessage函數用于存儲要求請求連接的用戶名,客戶發送的信息,該消息服務器、客戶端共享,客戶端讀取該信息,從而實現信息轉發。3.2.2 用戶登錄模塊 用戶輸入用戶名、服務器ip地址及密碼,如果通過合法性檢測,則可進入聊天主界面與其他人進行聊天。 群聊模塊客戶端點擊“發送信息”按鈕,該客戶端的

4、ip地址、端口號以及信息內容一起打包寫入服務器readMessage函數,客戶端通過線程可以讀取該客戶write中的內容,從而實現群聊。3.3 詳細設計 服務器模塊圖2 服務器模塊流程圖該服務器界面用于顯示用戶上線與下線的信息,不可用于聊天,是用于將客戶端群聊時發送的信息轉發給每一個在線用戶,處于一個承接的作用。 登錄模塊設計圖3 登錄模塊流程圖用戶登錄需輸入相關信息,經過相關的檢測后,方可登錄。登陸后可查看群聊信息,且可與其他人進行聊天 消息格式化模塊消息格式化是將用戶的對應信息合成固定形式進行傳送。圖4 消息格式化模塊流程圖 群聊模塊用戶登陸以后,可與顯示在線的任何用戶進行聊天,也可與在線

5、用戶一起進行群聊。圖5 群聊模塊程序流程圖4. 源代碼客戶端程序 client.c #include #include #include #include #include #include #include #include #define TRUE 1#define PORT 5000 static int sockfd;void recvfromserver( ) /接受服務器消息線程入口函數char mes1024;int nbytes=0;while( 1 ) memset(mes,0,sizeof(mes);nbytes=read(sockfd,mes,sizeof(mes);if

6、(nbytes0)mesnbytes=0;printf(%sn,mes);pthread_exit(NULL);int main(int argc, char *argv)/int sockfd;char buffer1024;struct sockaddr_in server_addr;struct hostent *host;int portnumber,nbytes;char strhost16;char clientname20;char mes1024;int thr_id; /* thread ID for the newly created thread */pthread_t

7、p_thread; /* threads structure */if(argc!=1)fprintf(stderr,Usage:%s an,argv0);exit(1);Printf (請輸入服務器ip地址n);scanf(%s,strhost);if(host=gethostbyname(strhost)=NULL)fprintf(stderr,Gethostname errorn);exit(1); /* 客戶程序開始建立 sockfd 描述符 */printf (正在建立套接口.n);if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)fprintf(

8、stderr,Socket Error:%san,strerror(errno);exit(1); /* 客戶程序填充服務端的資料 */bzero(&server_addr,sizeof(server_addr);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr=*(struct in_addr *)host-h_addr);printf (套接口創建成功,正在鏈接服務器.n); /* 客戶程序發起連接請求 */if(connect(sockfd,(struct sockad

9、dr *)(&server_addr),sizeof(struct sockaddr)=-1)fprintf(stderr,Connect Error:%san,strerror(errno);exit(1); /* 連接成功了 */Printf (鏈接服務器成功n歡迎來到聊天室n);Printf (請輸入你的用戶昵稱n);scanf(%s,clientname);/write(sockfd,clientname,sizeof(clientname);Printf (nn開始聊天吧(Quit斷開連接)nn);thr_id = pthread_create(&p_thread, NULL, re

10、cvfromserver, NULL);while(1)memset(buffer,0,sizeof(buffer);memset(mes,0,sizeof(mes);scanf(%s,buffer);strcat(mes,clientname);strcat(mes,:);strcat(mes,buffer);/printf(main thread %sn,mes);if(write(sockfd,mes,sizeof(mes)=-1)fprintf(stderr,Write Error:%sn,strerror(errno);exit(1);if(strcmp(buffer,Quit)=0

11、)break; /* 結束通訊 */close(sockfd);exit(0);服務器程序 (server.c)#include #include #include #include #include #include #include #include #define MAXLINE 1000 /在一條消息中最大的輸出字符數#define LISTENQ 20 /最大監聽隊列#define PORT 5000 /監聽端口#define MAXFD 20 /最大的在線用戶數量void *get_client(void *); int sockfd,i;static int maxi=0;/ma

12、xi表示當前client數組中最大的用戶的i值static int clientMAXFD;void recvandsend(void) /監聽轉發線程入口函數int index=0;int nbytes=0;char buffer1024;int len;int outindex=0;while(1)if(maxi0)memset(buffer,0,sizeof(buffer);nbytes=0;/index+;nbytes=read(clientindex+,buffer,sizeof(buffer);/printf(%d,%dn,index,clientindex);if(nbytes0

13、)buffernbytes=0;printf( %sn,buffer);outindex=0;while(outindex=maxi)index=0;pthread_exit(NULL);int main(int argc, char *argv)/int client_fdLISTENQ,clientnum=0;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int sin_size,portnumber;char hello=Hello! Are You Fine?n;int thr_id; /* thread I

14、D for the newly created thread */pthread_t p_thread; /* threads structure */int new_fd=0;memset(client,0,sizeof(client);if(argc!=1)fprintf(stderr,Usage:%s portnumberan,argv0);exit(1); /* 服務器端開始建立 socket 描述符 */if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)fprintf(stderr,Socket error:%sna,strerror(errno)

15、;exit(1); /* 服務器端填充 sockaddr 結構 */bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(PORT); /* 捆綁 sockfd 描述符 */if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1)fprintf(stderr

16、,Bind error:%sna,strerror(errno);exit(1);printf(服務器監聽端口%d.n,PORT);/* 監聽 sockfd 描述符 */if(listen(sockfd,LISTENQ)=-1)fprintf(stderr,Listen error:%sna,strerror(errno);exit(1);thr_id = pthread_create(&p_thread, NULL, recvandsend, NULL);printf(歡迎來到本聊天室n);while(1)/* 服務器阻塞,直到客戶程序建立連接 */if(maxi=20)printf(以達到

17、人數上線n);continue;sin_size=sizeof(struct sockaddr_in);if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)=-1)fprintf(stderr,Accept error:%sna,strerror(errno);exit(1);/*fprintf(stderr,Server get connection from %sn,inet_ntoa(client_addr.sin_addr);*/clientmaxi+=new_fd;printf(n新用戶進入聊天室%dn,new_fd);close(sockfd);exit(0);5. 相關截圖6. 設計總結這次Linux課程設計,我們學會了許多課本上學不到的東西,同時也加強了我們的動手、思考和解決問題的能力以及學會了相互幫助,相互團結的團隊精神,受益匪淺。從前的學習我們總是流于表面的理解,而現在要做課程設計,就不得不要求我

溫馨提示

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

評論

0/150

提交評論