LINUX課程設(shè)計只是分享_第1頁
LINUX課程設(shè)計只是分享_第2頁
LINUX課程設(shè)計只是分享_第3頁
LINUX課程設(shè)計只是分享_第4頁
LINUX課程設(shè)計只是分享_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除Linux 課程設(shè)計網(wǎng)絡(luò)聊天小組成員介紹:王士?。蛻舳顺绦蛟O(shè)計,構(gòu)建主要思想框架)趙荻 131842223(客戶端程序設(shè)計,總結(jié)報告)林雅潔 131842198(服務(wù)端程序設(shè)計,查閱資料)張柯 131842222(服務(wù)端程序設(shè)計,查閱資料)林麗(服務(wù)端程序設(shè)計,查閱資料)安徽工業(yè)大學(xué)工商學(xué)院word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除1. 系統(tǒng)概述網(wǎng)絡(luò)聊天程序是目前應(yīng)用極為廣泛的一種網(wǎng)絡(luò)軟件,對于方便人們的交流溝通非常有效,同時,作為一種典型的網(wǎng)絡(luò)應(yīng)用,編寫網(wǎng)絡(luò)聊天程序是學(xué)習(xí)基于Linux 的網(wǎng)絡(luò)編程的有效方法。本次課題設(shè)計是在使用Linux

2、線程和 Socket接口的基礎(chǔ)上,編寫網(wǎng)絡(luò)聊天程序,從而掌握 Linux 應(yīng)用程序開發(fā)的基本方法,練習(xí)Linux 線程及 Socket 編程的方法,從而將所學(xué)知識融會貫通。2. 需求分析2.1 功能需求本次課程設(shè)計需要完成以下功能:(1) 實現(xiàn)在服務(wù)器的控制下,完成多人聊天,采用單機多終端模擬方式。(2) 在服務(wù)器端,使用多線程機制,為多個用戶服務(wù)。(3) 服務(wù)器能夠?qū)σ蠼尤氲目蛻舳诉M行身份識別,完成聊天數(shù)據(jù)的轉(zhuǎn)發(fā),并能夠?qū)⒉煌脩袅奶煊涗洿鏅n。2.2 性能需求(1) 可靠性高,能在由于系統(tǒng)問題或其它原因產(chǎn)生錯誤后,作出相對應(yīng)處理,比如網(wǎng)絡(luò)初始化失敗、服務(wù)器不在線等,可以提示用戶安全退出本程

3、序,在出現(xiàn)不可知的錯誤以后,可以盡量安全的退出程序。(2) 模塊化設(shè)計此軟件的功能,不同的模塊實現(xiàn)不同的功能,使得軟件易于以后的維護與擴展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。(3) 宜操作性,程序簡單易懂,容易上手使用。2.3 運行環(huán)境要求本項目開發(fā)主要完成軟件開發(fā)可在Linux 平臺下開發(fā)word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除3. 系統(tǒng)設(shè)計3.1 系統(tǒng)總體流程圖啟動客戶端登發(fā)送信息顯示在線入服務(wù)器用戶啟動服務(wù)器數(shù)據(jù)傳輸?shù)却龜?shù)據(jù)請求數(shù)據(jù)傳輸處理用戶數(shù)據(jù)數(shù)據(jù)傳輸顯示私聊信息顯示對所有人信息聊天圖 1 系統(tǒng)設(shè)計流程圖3.2 系統(tǒng)模塊設(shè)計轉(zhuǎn)發(fā)信息模塊服務(wù)器定義

4、 readMessage函數(shù)用于存儲要求請求連接的用戶名, 客戶發(fā)送的信息, 該消息服務(wù)器、客戶端共享,客戶端讀取該信息,從而實現(xiàn)信息轉(zhuǎn)發(fā)。用戶登錄模塊用戶輸入用戶名、服務(wù)器 ip 地址及密碼,如果通過合法性檢測,則可進入聊天主界面與其他人進行聊天。word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除群聊模塊客戶端點擊“發(fā)送信息”按鈕,該客戶端的ip 地址、端口號以及信息內(nèi)容一起打包寫入服務(wù)器 readMessage函數(shù),客戶端通過線程可以讀取該客戶write 中的內(nèi)容,從而實現(xiàn)群聊。3.3 詳細設(shè)計服務(wù)器模塊word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除開始創(chuàng)建套接字Socket否

5、顯示用戶下線信息套接字綁定到本地端口套接字接聽客戶端請求否是否有鏈接請求是返回套接字進行通信保存套接字中的內(nèi)容IP 鏈接是否正常是啟動轉(zhuǎn)發(fā)消息的線程讀取套接字中得內(nèi)容保存所有在線用戶名聊天是否啟動否是將在線用戶名單與“聊天啟動”標志 信息寫入輸出流寫入輸出流將消息轉(zhuǎn)發(fā)給所有在線用戶結(jié)束圖 2 服務(wù)器模塊流程圖word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除該服務(wù)器界面用于顯示用戶上線與下線的信息,不可用于聊天,是用于將客戶端群聊時發(fā)送的信息轉(zhuǎn)發(fā)給每一個在線用戶,處于一個承接的作用。登錄模塊設(shè)計開始顯示客戶端主界面連接服務(wù)器輸入用戶名,服務(wù)器 IP點擊確定是用戶名是否為空否是是否為空是IP

