freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux平臺下的聊天軟件的設計與開發(fā)畢業(yè)設計-資料下載頁

2025-05-11 13:00本頁面

【導讀】手段,被越來越多的人所使用。文章主要分為四個部分,第一部分主要分析了該類產(chǎn)品的。一個發(fā)展過程和開發(fā)此類軟件的背景及意義。在此基礎上,進一步的分析了該類。產(chǎn)品的需求情況。在第三章中詳細的介紹了所選取的開發(fā)環(huán)境,通過了解這些知。識將會對該類軟件的開發(fā)流程有一個總體的認識。之后,在通過對預備方案的分。析和總結(jié)后,最終確定設計路線。細的劃分和設計,并且運用各種圖表清晰的展現(xiàn)了軟件的模塊信息和總體結(jié)構(gòu)。軟件的預期效果在這一章節(jié)中得到了體現(xiàn),完成效果符合前期的需求分析。最后總結(jié)了該軟件開發(fā)的不足之處,還有軟件需要完善的部分。課題的背景及意義··············································································1. 網(wǎng)絡聊天軟件的發(fā)展及現(xiàn)狀·································&#

  

【正文】 服務器會將在線的用戶聯(lián)系人列表發(fā)送給客戶端,此時客戶端即可顯示有哪些好友在線而哪些是離線的。當用戶點擊在線好友時便會彈出一個聊天信息窗體,該窗體用于發(fā)送和接收用戶的聊天信息。當用戶點擊離線用戶時便會觸發(fā)一個離線消息事件,該事件通過服務器轉(zhuǎn)發(fā)方式發(fā)送給離線用戶,當對方上線時便可查看該離線消息。具體流程如下圖所示: 第 14 頁 共 26 頁 圖 45 客戶端消息處理流程 圖 申請用戶流程 管理員在服務器一端統(tǒng)一注冊用戶,然后將賬號分發(fā)給各用戶,申請用戶為單獨程序完成,當新用戶注冊好后系統(tǒng)會創(chuàng)建 3個用戶信息表用來保存相應的客戶信息。 具體流程如下圖所示: 圖 46 管理 用戶流程圖 運行用戶管理程序 添加用戶 顯示用戶 刪除用戶 退出程序 第 15 頁 共 26 頁 5 詳細設計 該部分詳細講述了服務器和客戶端的界面和代碼,直觀地對該軟件進行設計說明,通過該部分將對軟件有一個全面的了解。 服務器主要函數(shù) 和變量 套接字 描述字 : int sockfd, client_sockfd 套接字 地址結(jié)構(gòu): struct sockaddr_in servAddr, cliAddr 線程 id標識: pthread_t pthd 線程調(diào)用函數(shù): void gif_handle_client(int client_sockfd) 服務器主體函數(shù)只負責了套接字的創(chuàng)建、幫定和監(jiān)聽任務,一旦服務器接收到了來自客戶端的消息后,就會創(chuàng)建一個線程來處理該連接,當線程創(chuàng)建后它就會調(diào)用該函數(shù)對客戶消息進行處理。 該函數(shù)中有 7 個主要消息處理模塊,這些模塊針對不同的客戶消息進行處理,將他們 組合在一起 便形成了一套完整的 消息處理機制。在 中我們敘述了服務器的消息處理流程,而最后的消息處理部分就是由這 7個模塊來 完成的。 發(fā)送聯(lián)系人狀態(tài)函數(shù): void gif_send_clients_contact_list(chat *client_loginid,int client_sockfd, int type)該函數(shù)的 主要作用是當用戶的在線狀態(tài)標志發(fā)生變動時,服務器要及時地做出判斷,并向該用戶的聯(lián)系人發(fā)送該用戶狀態(tài)變更后的信息,以便對方能夠及時地了解到聯(lián)系人的狀態(tài)信息。 獲取系統(tǒng)時間函數(shù): char *gif_get_system_time() 該函數(shù)取出當前系統(tǒng)時間并隨消息一同發(fā)出,以便讓用戶能更好的了解到消息是何時 發(fā)出的。 服務器 消息 處理 模塊的設計 與實現(xiàn) 服務器的消息處理模塊主要由 7 部分組成 ,下面進行分別論述: 用戶登錄消息處理模塊: 當服務器接收到用戶消息并判斷是登錄消息后,服務器將根據(jù)用戶所發(fā)送過來的用戶名和密碼到 表中進行匹配,如果匹配成功則把該用戶加入到 表中,設置用戶在線狀態(tài)為真的同時調(diào)用發(fā)送聯(lián)系人在線列表函數(shù),向添加該用戶為好友的用戶發(fā)送該用戶的上線信息。如果匹配不成功,服務器將發(fā)送登錄失敗消息給客戶端,要求用戶重新登錄。 添加好友信息處理模塊: 當服務器收到用戶請求加好友的 消息時,服務器首先在 中查找要被添加的用戶是否存在,如果該用戶存在則把該用戶的信息存儲到當前用戶的好友文件中,同時在被添加好友的用戶的 表中保存當前用戶的信息。 第 16 頁 共 26 頁 刪除好友信息處理模塊: 當服務器接收到用戶的該消息請求時,服務器根據(jù)用戶所提供的好友用戶名來刪除被指定的好友,同時將用戶聯(lián)系人表進行更新,在被刪除的好友的被添加好友表 中將當前用戶刪除。 用戶聊天信息轉(zhuǎn)發(fā)的處理模塊: 當服務器判斷用戶所請求的信息為聊天消息后,服務器會根據(jù)用戶所指定的聊天對象到 表中 查找被指定用戶是否在線,如果被指定用戶在線則提取他的套接字地址結(jié)構(gòu),并按照該套接字信息將消息轉(zhuǎn)發(fā)。 如果用戶不在線則將消息標識設定為離線消息,并將該消息寫入被指定用戶的離線消息文件中。 用戶下線消息處理模塊: 當服務器判斷用戶所請求的信息為下線消息后 ,服務器將把 用戶 從 中刪除,設置該用戶狀態(tài)為下線,同時調(diào)用發(fā)送聯(lián)系人狀態(tài)函數(shù)將標志位設置為離線向該用戶的聯(lián)系人發(fā)送。 離線消息處理模塊: 當服務器判斷用戶所請求的信息為讀取離線消息后,服務器會去讀用戶的離線消息文件,如果該文件中有被標識為新的離線消 息時,服務器將把該消息提取出來發(fā)送給用戶,同時把該消息標識為已讀。 刪除離線消息處理模塊: 如果客戶 做出 了刪除離線消息的動作, 那么服務器端將會根據(jù)用戶的發(fā)送信息把該用戶的離線消息文件中的離線消息刪除。 服務器數(shù)據(jù)存儲的方法 該服務器采用文件作為數(shù)據(jù)存儲的對象。之所以采用這種發(fā)式是因為該服務器作為一個小型的聊天軟件的服務器,本身所要求保存的數(shù)據(jù)量并不大,且用戶數(shù)量也是比較有限的,在這種情況下采用文件方式對信息進行讀取在速度和開銷上都要有一些優(yōu)勢 ,且便于管理員管理用戶。 在編程時主要使用 fopen fread fwrite fclose 等函數(shù)對文件進行操作,被打開文件的操作權限由 fopen 的參數(shù)來決定,讀取控制由 fread 來完成, fwrite主要負責向文件 中 寫入新的信息。 服務器上主要存放 5類用戶信息文件: 用戶信息數(shù)據(jù)文件: 該文件中保存了用戶的 loginid 和 password。 在線用戶數(shù)據(jù)文件: 該文件中保存了當前在線用戶的 loginid 和 socket 信息。 用戶擁有好友文件: 第 17 頁 共 26 頁 該文件中保存了當前用戶所添加的好友信息。 被添加為好友文件: 該文件中保存了有哪些用戶把當前用戶添加為好友。 離線消息存儲文件: 該文件中保存了其它用戶發(fā)給當前用戶的離線消息。 客戶端主要窗口設計 根據(jù)前面的選題背景和需求分析,此款軟件的客戶端部分提供了圖形用戶界面, 程序運行后激活主窗體 ,在主窗體上點擊設置為敏感狀態(tài)的按鈕就會產(chǎn)生相應的事件,該事件將會觸發(fā)一個消息驅(qū)動所指定的函數(shù)來處理這個操作。 主窗體:該窗體中包含了所有的用戶操作按鈕和好友列表,用戶的操作都在這個窗體中完成。 圖 47 程序主窗口 窗體中包含按鈕 : Conn:登陸按鈕,點擊可激活登錄窗口 Add: 添加好友按鈕 Conf:程序配置按鈕 Offline:查看離線消息按鈕 第 18 頁 共 26 頁 Conn 菜單:包含 Conn、 Disconnect 和 Quit 按鈕 Contacts 菜單:包含 Add、 Delete 和 Offline 按鈕 Help 菜單:包含 About 按鈕 聯(lián)系人列表: Status 列:顯示聯(lián)系人狀態(tài)信 Contacts 列:顯示好友列表 Available 顯示表示用戶有好友 當用戶無好友時顯示 Not Available 登錄窗口: 當用戶點擊主窗口中的 Conn 按鈕時,該窗體 被激活。 需要填寫信息: Server ip:填寫服務器地址 User id: 填寫用戶名 Password :填寫密碼 點擊按鈕的消息事件: Cancel:退出當前窗口 Clear:清空填寫的信息 OK:觸發(fā) on_butOk_clicked 函數(shù) 該函數(shù)用于連接服務器并同服務器進行信息的發(fā)送與接收 圖 48 登錄窗口 添加用戶窗口: 當用戶電擊主窗口中的 Add 按鈕時該窗體被激活。 Contact’ s id:填寫要添加的好友的 loginid 號 OK: GIF_ADD_CONTACTS_MSG 同時向服務器發(fā)送 消息請求 第 19 頁 共 26 頁 圖 49 添加好友窗口 系統(tǒng)消息窗口: 當用戶的操作成功或者失敗的時候,系統(tǒng)會顯示一條消息給用戶,以便提示用戶操作是否成功。 在相關的函數(shù)內(nèi)將該窗口的激活屬性打開,消息窗口便會自動的彈出并顯示消息。 圖 410 系統(tǒng)消息窗口 離線消息窗口: 當用戶點擊主窗口中的 Offline 按鈕時,該窗體被激活。 離線消息可以查看當用戶不在線時,有哪些用戶向該用戶發(fā)送了離線消息。 圖 411 離線消息窗體 聊天窗口: 第 20 頁 共 26 頁 當用戶點擊好友時,該窗口被激活。 圖 412 聊天窗口 紅色顯示的是用戶自身, 藍色為聯(lián)系人。 上面的窗體是客戶端用戶在使用中會經(jīng)常使用到的一些窗口事件,這些部件統(tǒng)一起來便形成了一套完整的客戶端圖形用戶界面。 客戶端 主要 函數(shù) 和變量 GtkWidget *tree:用于顯示客戶端聯(lián)系人列表的樹視圖 GtkWidget *offline_tree:用于顯示離線消息的樹視圖 GtkWidget *chat_window[100]:用于保存聊天窗體的編號 。 GtkListStore *offline_temp_store:定義一個 離線消息 數(shù)據(jù)管理類型 。 GtkTreeIter offline_selected_iter: 定義一個查詢離線消息的迭代器。 GtkTreeModel *offline_selected_model:定義離線消息查詢數(shù)據(jù)管理接口 。 GtkCellRenderer *renderer:定義一個數(shù)據(jù)表現(xiàn)形式 繪制類型 。 enum { CONTACTS_COLUMN_TEXT, STATUS_COLUMN_PIXMAP }。 上面的枚舉類型定義了用戶聯(lián)系人視窗中的列標識。 enum { 第 21 頁 共 26 頁 OFFLINE_NEW_PIXMAP, OFFLINE_SENDER_TEXT, OFFLINE_DATESERIAL_TEXT, OFFLINE_MSG_TEXT, OFFLINE_COLUMNS }。 上面的枚舉類型定義了用戶離線消息查看窗口中的列標識。 gtk_widget_set_sensitive(widget, TRUE):設置指定控件的敏感度 TRUE 可以點擊 FALSE 則不能點擊 。 Void gif_receive_messages(int server_sockfd): 處理從服務器端發(fā)送過來的消息,根據(jù)信息包所攜帶的消息類型信息選擇消息處理模塊。 void gif_call_client_for_chat(GtkTreeSelection *selection, gpointer data): 當用戶點擊聯(lián)系人時 會 產(chǎn)生 一個 消息事件, 程序 根據(jù)用戶所選擇的聯(lián)系人 生成聊天窗口,并對該窗體進行初始化。 在系統(tǒng)調(diào)用線程時為保證線程安全,需要前后分別調(diào)用 gdk_threads_enter ()和 gdk_threads_leave ()函數(shù)。 例如: gdk_threads_enter()。 gtk_widget_show(create_msgbox(error, Server Disconnected))。 gdk_threads_leave()。 客戶端功能模塊的設計 與實現(xiàn) 用戶認證模塊: 主要用到的函數(shù)為: connect(), send(), pthread_create() 當用戶啟動程序后首先需要用戶登陸到服務器才能進一步的對軟件進行操作,這一部分即為用戶認證模塊。 該模塊 在登陸窗口 中 收集服務器的 IP 地址和用戶的用戶名和密碼。當用戶點擊登陸后,系統(tǒng)將用戶輸入的 IP地址寫入 Socket 地址結(jié)構(gòu),然后對套接口地址結(jié)構(gòu)進行綁定。 同時將用戶名寫入消息頭結(jié)構(gòu)體,并將密碼隨同數(shù)據(jù)字段一 起發(fā)送給服務器。 如果登陸成功,則 創(chuàng)建線程來維護和服務器的連接。之后, 程序進入主體運行狀態(tài),各功能模塊被激活。 界面顯示模塊: 當用戶成功登陸后,在聯(lián)系人列表中將會顯示用戶的聯(lián)系人信息,在離線消息窗口中會顯示接收到的離線消息 ,這兩個視圖均是用列表視圖來實現(xiàn)的。 用戶列表 和離線消息列表 的構(gòu)建是通過 下面的 函數(shù)來實現(xiàn)的: 第 22 頁 共 26 頁 新建一個數(shù)據(jù)的存儲 模型 store= gtk_tree_store_new (2, G_TYPE_STRING, GDK_TYPE_PIXBUF)。 新建一個管理視圖 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store))。 將視圖添加到指定的容器中 gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree)。 通過以上的 3 個步驟,就會在容器中生成一個可供用戶查看的滾動視圖。 但這個視圖中并沒有定義列信息,業(yè)就是說這是一個空的無任何用處的列表視圖,要將用戶的信息顯示出來,還需要使用到以下的函數(shù): 新建一個圖像類型的繪制方式 renderer = gtk_cell_renderer_pixbuf_new ()。 給列添加新的屬性, STATUS_COLUMN_PIXMAP 指定了行信息, ” pixbuf” 指定了繪制類型為圖像, renderer 指定了繪制方式 column = gtk_tree_view_column_new_with_attributes (Status, renderer, pixbuf, STATUS_COLUMN_PIXMAP, NULL)。 將建好的列添加到樹視圖中 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column)。 通過以上 3 個步驟一個視圖中就有了列,在進行相同的操作可創(chuàng)建多個列值,在用戶聯(lián)系人視圖中只建了兩個列分別顯示聯(lián)系人姓名和聯(lián)系人狀態(tài)。 以上所創(chuàng)建的視圖和存儲空間都還是空的,要想將數(shù)據(jù)從其中顯示出來還需要使用到下面的函數(shù): 下面的函數(shù)負責從指定的存儲模型中取出新行的 iter gtk_tree_store_append (store, amp。parent_iter, NULL) 設置新添加行的值 gtk_tree_store_set (store, amp。parent_iter,CONTACTS_COLUMN_TEXT, Available, 1) iterator 是系統(tǒng)提供的一種訪問一個容器( container)對象中各個元素,而又不需暴露該對象的內(nèi)部細節(jié)的方法。 通過以上兩個函數(shù),便可以在視圖中創(chuàng)建新的顯示行。 消息處理模塊: 當客戶端和服務器建立連接后,客戶端會創(chuàng)建一個專門的線程來維護客戶端和服務器之間的連接,該線程調(diào)用函數(shù)根據(jù)從服務器接收到的消息類型來選擇消息處理模塊。 該模塊主要處理以下幾種消息類型: 更新 聯(lián)系人列表信息: 第 23 頁 共 26 頁 當判斷接收到的消息為 GIF_ADDRLIST_MSG 時,程 序?qū)β?lián)系人視圖進行刷新以便及時的顯示聯(lián)系人的當前狀態(tài)。實現(xiàn) 刷新 的方法是,先將以前的樹移除然后按照新的聯(lián)系人狀態(tài)進行樹的繪制,具體的編寫方法在上節(jié)的界面顯示模塊中以給出,這里就不再重復了。 聊天信息: 當接收服務器發(fā)送的消息的類型為 GIF_CHAT_MSG 時,程序首先要確定是誰發(fā)出的聊天請求,然后判斷聊天窗口是否開啟,如果未開啟則將開啟標識設為真,然后打開聊天窗口。同時設置用戶和聯(lián)系人的顯示顏色,以便區(qū)分聊天消息的來源。 消息請求成功或失敗信息: 如果接收到了 GIF_SUCCESS_N_ERROR_MSG 類 型的消息,則程序還會進一步的根據(jù) 另外一個標識符判斷是何種系統(tǒng)消息,并通過系統(tǒng)消息窗口顯示給用戶。 離線消息: 如果接收到的消息類型為 GIF_OFFLINE_MSG,程序會按照界面顯示模塊中對樹視圖的創(chuàng)建步驟那樣,創(chuàng)建一個顯示離線消息的視圖用來顯示離線消息。 以上的幾大模塊構(gòu)成了客戶端功能處理的主體,大部分的操作和消息處理都是由這些模塊來完成的。
點擊復制文檔內(nèi)容
畢業(yè)設計相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1