6、 是否為空是用戶名是否上線否調(diào)用群聊函數(shù)是是顯示群聊信息結(jié)束圖 3 登錄模塊流程圖word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除用戶登錄需輸入相關(guān)信息,經(jīng)過相關(guān)的檢測后,方可登錄。登陸后可查看群聊信息,且可與其他人進行聊天消息格式化模塊消息格式化是將用戶的對應(yīng)信息合成固定形式進行傳送。開始對應(yīng)用戶傳入消息格式化類轉(zhuǎn)發(fā)的消息用戶名標志消息格式化類將信息整合成固定格式傳送“【用戶名+:】”轉(zhuǎn)發(fā)的消息結(jié)束圖 4 消息格式化模塊流程圖word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除群聊模塊用戶登陸以后,可與顯示在線的任何用戶進行聊天,也可與在線用戶一起進行群聊。開始創(chuàng)建套接字寫入服務(wù)器端

7、口號與IP向服務(wù)器發(fā)起連接套接字中內(nèi)容流入對象輸出流啟動客戶端線程讀取套接字中的內(nèi)容檢查標志聊天已啟動發(fā)送消息啟動服務(wù)器轉(zhuǎn)發(fā)的信息在線用戶列表添加顯示到各用戶聊天該用戶窗口結(jié)束圖 5 群聊模塊程序流程圖word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除4. 源代碼客戶端程序client.c#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#in

8、clude <netinet/in.h>#include <sys/socket.h>#define TRUE 1#define PORT 5000static int sockfd;void recvfromserver()/接受服務(wù)器消息線程入口函數(shù) char mes1024; int nbytes=0; while( 1 )memset(mes,0,sizeof(mes); nbytes=read(sockfd,mes,sizeof(mes); if(nbytes>0) mesnbytes='0' printf("%sn"

9、,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;intthr_id;/* thread ID for the newly created thread */pthread_tp_thread;/* thread's struct

10、ure*/if(argc!=1) fprintf(stderr,"Usage:%s an",argv0);exit(1);word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除Printf("請輸入服務(wù)器 ip 地址 n");scanf("%s",strhost);if(host=gethostbyname(strhost)=NULL) fprintf(stderr,"Gethostname errorn"); exit(1);/* 客戶程序開始建立sockfd 描述符*/printf ("正在建立套接口

11、 .n"); if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,"Socket Error:%san",strerror(errno);exit(1);/* 客戶程序填充服務(wù)端的資料*/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_

12、addr);printf(" 套接口創(chuàng)建成功,正在鏈接服務(wù)器.n");/* 客戶程序發(fā)起連接請求*/if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1) fprintf(stderr,"Connect Error:%san",strerror(errno);exit(1);/* 連接成功了*/Printf ("鏈接服務(wù)器成功 n 歡迎來到聊天室 n"); Printf ("請輸入你的用戶昵稱 n");

13、scanf("%s",clientname);/ write(sockfd,clientname,sizeof(clientname);Printf("nn 開始聊天吧( "Quit" 斷開連接) nn");thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL); while(1) memset(buffer,0,sizeof(buffer); memset(mes,0,sizeof(mes); scanf("%s",buffer); s

14、trcat(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) break;/* 結(jié)束通訊*/close(sockfd);word 可編輯資料收集于網(wǎng)絡(luò),如有

15、侵權(quán)請聯(lián)系網(wǎng)站刪除exit(0);服務(wù)器程序(server.c)#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define MAXLINE 1000/在一條消息中最大的輸出字符數(shù)#define LISTENQ 20/最大監(jiān)聽隊列

16、#define PORT 5000/ 監(jiān)聽端口#define MAXFD 20/最大的在線用戶數(shù)量void *get_client(void *);int sockfd,i;static int maxi=0;/maxi 表示當前 client 數(shù)組中最大的用戶的i 值static int clientMAXFD;void recvandsend(void)/監(jiān)聽轉(zhuǎn)發(fā)線程入口函數(shù) int index=0; int nbytes=0; char buffer1024; int len;int outindex=0; while(1)if(maxi>0) memset(buffer,0,si

17、zeof(buffer); nbytes=0;/index+;nbytes=read(clientindex+,buffer,sizeof(buffer);/printf("%d,%dn",index,clientindex);if(nbytes>0) buffernbytes='0' printf(" %sn",buffer);outindex=0;while(outindex<maxi)if(write(clientoutindex+,buffer,sizeof(buffer)=-1) fprintf(stderr,&qu

18、ot;Write Error:%sn",strerror(errno); exit(1);word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除if(index>=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! A

19、re You Fine?n"intthr_id;/* thread ID for the newly created thread */pthread_tp_thread;/* thread's structure*/int new_fd=0;memset(client,0,sizeof(client);if(argc!=1) fprintf(stderr,"Usage:%s portnumberan",argv0); exit(1); /* 服務(wù)器端開始建立 socket 描述符 */ if(sockfd=socket(AF_INET,SOCK_STRE

20、AM,0)=-1) fprintf(stderr,"Socket error:%sna",strerror(errno); exit(1);/* 服務(wù)器端填充sockaddr 結(jié)構(gòu) */bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);/*捆綁 sockfd 描述符 */if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struc

21、t sockaddr)=-1) fprintf(stderr,"Bind error:%sna",strerror(errno); exit(1);printf(" 服務(wù)器監(jiān)聽端口 %d.n",PORT);/* 監(jiān)聽 sockfd 描述符 */if(listen(sockfd,LISTENQ)=-1) fprintf(stderr,"Listen error:%sna",strerror(errno);exit(1);thr_id = pthread_create(&p_thread, NULL, recvandsend, N

22、ULL); printf(" 歡迎來到本聊天室 n");while(1)word 可編輯資料收集于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系網(wǎng)站刪除/* 服務(wù)器阻塞 ,直到客戶程序建立連接*/if(maxi>=20) printf(" 以達到人數(shù)上線 n");continue;sin_size=sizeof(struct sockaddr_in);if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)=-1) fprintf(stderr,"Accept erro

溫馨提示

  • 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

提交評論