【《企業(yè)內(nèi)部聊天室的系統(tǒng)設(shè)計》21000字】_第1頁
【《企業(yè)內(nèi)部聊天室的系統(tǒng)設(shè)計》21000字】_第2頁
【《企業(yè)內(nèi)部聊天室的系統(tǒng)設(shè)計》21000字】_第3頁
【《企業(yè)內(nèi)部聊天室的系統(tǒng)設(shè)計》21000字】_第4頁
【《企業(yè)內(nèi)部聊天室的系統(tǒng)設(shè)計》21000字】_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

企業(yè)內(nèi)部聊天室的系統(tǒng)設(shè)計摘要隨著計算機科學(xué)和互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)上聊天已經(jīng)成為人們相互交流的方式,與E-mail和電話相比,聊天服務(wù)更加實時性和有效性。如今,越來越多的聊天室出現(xiàn)在我們的生活中,它的存在為人們提供了一個相互溝通的平臺,但是目前國內(nèi)外對于這類聊天室的研究還比較少。本課題采用軟件工程方法,綜合編程技術(shù)和網(wǎng)絡(luò)技術(shù),以VisualC++6.0為系統(tǒng)前臺應(yīng)用開發(fā)工具,主要研究了TCP/IP協(xié)議下的局域網(wǎng)聊天室。這個局域網(wǎng)聊天室使用客戶端/服務(wù)器(C/S)模型和TCP/UDP連接。它由兩個模塊組成:服務(wù)器和客戶端。本文詳細(xì)介紹了該局域網(wǎng)聊天室的設(shè)計與實現(xiàn)。服務(wù)器模塊用于維護(hù)網(wǎng)絡(luò)上的所有用戶信息,例如用戶名。聊天客戶端模塊主要包括:用戶登錄、信息發(fā)送、信息接收等。整個項目編制有條不紊,逐步完善了系統(tǒng)功能。該系統(tǒng)采用CSocket實現(xiàn)連網(wǎng)功能。本文介紹了系統(tǒng)的設(shè)計思想和實現(xiàn)過程,并給出了部分代碼。CSocket是MFC派生出來的CAsyncSocket同步阻塞Socket的封裝類。Socket是一個開放的,多協(xié)議的網(wǎng)絡(luò)編程接口,被廣泛地使用在Windows中。此聊天室是一組適用于互聯(lián)網(wǎng)網(wǎng)絡(luò)的網(wǎng)絡(luò)聊天室,操作簡單、靈活性、穩(wěn)定。聊天室的主要功能模塊有:用戶管理,圖像處理,本文介紹了該聊天室的結(jié)構(gòu)和主要功能。聊天室允許多人聊天和傳輸圖片。關(guān)鍵詞:vc++;MFC;Socket;多線程;C/S 目錄TOC\o"1-2"\h\u20431摘要 I第一章、緒論如今,人們對網(wǎng)絡(luò)的依賴程度越來越高,越來越離不開網(wǎng)絡(luò),所以聊天工具也越來越多。網(wǎng)絡(luò)真的替我們省下了不少資源,比如不用專門去公司開會。但是,有時候一些不可避免的情況比如這兩年的疫情,人們不得不在家呆著,這時網(wǎng)絡(luò)的作用便顯現(xiàn)出來。因此,基于VC++網(wǎng)絡(luò)編程的強大功能,本次畢業(yè)設(shè)計使用VC++編寫一個多人對話系統(tǒng)。本系統(tǒng)基于VC平臺上,系統(tǒng)的設(shè)計使用了面向?qū)ο蠹夹g(shù)和面向?qū)ο笤O(shè)計原則。系統(tǒng)采用C/S結(jié)構(gòu),客戶端與客戶端以及客戶端與服務(wù)器端之間通過CSocket傳遞消息。此次設(shè)計使用VC++語言編寫,開發(fā)工具采用VC6.0。1.1論文的目的與意義近年來,隨著全球信息化的不斷壯大,互聯(lián)網(wǎng)科學(xué)也在快速發(fā)展。為了高效、快捷地處理各種業(yè)務(wù),愈來愈多的企業(yè)在內(nèi)部工作中使用局域網(wǎng)。

通過內(nèi)部局域網(wǎng)幫助,企業(yè)可以簡化信息流程,提高信息交換的速度,提高工作效率。

但是,隨著企業(yè)規(guī)模規(guī)模的擴大和業(yè)務(wù)量的增長,企業(yè)內(nèi)部的信息也變得越來越私人化,企業(yè)只希望其員工通過內(nèi)部局域網(wǎng)進(jìn)行交流和溝通,這樣企業(yè)內(nèi)部的秘密就不會通過互聯(lián)網(wǎng)泄露給外界。

但是企業(yè)內(nèi)部的員工很難隨時隨地與外界進(jìn)行溝通交流,這樣就存在安全隱患。

為了解決以上矛盾,提出了局域網(wǎng)聊天軟件的開發(fā)思路,企業(yè)員工可以通過局域網(wǎng)聊天軟件進(jìn)行即時消息傳遞,召開網(wǎng)絡(luò)會議,隨時發(fā)布任務(wù)。

系統(tǒng)采用基于Socket的方法實現(xiàn)LAN通信,Socket的局域網(wǎng)通信軟件能夠為原有局域網(wǎng)提供良好、安全、快捷的通信機制。

它能夠根據(jù)企業(yè)的業(yè)務(wù)需要,靈活地選擇適合企業(yè)自身局域網(wǎng)通信的方案,并且能夠?qū)崟r地將企業(yè)內(nèi)部局域網(wǎng)的數(shù)據(jù)傳送給企業(yè)外部的主干網(wǎng)絡(luò)。

它的實現(xiàn)無需改變企業(yè)原有的局域網(wǎng)硬件,具有成本低的優(yōu)勢,它的使用可以有效的減少局域網(wǎng)的通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好的解決企業(yè)局域網(wǎng)的各種通信需求。基于Socket的局域網(wǎng)聊天工具很好的解釋了Socket通信的原理,在企業(yè)內(nèi)部通信的通信、教學(xué)和討論等方面具有實用價值。

它具有速度快,保密性好,網(wǎng)絡(luò)帶寬資源低,服務(wù)器吞吐量小,編程方便等優(yōu)點。

在此基礎(chǔ)上,本文對基于網(wǎng)絡(luò)的局域網(wǎng)通信進(jìn)行了深入網(wǎng)設(shè)備和通信協(xié)議,并對其進(jìn)行了測試。

基于Socket的局域網(wǎng)通信軟件應(yīng)用廣泛,不僅可以滿足傳統(tǒng)的通信需求,而且可以擴展到網(wǎng)絡(luò)教育、大數(shù)據(jù)、視頻、數(shù)據(jù)、視頻、音頻、視頻傳輸?shù)刃碌木W(wǎng)絡(luò)應(yīng)用中,具有廣闊的應(yīng)用前景。1.2論文主要內(nèi)容本文主要研究局域網(wǎng)中的多人聊天室,它是利用客戶端和服務(wù)器的模式,以及TCP/UDP協(xié)議,在客戶端與服務(wù)器之間信息傳輸和圖片發(fā)送。聊天室由兩個部分組成:客戶端和服務(wù)器。首先,需要打開并登錄到該服務(wù)器,指定該服務(wù)器的IP地址和端口號,然后通過打開客戶端和設(shè)置網(wǎng)名來連接到服務(wù)器。一旦連接完成,客戶端可以互相發(fā)送消息和照片。服務(wù)器端則主要用于維護(hù)網(wǎng)絡(luò)上的所有用戶信息;本文詳細(xì)描述了系統(tǒng)的軟件設(shè)計和硬件設(shè)計,并給出了部分程序的代碼??蛻舳酥饕擞脩舻卿洝D片發(fā)送和接收,信息發(fā)送和接收等功能。整個程序采用結(jié)構(gòu)化編程的方法,對系統(tǒng)功能進(jìn)行逐步的編譯和完善。本設(shè)計的實施需要精通VC++語言,熟悉VC++平臺操作,對于MFC、套接字、多線程技術(shù)知識有所了解。1.3國內(nèi)外聊天系統(tǒng)的現(xiàn)狀目前,國內(nèi)外有很多做聊天系統(tǒng)的公司,也有各種各樣的產(chǎn)品,如騰訊的QQ、微信,抖音等。這些公司都在自己的產(chǎn)品中加入了聊天功能,但是各種產(chǎn)品都存在不足之處,比如:產(chǎn)品的交互性、語音識別、聊天的時效性等等。我用最具標(biāo)志性的QQ和MSN做了一些研究,為聊天系統(tǒng)的開發(fā)做準(zhǔn)備。毫無疑問,自99進(jìn)入國內(nèi)即時通訊市場以來,騰訊在該領(lǐng)域占據(jù)主導(dǎo)地位,并迅速獲得了市場份額。一直穩(wěn)居國內(nèi)用戶第一,即使在微軟MSN的大力推動下,騰訊QQ的時長占有率也一直在穩(wěn)步提升。騰訊的成功得益于其對移動互聯(lián)網(wǎng)的創(chuàng)新和完善,騰訊的成功在于它利用移動互聯(lián)網(wǎng)不斷的進(jìn)行創(chuàng)新和完善,尤其在QQ上。參考了網(wǎng)絡(luò)上的信息,也通過自己的觀察和了解知道了騰訊QQ運行時間的各種細(xì)節(jié)。騰訊公司的這些技術(shù)手段,使得它在網(wǎng)絡(luò)安全方面采用了一些方法,對騰訊公司的服務(wù)器進(jìn)行了分析。可以肯定的是,騰訊QQ是一個多服務(wù)器服務(wù),是總控客戶端,與客戶端UDP直連通信。

服務(wù)器只能在兩個客戶端之間無法建立直連的情況下進(jìn)行中轉(zhuǎn)通信服務(wù)器。這些都是國內(nèi)通信系統(tǒng)的現(xiàn)狀,雖然國內(nèi)和國際通信技術(shù)已經(jīng)得到了很好的發(fā)展,但仍有很多地方要走。例如聊天系統(tǒng)的發(fā)展就是其中之一。我借用了現(xiàn)有的聊天工具與技術(shù),設(shè)計了自己的一個聊天系統(tǒng)。希望我們能夠盡快跟上國際國內(nèi)先進(jìn)技術(shù)的步伐,為國家和社會科技的發(fā)展做出自己應(yīng)有的貢獻(xiàn)。圖1-1騰訊QQ模型。與騰訊QQ不同,微軟的MSNMessenger只使用TCP作為傳輸層通信協(xié)議,所有客戶端都通過TCP連接到服務(wù)器上。圖1-2是MSN服務(wù)器-客戶端模型。圖1-1騰訊QQ服務(wù)器-客戶端模型圖1-2MSN服務(wù)器-客戶端模型在騰訊所采用的模式中,服務(wù)器主要處理不同客戶端狀態(tài)的控制,這可以極大地減輕服務(wù)器的處理負(fù)擔(dān),但是其內(nèi)部協(xié)議和實現(xiàn)非常復(fù)雜。在微軟的操作系統(tǒng)中,用戶可以自定義各種操作,可以使用自定義的方法,將需要傳送的數(shù)據(jù)進(jìn)行分類,并且降低網(wǎng)絡(luò)通信的成本是非常重要的。另一方面,MSNMessenger的所有數(shù)據(jù)都要通過服務(wù)器,造成很大的壓力。(這也是很少看到MSN的語音視頻聊天的原因)。所有上述軟件都可以通過廣域網(wǎng)進(jìn)行即時通信,具有不同的使用特點和實現(xiàn)優(yōu)勢。例如:目前市場上比較常見的局域網(wǎng)聊天工具,它可以讓普通用戶在互聯(lián)網(wǎng)上的即時通信軟件主要是針對企業(yè)內(nèi)部的員工可以在家中或者在公司內(nèi)部進(jìn)行聊天。但隨著企業(yè)規(guī)模的擴大,業(yè)務(wù)量的增長,企業(yè)內(nèi)部信息越來越密切,企業(yè)只希望員工通過企業(yè)的內(nèi)部局域網(wǎng)進(jìn)行交流和溝通,為了避免Internet通過互聯(lián)網(wǎng)將企業(yè)內(nèi)部機密給外界,因此局域網(wǎng)聊天也占據(jù)了較大的市場[2]。1.4可行性分析本設(shè)計采用VisualC++6.0作為設(shè)計平臺的框架,采用了vc++、MFC等語言,使系統(tǒng)軟件的系統(tǒng)軟件開發(fā)平臺更加成熟和可行。該設(shè)計主要解決客戶端和服務(wù)器之間的消息傳輸和圖片傳輸問題,程序分為服務(wù)器端和客戶機端兩部分,服務(wù)器端提供網(wǎng)絡(luò)端口,等待客戶機的連接請求,登錄服務(wù)器進(jìn)行消息傳輸和圖片發(fā)送;并且在成員列表中顯示所有在線人員的身份識別信息??蛻舳送ㄟ^服務(wù)器發(fā)送連接請求的IP地址和端口號,然后登錄到一個聊天室,服務(wù)器端的成員列表顯示所有在線的人員。如果有人脫機,該列表將自動刪除。整個程序的主題使用CSocket類和TCP/UDP協(xié)議來消息傳輸和圖片發(fā)送。本程序的主要功能是對客戶端的請求進(jìn)行處理,并且將處理后的消息發(fā)送到客戶機,客戶端根據(jù)接收到的消息進(jìn)行相應(yīng)操作。分析表明,該設(shè)計可以在VisualC++中完全實現(xiàn)。

第二章、系統(tǒng)開發(fā)環(huán)境與關(guān)鍵技術(shù)2.1VisualC++可視化集成開發(fā)環(huán)境簡介VisualC++是一個強大的可視化軟件開發(fā)工具。Microsoft公司微軟公司在1993推出VisualC++1.0以來,它已成為專業(yè)程序員人員的首選軟件開發(fā)工具。本文將以一個實例來闡述如何應(yīng)用該工具進(jìn)行軟件開發(fā)過程中的各項技術(shù)和方法。VisualC++6.0不僅是一個C++編譯器,也是一個基于Windows的可視化集成integrateddevelopmentenvironment環(huán)境。VisualC++6.0由很多小組件組成,其中包括編輯器、調(diào)試器和開發(fā)工具,如AppWizard、程序向?qū)б约邦怌lassWizard。編輯器提供了一個可以在任意的地方使用的編程語言編程語言的使用者只需要在開發(fā)環(huán)境中使用簡單的編程語言編寫代碼,而不是開發(fā)環(huán)境的重要組成部分。通過一組名為“DeveloperStudio”的組件,這些組件將組成一個和諧的開發(fā)環(huán)境。VisualC++提供了一個MFC類的庫,用戶可以很容易地開發(fā)他們想要實現(xiàn)的功能。在圖形界面設(shè)計中,人們對圖形的處理和編輯都需要大量的時間和精力,所以,使用它來進(jìn)行圖形界面的設(shè)計是非常有效的。VisualC++完成它的目標(biāo)所需的時間(特別是對于具有圖形界面的程序)比TurboC這樣的工具要少得多。2.2MFC編程MFC是微軟的基礎(chǔ)類,它本質(zhì)上是一個按照C++類層次結(jié)構(gòu)組織的類庫,因此是一個面向?qū)ο蟮目蚣堋_@種方法不僅使用了面向?qū)ο蟮乃枷牒头椒?,而且在類庫的建立、管理及維護(hù)上有很大的方便。程序員可以使用該庫高效地開發(fā)基于Windows的應(yīng)用程序。MFC封裝應(yīng)用程序中的應(yīng)用程序類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用。這樣的程序設(shè)計方式使得程序員能夠根據(jù)自己的需要,靈活地選擇類的封裝方法。因此,程序員可以把它看作是一組可以按照不同的開發(fā)需要實現(xiàn)的開發(fā)模板。MFC向軟件開發(fā)者提供一系列服務(wù),以協(xié)調(diào)應(yīng)用程序。這些服務(wù)可以使用戶不再需要編寫復(fù)雜的代碼,而只需要簡單的操作。通常,MFC會在后臺執(zhí)行一系列的復(fù)雜操作,為我們提供了一個更簡單的編程界面。本文介紹一個簡單的,基于標(biāo)準(zhǔn)的應(yīng)用程序框架,它支持用戶接口的標(biāo)準(zhǔn)化。MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實現(xiàn)方法,程序員通過該實現(xiàn)來填寫特定應(yīng)用程序的詳細(xì)信息。這樣做的好處是能夠在編寫程序時自動生成一個完整的、完全的應(yīng)用程序員通過將代碼添加到應(yīng)用程序中來完成特定應(yīng)用程序的編譯。VisualC++提供了這樣做的工具:可以使用AppWizard生成初始的初始框架文件;使用“資源編輯器幫助可視化用戶接口;

ClassWizard用于幫助將代碼添加到框架文件;最終通過類庫實現(xiàn)應(yīng)用程序特定的邏輯[3]。與其他類庫相比,MFC具有以下優(yōu)點:1.對所有函數(shù)、控件、消息、GDI基本圖形函數(shù)、菜單和對話框提供完整的Windows支持。類的設(shè)計和API函數(shù)的組合是合理的。2.在消息處理時,如果沒有出現(xiàn)易出錯的switch/case語句,那么所有消息都將映射到類的成員函數(shù)。這種直接的消息到方法映射適用于所有消息。3.支持異常錯誤的處理,減少了出錯的機會,支持續(xù)改進(jìn),使得系統(tǒng)一描述了應(yīng)用程序的所有功能。它通過宏將消息映射到成員函數(shù),它們也不一定是虛擬成員函數(shù),因此不需要為消息映射函數(shù)創(chuàng)建一個虛擬函數(shù)表(V表)以節(jié)省內(nèi)存等。4.通過向文件發(fā)送對象信息以及識別成員變量的能力,提供更好的判定支持。5.可以使用各種不同的數(shù)據(jù)結(jié)構(gòu),如關(guān)系、數(shù)據(jù)庫、表格、文檔、圖形、表格、屬性和圖像,來生成一個高級的、復(fù)雜的框架文件。6.支持異常錯誤處理,降低程序出錯的幾率。這樣就使得程序開發(fā)人員有了很多的選擇對象的類型,并把對象的屬性存儲在這個類中。7.確定運行時數(shù)據(jù)對象的類型。允許在實例化時動態(tài)地操作域。8.代碼少并且速度快。MFC庫添加的目標(biāo)代碼不到40k,比傳統(tǒng)的CWindows程序效率只有5%。9.強大的應(yīng)用程序可以通過與MFC緊密集成的AppWizard和ClassWizard工具快速開發(fā)。10.此外,使用MFC時允許混合使用各種傳統(tǒng)函數(shù)。2.3Socket套接字套接字是通信的基石,是支持TCP協(xié)議的基礎(chǔ)網(wǎng)絡(luò)通信業(yè)務(wù)單元。

它可以把不同的網(wǎng)絡(luò)設(shè)備連接起來,實現(xiàn)數(shù)據(jù)傳輸。它可以被看作是不同主機之間雙向通信的端點,在單個主機內(nèi)和整個網(wǎng)絡(luò)中形成編程界面。進(jìn)程的運行狀況和運行時間,進(jìn)程間的相互影響應(yīng)于進(jìn)程之間的相互連網(wǎng)絡(luò)中的進(jìn)程都要使用套接字來進(jìn)行相互間的通信。套接字是通信域中的一種抽象概念,通常用同一域中的套接字來交換數(shù)據(jù)。進(jìn)程使用相同的域使用Internet協(xié)議簇彼此通信。在互聯(lián)網(wǎng)上的通信需要至少一對套接字在客戶機端上運行,稱為ClientSocket,另一對套接字在服務(wù)器端上運行,稱為ServerSocket;

一是啟動服務(wù)器端套接字,第二是啟動客戶端套接字,第三是啟動服務(wù)器端和客戶端套接字。根據(jù)套接字如何啟動以及本地套接字試圖連接什么,套接字連接過程可以分為三個步驟:1)服務(wù)器監(jiān)聽,是一種服務(wù)器端的套接字,它不定位特定的客戶端套接字,但一直處于等待連接、實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。2)客戶端請求,客戶端套接字提出的連接到服務(wù)器端套接字的請求。如果用戶的客戶端的套接字不是服務(wù)器的套接字,那么用戶就不能直接與服務(wù)器端進(jìn)行通信。要做到這一點,客戶端套接字必須首先描述要連接到的服務(wù)器端套接字,指示服務(wù)器端套接字的地址及端口號,然后請求連接到服務(wù)器端套接字。3)連接確認(rèn),指服務(wù)器端套接字偵聽或接收來自客戶端套接字的連接請求。響應(yīng)客戶端套接字請求,創(chuàng)建一個新線程,向客戶端發(fā)送服務(wù)器端套接字說明。一旦客戶端確認(rèn)說明,則建立連接。如果客戶端沒有確認(rèn)服務(wù)器端套接字的描述,那么客戶端就不會進(jìn)行連接。繼續(xù)監(jiān)聽狀態(tài)服務(wù)器端套接字,并繼續(xù)接收來自其他客戶端套接字的連接要求。4)斷開連接,是指客戶端向服務(wù)器提出斷開請求,此時服務(wù)器斷開與客戶端相關(guān)的所有套接字,服務(wù)器繼續(xù)監(jiān)聽狀態(tài)下一個連接請求。在服務(wù)器端的數(shù)據(jù)庫中,數(shù)據(jù)庫服務(wù)器和數(shù)據(jù)庫管理員的地位是非常重要的。圖2-1是基于TCP的網(wǎng)絡(luò)通信模式圖2-1基于TCP的網(wǎng)絡(luò)通信模式2.4多線程編程線程是操作系統(tǒng)中一個非常重要的概念,進(jìn)程不同于線程,進(jìn)程是線程的容器,線程創(chuàng)建于某個進(jìn)程環(huán)境,它僅生存于該進(jìn)程中,這就意味著線程只是在它所屬的進(jìn)程地址空間中執(zhí)行代碼,并在進(jìn)程的地址空間中對數(shù)據(jù)進(jìn)行操作。創(chuàng)建一個進(jìn)程時,它的第一個線程稱為主線程,并由系統(tǒng)自動生成。由這個主線程生成額外的線程,而這些線程又可以生成更多的線程。MFC類庫提供了多線程編程支持,使用戶編程更加方便。重要的是,在多窗口線程情況下,MFC直接提供了用戶接口線程的設(shè)計。MFC區(qū)分兩種類型的線程:輔助線程和用戶界面線程。輔助線程沒有消息機制,通常用來執(zhí)行后臺計算和維護(hù)任務(wù)。MFC為用戶界面線程提供消息機制,作用是處理用戶的輸入,響應(yīng)用戶產(chǎn)生的事件以及消息。但對于Win32的API來說,這兩種線程本質(zhì)上并沒有區(qū)別,它只需要線程的啟動地址用來啟動線程執(zhí)行任務(wù)。Win32函數(shù)庫中會提供多線程控制的操作函數(shù),其中包括創(chuàng)建線程、中止線程、建立互斥區(qū)等。創(chuàng)建輔助線程相對來說比較簡單,只需實現(xiàn)控制函數(shù)和啟動線程,不必從CWinThread派生一個類。創(chuàng)建用戶界面線程有兩種方法:1)從CWinThread類派生一個類。需要注意的是,必須要用宏DECLARE_DYNCREA和IMPLEMENT_DYNCREATE對該類進(jìn)行聲明和實現(xiàn),然后調(diào)用AfxBeginThread創(chuàng)建CWinThread派生類的對象進(jìn)行初始化啟動線程運行。2)通過構(gòu)造函數(shù)創(chuàng)建類CWinTread的一個對象,由程序員調(diào)用函數(shù)::CreateThread啟動線程。2.5C/S模式C/S模式即Client/Server(客戶端/服務(wù)器)結(jié)構(gòu),是指同時為多個客戶端服務(wù)的服務(wù)器。C/S模式的基礎(chǔ)是并發(fā)性,由于該基礎(chǔ)的支持,可以多個客戶端訪問同一服務(wù)而不必等待服務(wù)器先完成前面的請求。在C/S模式中當(dāng)一個請求到達(dá)服務(wù)器時,服務(wù)器會交給一個可以與現(xiàn)有線程同時執(zhí)行的控制線程。在設(shè)計并發(fā)服務(wù)器時,常見的服務(wù)器代碼分為兩部分:一:負(fù)責(zé)偵聽,接收客戶端請求,二:為客戶端建立新的服務(wù)線程;代碼的另一部分則處理單個客戶端請求,例如,與客戶端交換數(shù)據(jù)以提供特定的服務(wù)。圖2-2顯示了如何為服務(wù)器創(chuàng)建多條線程以服務(wù)多個客戶端。圖2-2服務(wù)器創(chuàng)建多個線程為多個客戶端服務(wù)這種C/S結(jié)構(gòu)的優(yōu)點是,可以充分利用客戶端的處理能力,并且大部分工作都可以由客戶端處理并提交給服務(wù)器。相應(yīng)的優(yōu)勢是客戶端響應(yīng)速度快。

主要體現(xiàn)在以下兩點:(1)應(yīng)用服務(wù)器數(shù)據(jù)負(fù)載小。應(yīng)用服務(wù)器的這一特性使數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù)庫應(yīng)用可以由多個獨立的服務(wù)器承載,從而大大降低了應(yīng)用服務(wù)器的負(fù)荷。最簡單的數(shù)據(jù)庫應(yīng)用的C/S體系結(jié)構(gòu)包括兩個部分,客戶應(yīng)用程序和數(shù)據(jù)庫服務(wù)器程序。這兩個程序可以分別稱為前臺程序程序和后臺程序。運行數(shù)據(jù)庫服務(wù)器程序的機器,也稱為應(yīng)用服務(wù)器。一旦服務(wù)器程序啟動,它就準(zhǔn)備好響應(yīng)客戶程序的請求。應(yīng)用服務(wù)器和客戶程序的關(guān)系是通過客戶程序和客觀上具有一定的網(wǎng)絡(luò)合電路和數(shù)字濾波器可以將客戶應(yīng)用程序和服務(wù)器端連接起來??蛻魬?yīng)用程序在應(yīng)用服務(wù)器上運行,這與服務(wù)器端的較重數(shù)據(jù)負(fù)荷相對應(yīng)。客戶應(yīng)用程序運行在用戶自己的計算機上,該計算機對應(yīng)于數(shù)據(jù)庫服務(wù)器,也稱為客戶電腦。

這樣,客戶程序與應(yīng)用服務(wù)器的數(shù)據(jù)交換通過客戶端的查詢和數(shù)據(jù)庫中間件的設(shè)計使得客戶程序和應(yīng)用程序之間的數(shù)據(jù)交互成為可能。當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)需要執(zhí)行任何操作時,客戶程序會自動找到并請求服務(wù)器程序,該程序?qū)︻A(yù)定義的規(guī)則做出響應(yīng)并返回結(jié)果,而應(yīng)用服務(wù)器運行的數(shù)據(jù)負(fù)載較小[4]。(2)數(shù)據(jù)儲存管理功能更加透明。在數(shù)據(jù)庫應(yīng)用中,數(shù)據(jù)存儲和儲存管理功能分別由服務(wù)器程序和客戶應(yīng)用程序執(zhí)行,不同的(已知或未知的)前臺應(yīng)用不能破壞的規(guī)則通常集中在服務(wù)器程序中執(zhí)行,如訪問者權(quán)限、可重復(fù)編號和客戶下定單要求。在數(shù)據(jù)庫應(yīng)用中,數(shù)據(jù)的儲存管理功能,是通過數(shù)據(jù)庫服務(wù)器與客戶程序相結(jié)合實現(xiàn)的。所有這些對于前臺程序的最終用戶來說都是“透明的”,他們可以做所有的工作,而不需要詢問(并且經(jīng)常干擾)背后的過程。在客戶服務(wù)器架構(gòu)的應(yīng)用中,前臺的程序不是很“瘦小”,問題就留給服務(wù)器和網(wǎng)絡(luò)去解決。在C/S體系下,數(shù)據(jù)庫不可能真正是一個公共的、專業(yè)化倉庫,它是獨立的、專業(yè)的管理。兩個通信應(yīng)用程序之間的主要交互模式是客戶機/服務(wù)器模式,即客戶端向服務(wù)器發(fā)送服務(wù)請求,而服務(wù)器接收請求并提供相應(yīng)服務(wù)??蛻魴C/服務(wù)器模式是當(dāng)前計算機通信的主要模式,它可以實現(xiàn)計算機與外部設(shè)備之間的數(shù)據(jù)交換,并且可以通過網(wǎng)絡(luò)實現(xiàn)計算機之間的資源共享??蛻舳?服務(wù)器模式基于兩點:第一。建立該網(wǎng)絡(luò)的原因是硬件和軟硬件資源、運算能力和信息在網(wǎng)絡(luò)中的不平等,以及共享這些資源的需要,這導(dǎo)致資源多的主機和資源少的客戶要求服務(wù)的非對等作用。其次,網(wǎng)絡(luò)之間的網(wǎng)間進(jìn)程通信是完全異步,相互通信的進(jìn)程之間既沒有父子關(guān)系,也沒有內(nèi)存緩沖區(qū)共享,因此需要建立機制,在希望進(jìn)行通信的進(jìn)程之間建立聯(lián)系,并同步它們之間的數(shù)據(jù)交換[9]??蛻魴C/服務(wù)器模式運行過程中采取主動請求的方式:首先,服務(wù)器根據(jù)請求啟動并提供相應(yīng)的服務(wù):1)開通通信通道,并通知本地主機愿意接收客戶在公認(rèn)地址的請求;2)等待客戶的要求到達(dá)港口;3)接收服務(wù)請求、處理請求并發(fā)送應(yīng)答信號。服務(wù)請求的發(fā)送方在一定條件下可以使用該應(yīng)答信號發(fā)送服務(wù),但是該應(yīng)答信號不能夠傳遞給客戶,如果該應(yīng)答信號的傳遞方式不當(dāng),服務(wù)可能會出現(xiàn)失敗。服務(wù)結(jié)束后,關(guān)閉與用戶的通信鏈路并終止;4)返回步驟二,等待客戶要求;5)關(guān)閉服務(wù)器??蛻舴剑?)打開通信通道并連接到主機服務(wù)器的特定端口,在該特定端口上,連接到服務(wù)器所在的網(wǎng)絡(luò)環(huán)境,將服務(wù)器端口的地址映射到網(wǎng)絡(luò)環(huán)境中的一個網(wǎng)段。2)將服務(wù)請求發(fā)送到服務(wù)器,等待并接收響應(yīng);3)關(guān)閉通信通道,請求結(jié)束后終止。因此:1)客戶和服務(wù)器的操作不對稱,因此編碼不同;2)服務(wù)進(jìn)程通常在客戶請求之前就開始了。在某些情況下,服務(wù)進(jìn)程是由一個用戶的需求所激發(fā),并且在某些情況下,服務(wù)進(jìn)程是由另一個用戶的需求所激發(fā)。

只要系統(tǒng)還在運行,服務(wù)進(jìn)程就會一直存在,直至正常終止或強制終止。2.6TCP/UDP協(xié)議TCP協(xié)議是一種傳輸層協(xié)議,在IP環(huán)境中,TCP提供可靠的數(shù)據(jù)傳輸,包括數(shù)據(jù)流傳送、可靠性、有效流控、全雙工操作以及多路復(fù)用。UDP不提供IP可靠性、流控或差錯恢復(fù)功能。一般來說,TCP適用于高可靠性要求的應(yīng)用,而UDP適用于低可靠性要求、傳輸經(jīng)濟性差的應(yīng)用。TCP支持的協(xié)議主要有Telnet協(xié)議、FTP協(xié)議和SMTP協(xié)議。一些應(yīng)用程序提供的協(xié)議也不那么可靠性。

UDP支持諸如NFS(網(wǎng)絡(luò)文件系統(tǒng))和TFTP(公用文件傳輸協(xié)議)等協(xié)議.面向連接TCP:“面向連接”指在正式通信之前必須與對方建立連接。例如,當(dāng)你打電話給某人時,你必須等電話線接通,對方拿起電話后你才能和對方交談。傳輸控制協(xié)議(TCP)是一種基于連接的協(xié)議,這意味著在你正式發(fā)送或接收數(shù)據(jù)之前,必須與另一方有可靠的連接。在連接的過程中,每個參與者都是通過一系列的對話來完成的,比如:主機與從機、主機與從機之間的連接、從機與主機之間的連接等。TCP連接需要經(jīng)過三個“對話”才能建立起來,這個過程是很復(fù)雜的,我們在這里只需要做一個簡單的、直觀的演示,你只需要理解這個過程。連接的三次對話,每次對話都得經(jīng)過一個“連接”過程,這樣的連接過程,我們稱之為“對話”。讓我們看看這三個對話的簡單過程:宿主A向宿主B發(fā)送一組連接請求:“我想向您發(fā)送數(shù)據(jù),好嗎?”

“面向連接”是一種基于網(wǎng)絡(luò)絡(luò),是在接收到數(shù)據(jù)包之后,主機。這是第一次談話;主機B向主機A發(fā)送數(shù)據(jù)包,同意連接和請求同步(同步是指兩個主機,一個發(fā)送,一個接收):“是的,你什么時候發(fā)送?”

這是第二次談話。主機A發(fā)送了另一個確認(rèn)主機B同步請求的數(shù)據(jù)包:“我現(xiàn)在就發(fā)送,你繼續(xù)!”

這是第三次談話。

三個“對話”的目的是同步數(shù)據(jù)包的發(fā)送和接收,在主機A正式向B主機發(fā)送數(shù)據(jù)之前需要三個“對話”。TCP協(xié)議為應(yīng)用程序提供了一個可靠的通信連接,允許從一臺計算機向網(wǎng)絡(luò)上的其他計算機發(fā)送無錯誤的字節(jié)流。具有高可靠性要求的數(shù)據(jù)通信系統(tǒng)通常使用TCP協(xié)議傳輸數(shù)據(jù)。面向非連接UDP協(xié)議:“面向非連接”是指直接向另一方發(fā)送通信,而不論另一方的狀態(tài)如何,無需在正式通信之前建立連接。這和手機短信很相似:當(dāng)你發(fā)短信時,你只需輸入對方的手機號就OK。UDP(UserDataProtocol)是一種與TCP相對應(yīng)TCP用戶數(shù)據(jù)報協(xié)議。這是一個不非連接的協(xié)議,它不相互連接,但直接向它們發(fā)送數(shù)據(jù)包!這樣,當(dāng)對方主機收到數(shù)據(jù)包時,可以很快的判斷出來是否有故障,從而提高系統(tǒng)還有一個好處:它是基于網(wǎng)絡(luò)流量控制的。UDP適用于每次只傳輸少量數(shù)據(jù)且不需要太多可靠性的應(yīng)用環(huán)境。如果我們在這種情況下就無法通信了解一些特定的網(wǎng)絡(luò)環(huán)境,例如網(wǎng)絡(luò)的連接狀態(tài)不穩(wěn)定、網(wǎng)絡(luò)的連接速率低或者網(wǎng)絡(luò)的傳輸速率低,都能夠利用這種協(xié)議。例如,我們經(jīng)常使用“ping”命令來測試兩個主機之間的TCP/IP通信是否正常。實際上,ping命令是通過向另一個主機發(fā)送ICMP數(shù)據(jù)包,然后由后者確認(rèn)收到包。如果數(shù)據(jù)包及時返回消息,網(wǎng)絡(luò)就打開了。例如,默認(rèn)情況下,一個“ping”運算發(fā)送四個數(shù)據(jù)包。發(fā)送的數(shù)據(jù)包數(shù)為4,接收的數(shù)據(jù)包數(shù)為4(因為另一個主機將發(fā)送一個確認(rèn)接收的數(shù)據(jù)包)。這充分說明UDP協(xié)議是非面向連接的協(xié)議,不需要建立連接。它的通信過程是:用戶發(fā)送數(shù)據(jù)包之前者是在非連接的環(huán)境下進(jìn)行通信,后者是在連接的環(huán)境下進(jìn)行通信。由于UDP協(xié)議不需要連接過程,因此通信效率較高。但這就是為什么它不像TCP協(xié)議那么可靠性。QQ使用UDP發(fā)送信息,所以有時你得不到它們。

第三章、企業(yè)聊天室系統(tǒng)的總體設(shè)計3.1系統(tǒng)簡要介紹聊天系統(tǒng)的功能主要是通過聊天工具來實現(xiàn)的,它是人們在交談時使用計算機技術(shù)而開發(fā)的,可以滿足人們的日常交際需要。

聊天系統(tǒng)的實現(xiàn)方法有很多,比如ICQ,屬于點對點聊天系統(tǒng)。

還有一個基于Socket的集中聊天系統(tǒng),需要訪問統(tǒng)一聊天服務(wù)器。在這種情況下,如果用戶不能夠很好地理解這些信息,就會造成聊天質(zhì)量的下降。在Socket的聊天系統(tǒng)中,有兩個主要角色:服務(wù)器和客戶端。不同的客戶端登錄到集中式服務(wù)器,并通過服務(wù)器將消息從一個客戶端推送到其他所有客戶端。基于Socket的聊天系統(tǒng),首先使用網(wǎng)頁刷新方式來實現(xiàn),隨著時間的推移,它會自動刷新從服務(wù)器端到客戶端顯示的頁面。這種緩慢的聊天很快被更新的聊天技術(shù)所取代。聊天系統(tǒng)主要是在客戶端和服務(wù)器之間進(jìn)行文字信息的傳輸,服務(wù)器端只需要將最新的文字信息推送到客戶端,減少了網(wǎng)絡(luò)傳輸內(nèi)容,節(jié)省網(wǎng)絡(luò)傳輸?shù)拇螖?shù),無疑提高了網(wǎng)絡(luò)聊天的速度。而且,在客戶端和服務(wù)器之間主要傳送的是聲音信息,這樣可以提高聲音信息的質(zhì)量。這種“推”技術(shù)是基于Socket聊天系統(tǒng)的一種主要實現(xiàn)技術(shù)。Internet上的聊天室程序通常對服務(wù)器提供服務(wù)端連接響應(yīng),用戶通過一個客戶端程序登錄到服務(wù)器,并與登錄到同一服務(wù)器的用戶對話,這是一個面向連接的通信過程。

服務(wù)器端的程序是一個獨立的程序,而客戶端程序的程序可以獨立運行。

因此,程序想要在TCP/IP環(huán)境下實現(xiàn)客戶端程序的程序和客戶端的程序。對網(wǎng)絡(luò)編程的VC++支持有套接字支持、WinInet支持、MAPI和ISAPI支持。其中,WindowsSocketsAPI是TCP/IP網(wǎng)絡(luò)環(huán)境和Internet上最常用的API。美國加州大學(xué)Berkeley分校最先為TCP/IP協(xié)議開發(fā)了UNIX下的API,稱為BerkeleySocket接口(套接字)。在當(dāng)時的計算機界面上,這個套接字還僅僅只是一個數(shù)據(jù)傳輸?shù)墓ぞ?,并不具有任何意義。即使如此,Socket方法也是在桌面上的桌面操作系統(tǒng)進(jìn)入Windows時代后繼承下來的。隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,人們對網(wǎng)絡(luò)的要求越來越高,網(wǎng)絡(luò)編程也從簡單的線性網(wǎng)絡(luò)發(fā)展到現(xiàn)在的多媒體網(wǎng)絡(luò)。在TCP/IP網(wǎng)絡(luò)通信環(huán)境下,Socket數(shù)據(jù)傳輸是一種特殊的I/O,它也是一種文件描述符,具有類似于開式文件函數(shù)調(diào)用socket的功能??梢岳斫獾氖?,Socket實際上是一個通信端點,通過它用戶的Socket程序可以通過網(wǎng)絡(luò)與其他Socket應(yīng)用程序通信。Socket存在于“通信域”(用于描述普通線程如何通過Socket進(jìn)行通信的抽象概念)中,并與另一個域中的Socket交換數(shù)據(jù)。Socket有三種類型。第一個是SOCK_STREAM(流式),它提供可靠的面向連接的通信服務(wù),如telnet,http://www.stREAM。這些協(xié)議的支持,使得網(wǎng)絡(luò)編程人員在實際工作中可以方便地利用它們來實現(xiàn)各種網(wǎng)絡(luò)編程應(yīng)用。第二個是SOCK_DGRAM(數(shù)據(jù)報),它提供不連接和不可靠的通信,如UDP。第三是SOCK_RAW,它主要用于協(xié)議開發(fā)和測試,并支持通信底層操作,如直接訪問IP和ICMP。對于基本的套接字調(diào)用、Windows套接字的開始和結(jié)束、異步終止選擇機制機制以及異步數(shù)據(jù)傳輸機制,WindowsSocket機制分析具有以下幾點。一些基本Socket系統(tǒng)調(diào)用主要系統(tǒng)調(diào)用包括:socket()——創(chuàng)建Socket;將創(chuàng)建的Socket綁定到本地端口;connect()和accept()——建立Socket連接;listen()——服務(wù)器監(jiān)聽連接請求;send()——受控緩沖數(shù)據(jù)的傳遞;recv()——可控緩沖接收;closesocket()——閉塞Socket。WindowsSocket的開始及結(jié)束啟動功能WSAStartup()建立與WindowsSocketsDLL的連接,終止函數(shù)WSAClearup()終止DLL,這兩個功能必須配對使用。異步選擇機制Windows是不采用UNIX阻塞機制的非搶先操作系統(tǒng)。當(dāng)通信事件發(fā)生時,操作系統(tǒng)根據(jù)設(shè)置選擇是否處理它,WSAAsyncSelect()函數(shù)用于選擇系統(tǒng)要處理的相應(yīng)事件。如果用戶需要處理的網(wǎng)絡(luò)事件與預(yù)先存儲的網(wǎng)絡(luò)事件不一致,則會被拒絕,這樣用戶可以直接從網(wǎng)絡(luò)上下載網(wǎng)絡(luò)事件。當(dāng)Socket”接收到一組網(wǎng)絡(luò)事件之一時,它向程序窗口發(fā)送一條消息,指定生成網(wǎng)絡(luò)事件的Socket”、所發(fā)生事件的類型和錯誤碼[5]。異步數(shù)據(jù)傳輸機在WSAAsyncSelect()設(shè)置Socket上須響應(yīng)通信事件后,每個此類事件都會向窗口生成一條WM_SOCKET消息。這些窗口可以通過一個窗口回調(diào)函數(shù)來控制和管理。應(yīng)將相應(yīng)的數(shù)據(jù)傳輸處理代碼添加到窗口的回調(diào)函數(shù)中。相關(guān)的流程圖分別如圖3-1:客戶端和服務(wù)器端圖3-1服務(wù)器與客戶端在經(jīng)濟方面,需要注意的是,這個項目的實施只是為了探索和設(shè)計自己的學(xué)習(xí),沒有考慮到經(jīng)濟成本和其他方面的經(jīng)濟因素[5]。3.2系統(tǒng)的主要功能及其分析1.支持多個客戶端之間的連接,實現(xiàn)服務(wù)器與多個客戶端之間的數(shù)據(jù)傳輸;2.接收來自客戶端的消息并將其顯示在列表框中;3.用戶連接后,會有一個提示,顯示連接的用戶名;4.在發(fā)送消息時顯示所有聊天記錄;5.客戶可以相互發(fā)送和接收照片;服務(wù)器端聊天程序必須做到以下三點:1)服務(wù)器聊天程序在端口等待聊天客戶的連接請求,并需要維護(hù)客戶連接表,以記錄所有成功的連接。2)服務(wù)器聊天程序可以及時接收來自不同聊天客戶的消息,然后將其轉(zhuǎn)發(fā)到一個或者多個用戶連接上。

對于私人聊天室(如果沒有公共聊天室,則服務(wù)器將接受來自源端的信息)),服務(wù)器將會對所有來自源端將接收到的信息轉(zhuǎn)發(fā)到目標(biāo)端。對公共聊天室而言,服務(wù)器將把接收到的信息發(fā)送給除源端外的所有客戶。3)服務(wù)器還將監(jiān)控這些連接的狀態(tài),如果用戶自愿離開或出現(xiàn)問題,服務(wù)器會從列表中移除相應(yīng)的表項并及時更新??蛻舳肆奶斐绦蛐枰獔?zhí)行以下功能:(1)客戶端聊天程序負(fù)責(zé)建立和維護(hù)與服務(wù)器的聯(lián)系,通過獲取用戶設(shè)置來嘗試與服務(wù)器連接,并隨時檢查連接狀態(tài)。(2)客戶端聊天程序及時將用戶輸入的內(nèi)容發(fā)送給聊天服務(wù)器。用戶輸入的信息有時候會因為時間、地點、環(huán)境條件等原因而不能及時間一長,用戶與服務(wù)器之間的信息交換就變得非常繁瑣。一般來說,當(dāng)用戶輸入一行信息并按下回車鍵,聊天程序會及時將該一行信息發(fā)送出去,以滿足用戶的交互需求。(3)隨時準(zhǔn)備接收來自服務(wù)器的信息,并顯示您接收到的信息,以便用戶及時查看。(4)當(dāng)用戶退出聊天程序時,服務(wù)器斷開。這種做法不僅能夠解決用戶的隱私保護(hù)問題,而且還可是這樣做的話,會影響客戶端的正常使用,甚至?xí)鹣到y(tǒng)崩潰。最好是提前通知服務(wù)器,或者直接向服務(wù)器發(fā)送退出通知,以便服務(wù)器能夠及時跟蹤客戶端的連接狀態(tài),并將客戶端的退出信息發(fā)送給相應(yīng)的實體。3.3系統(tǒng)實現(xiàn)原理及設(shè)計思路企業(yè)內(nèi)部聊天室系統(tǒng)的服務(wù)器端和客戶端采用Socket技術(shù)收發(fā)消息,并遵循C/S模式。

該程序主要實現(xiàn)兩個功能:消息傳輸和文件傳輸。

在設(shè)計中,采用了多線程技術(shù)來加快程序的運行速度,并使用了多線程技術(shù)來解決消息傳輸和文件傳輸?shù)臎_突問題。

其中,消息傳輸采用UDP協(xié)議,文件傳輸采用TCP協(xié)議。聊天室是一款基于對話框的應(yīng)用程序。在對話框中,用戶可以選擇自己想要的內(nèi)容,并可以選擇不同的操作模式,如圖1所示。該程序包含兩個MFC套接字類,分別實現(xiàn)UDP通信和TCP傳輸。當(dāng)套接字類接收數(shù)據(jù)時,通過向主窗口發(fā)送消息來處理數(shù)據(jù),通知主窗口呼叫套接字類的成員函數(shù)。當(dāng)程序開始運行時,它首先分別創(chuàng)建一個數(shù)據(jù)報套接字和流式套接字,然后讓流式套接字監(jiān)聽端口以等待客戶端連接請求。數(shù)據(jù)報套接字的發(fā)送端可以在局域網(wǎng)中發(fā)送消息,如果發(fā)送消息的次數(shù)超過一定次數(shù)后,數(shù)據(jù)報套接字在客戶端的廣播消息列表控件中顯示。本地用戶信息然后通過數(shù)據(jù)包套接字廣播到局域網(wǎng)。當(dāng)局域網(wǎng)內(nèi)的其他用戶接收到廣播消息時,更新列表控件中的用戶信息并將自己的信息作為UDP發(fā)送回去。消息相對簡單。當(dāng)用戶發(fā)送消息時,程序會調(diào)用套接字類的SentTo函數(shù),以UDP的形式將消息直接發(fā)送到消息的接收者,UDP在接收到消息后出現(xiàn)在窗口的聊天消息欄中。當(dāng)文件被發(fā)送時,發(fā)送者首先通過UDP將文件信息發(fā)送給文件接收方,當(dāng)接收者確認(rèn)收到文件時通知發(fā)送方,然后文件發(fā)送方創(chuàng)建一個流式套接字連接到接收者并將文件信息發(fā)送給文件接收方,接收者然后創(chuàng)建一個線程準(zhǔn)備傳輸文件數(shù)據(jù)。當(dāng)文件接收方接受連接請求時,它首先從文件發(fā)送方接收文件信息,然后創(chuàng)建線程并準(zhǔn)備接受文件數(shù)據(jù)。文件的傳輸是在客戶端與服務(wù)端之間進(jìn)行的,而且文件傳輸過程中還需要進(jìn)而,該線程被配置為在傳輸文件數(shù)據(jù)包含有文件的文件名和文件數(shù)據(jù)。當(dāng)文件接收線程開始運行時,將彈出一個要保存的文件的通用對話框,用戶可以在其中指定要保存文件的文件名,然后希望文件發(fā)送方發(fā)送通知消息確認(rèn)文件接收,然后雙方開始傳送文件數(shù)據(jù)。在整個文件傳輸過程中,文件的發(fā)送者充當(dāng)客戶端,文件的接收者充當(dāng)服務(wù)端。在套接字的創(chuàng)建和通信過程中,會使用以下一些函數(shù)來處理相關(guān)的事件:(1)AfxSocketInit:該函數(shù)在初始化應(yīng)用程序函數(shù)中調(diào)用,以確Winsock版本并進(jìn)行一些套接字初始化。(2)Create():創(chuàng)建一個套接字,該套接字必須附有端口號。(3)Listen:偵聽專用,用于向監(jiān)聽套接字發(fā)送命令進(jìn)行端口監(jiān)聽。(4)Connect():客戶端套接字專用于將連接請求發(fā)送到服務(wù)器。(5)Accept():專用于接收客戶端通過網(wǎng)絡(luò)發(fā)出的建立連接的連接請求接聽套接字。(6)Send:用于將數(shù)據(jù)發(fā)送到套接字。(7)Receive():對于套接字接收數(shù)據(jù)。(8)Close():關(guān)閉析構(gòu)函數(shù)可以調(diào)用的套接字。在整個通信過程,當(dāng)一個事件被觸發(fā)時,應(yīng)用框架會接收某些自動調(diào)用響應(yīng)函數(shù)消息。本文就是基于此目的而設(shè)計的一般的代碼設(shè)計與實現(xiàn)是由代碼的設(shè)計者和使用者來實現(xiàn)的。你可以將自己的代碼編寫到這些函數(shù)中,以便更好地完成通信過程。具體函數(shù)見下文:(1)OnAccept():當(dāng)端口接收到連接請求時,應(yīng)用程序框架會自動調(diào)用監(jiān)聽套接字,以通知它該請求可以接受或連接被拒絕。

可用于監(jiān)控和控制網(wǎng)絡(luò)通信中的各種網(wǎng)絡(luò)設(shè)備的設(shè)計人員,網(wǎng)絡(luò)管理員可以使用一個或多個函數(shù)來連接連接請求。

可以在此函數(shù)中調(diào)用Accept()來連接請求并建立連接。(2)OnConnect:當(dāng)客戶機套接字連接請求完成時,應(yīng)用程序框架會調(diào)用該函數(shù)來判斷它是否成功。(3)OnSend():框架調(diào)用此函數(shù)是為了通知套接字,Send函數(shù)現(xiàn)在可以被調(diào)用來傳輸數(shù)據(jù)。(4)OnReceive:框架調(diào)用這個函數(shù)是為了告訴套接字,現(xiàn)在可以調(diào)用Receive函數(shù)來從數(shù)據(jù)緩沖區(qū)中檢索數(shù)據(jù)。(5)OnCloes:該框架調(diào)用此函數(shù)以通知調(diào)用方連接到的套接字已斷開[6]。圖3-2是系統(tǒng)實現(xiàn)原理框圖的框圖。圖3-2原理框圖3.4系統(tǒng)流程圖根據(jù)用戶的要求和功能設(shè)置,可以獲得以下3-3的流程圖:用戶啟動客戶端,登陸服務(wù)器發(fā)送信息,啟動服務(wù)器,等待客戶端對在線用戶信息的請求和反饋,用戶發(fā)送信息到服務(wù)器,服務(wù)器處理用戶數(shù)據(jù),用戶開始聊天;客戶端的聊天是基于用戶的屬性和屬性的信息來實現(xiàn)的??蛻舳肆奶旆譃樗邢⒑退接邢ⅲ接邢?yīng)該由程序控制單獨處理。圖3-3設(shè)計流程圖第四章、企業(yè)聊天室系統(tǒng)的詳細(xì)設(shè)計4.1企業(yè)聊天室服務(wù)器端的設(shè)計實現(xiàn)步驟1:進(jìn)入VisualC++集成開發(fā)環(huán)境,選擇“文件”、“新菜單”,打開““工程””選項卡,點擊“MFCAppWizard(exe),指定項目為“電182企業(yè)聊天室服務(wù)器。選擇好后,點擊“選擇”按鈕,選擇“新建”菜單,單擊“創(chuàng)建”菜單,選擇“確定”按鈕。點擊“確定”進(jìn)入下一個界面。步驟2:選擇“基本對話框”選項,如圖4—1所示。步驟3:MFC設(shè)置,見圖4-2。步驟4:下一步是連續(xù)單擊“下一步”按鈕并單擊最后一幀中的“完成”按鈕,此時將創(chuàng)建應(yīng)用程序框架。圖4-1指定要創(chuàng)建的應(yīng)用程序的類型為基本對話框圖4-2MFC的設(shè)置步驟5:在Dialog中打開IDD_SERVER_DIALOG界面,刪除原始控件,添加10個控件,控件屬性如表4—1所示,控制順序設(shè)置如圖4—3所示。圖4-3服務(wù)器端編輯對話框資源表4-1服務(wù)器端對話框控件ID及屬性控件名稱控件類型控件ID端口:靜態(tài)控件IDC_STATIC服務(wù)器名:靜態(tài)控件IDC_STATIC啟動按鈕IDC_BT_START退出按鈕IDC_BT_EXIT信息內(nèi)容編輯框IDC_EDIT_MESTOSEND聊天信息編輯框IDC_EDIT_MESSHOW聯(lián)系人列表列表控件IDC_LIST_SERVER發(fā)送按鈕IDC_BT_SENDMES(空)編輯框IDC_EDIT_PORT(空)編輯框IDC_EDIT_SERVERNAME服務(wù)器實現(xiàn)過程過程如下:通過ListenThread函數(shù)建立監(jiān)聽線程,服務(wù)器打開監(jiān)聽線程,監(jiān)聽線程部分實現(xiàn)了套接字的創(chuàng)建、套接字命名、監(jiān)聽套接字,然后打開監(jiān)聽線程。m_serversock=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建ret=bind(m_serversock,(LPSOCKADDR)&addr,sizeof(addr));//綁定 ret=listen(m_serversock,10);//偵聽 AfxBeginThread(ListenThread,this); //打開一條偵聽線程,在ListenThread線程中,接收客戶端請求并打開另一個監(jiān)聽線程,以便在阻塞被移除時偵聽其他客戶機的連接請求。Clientsock[k].clientsock=accept(pDlg->m_serversock,(sockaddr*)&clientaddr,&clientlen);//接收客戶端的請求AfxBeginThread(ListenThread,p);//打開另外一個監(jiān)聽線程來偵聽其他用戶的連接然后,接收信息標(biāo)識符,并根據(jù)不同消息標(biāo)識符判斷相應(yīng)的處理函數(shù)。在一些實際系統(tǒng)中,由于采用不同的信息標(biāo)識符,使得信息處理系統(tǒng)的運行效率大大降低。charrecvflag[3];memset(recvflag,0,3);intflagc=recv(clientsock[k].clientsock,recvflag,2,0);recvflag[2]='\0';CStringstrflag;strflag.Format("%s",recvflag);自己定義的消息標(biāo)識符包括“QQ”表退出,“MM”表聊天信息,“FF”表檔案,“CC”表連接PDlg->RecvMessage(clientsock[k].clientsock);//接收聊天消息4.2企業(yè)聊天室服務(wù)器端的工作流程

啟動服務(wù)器應(yīng)用程序之后,服務(wù)器運行如下:(1)設(shè)置服務(wù)器端口號,點擊“開始”按鈕,程序?qū)?chuàng)建一個監(jiān)聽套接字,在指定端口偵聽客戶機的連接請求。(2)當(dāng)客戶端請求連接時,會觸發(fā)監(jiān)聽套接字的OnAccount事件,以便在事件處理函數(shù)中能夠動態(tài)地創(chuàng)建連接套接字,與客戶端進(jìn)行通信。服務(wù)器支持多個客戶端,因此將套接字添加到連接套接字隊列??蛻舳嗽诜?wù)器中進(jìn)行通信,并且在事件處理函數(shù)中動態(tài)創(chuàng)建連接收到呼叫請求后,服務(wù)器向各個客戶端發(fā)送呼叫信息。服務(wù)器向每個客戶端發(fā)送歡迎信息。(3)客戶端發(fā)送聊天信息時,會在服務(wù)器端觸發(fā)與連接套接字對應(yīng)的OnReceiving事件,事件處理函數(shù)中讀取聊天信息,并將聊天消息隊列與服務(wù)器端表框連接;服務(wù)器端通過對聊天信息的處理后,實現(xiàn)了對聊天信息的分析、判斷和處理。然后將聊天信息發(fā)送給每個客戶端,以同步聊天信息。(4)在客戶端斷開之前,向服務(wù)器發(fā)送傳出消息,服務(wù)器釋放連接套接字隊列中的對應(yīng)套接字,并向每個客戶機發(fā)送傳出消息。(5)服務(wù)器停止服務(wù)時,首先向每個客戶端發(fā)送服務(wù)器停止服務(wù)的信息,然后釋放連接套接字配對列中的所有套接字。4.3企業(yè)聊天室客戶端的設(shè)計實現(xiàn)步驟1:進(jìn)入VisualC++集成開發(fā)環(huán)境,選擇“文件”“新建”菜單,打開“工程”選項卡,點擊MFCAppWizard(exe),指定項目為電182公司群客戶端。

選擇好后,點擊“確定”進(jìn)入下一個界面。步驟2:點擊“基本對話框”選項,如圖4-4所示。步驟3:MFC設(shè)置,如圖4-5所示。步驟4:下一步是連續(xù)單擊“下一步”按鈕,然后單擊最后一幀中的“完成”按鈕完成應(yīng)用程序框架。步驟5:在Dialog中打開IDD_CLIENT_DIALOG界面,刪除原始控件,添加13個控件,控件屬性如表4—2所示,并設(shè)置控件順序??蛻舳耸紫葎?chuàng)建一個套接字,然后主動連接到服務(wù)器,打開一個接收線程以接收來自服務(wù)器的信息,并且在RecvFrom服務(wù)器中,線程也會基于消息標(biāo)識符進(jìn)行不同的處理。圖4-4指定要創(chuàng)建的應(yīng)用程序的類型為基本對話框圖4-5MFC的設(shè)置圖4-6客戶端編輯對話框資源表4-2客戶端對話框控件ID及屬性控件名稱控件類型控件ID服務(wù)器ip:靜態(tài)控件IDC_STATIC上線按鈕IDC_BT_CONNECT下線按鈕IDC_BT_EXIT員工名:靜態(tài)控件IDC_STATIC端口:靜態(tài)控件IDC_STATIC聊天信息編輯框IDC_EDIT_MESSHOW信息內(nèi)容編輯框IDC_EDIT_MESTOSEND聯(lián)系人列表列表控件IDC_LIST_CLIENTS發(fā)送(回車)按鈕IDC_BT_SENDMES發(fā)送圖片按鈕IDC_BT_SENDFILE(空)編輯框IDC_IPADDRESS_IP(空)編輯框IDC_EDIT_CLIENTNAME(空)編輯框IDC_EDIT_PORT4.4企業(yè)聊天室客戶端的工作流程客戶端程序的工作程序比較簡單,具體流程如下:(1)用戶輸入服務(wù)器地址、端口、昵稱后,點擊“上線”按鈕,客戶端程序?qū)?chuàng)建一個套接字并連接到服務(wù)器。

如果沒有連接成功,則客戶端程序?qū)⒆詣又貑⒎?wù)器,并保持原狀。

如果連接成功,向服務(wù)器發(fā)送一條用戶進(jìn)入的消息。(2)當(dāng)用戶輸入聊天信息時,點擊“發(fā)送”按鈕將信息發(fā)送到服務(wù)器,或者當(dāng)用戶打開圖像時,點擊“發(fā)送圖片”按鈕將圖像發(fā)送給服務(wù)器。(3)當(dāng)服務(wù)器從其他客戶機接收消息或圖像時,將它們發(fā)送給此客戶端將在客戶機套接字中觸發(fā)OnReceive事件,并在事件處理函數(shù)中接收該消息,并將其顯示在列表框中。(4)當(dāng)用戶點擊“下線”按鈕時,將用戶離開的消息發(fā)送給服務(wù)器,然后斷開與服務(wù)器的連接。

第五章、企業(yè)聊天室系統(tǒng)的調(diào)試運行5.1服務(wù)器端的運行設(shè)置當(dāng)服務(wù)器端界面設(shè)計完成,并且所有服務(wù)器功能的監(jiān)聽線程、套接字和函數(shù)程序代碼都用vc++編寫時,我們編譯并運行該程序以得到初始服務(wù)器端接口,如圖5-1所示,然后將端口號和服務(wù)器名設(shè)置為5000,將服務(wù)器名設(shè)置為電182公司群,如圖5-2所示。圖5-1服務(wù)器端初始運行界面設(shè)置服務(wù)器端端口號和服務(wù)器名稱后,單擊“啟動”按鈕可以得到圖5-3,“啟動”按鈕不起作用,“發(fā)送(回車)”按鈕開始工作。圖5-2服務(wù)器端設(shè)置圖5-3服務(wù)器端啟動5.2客戶端的運行設(shè)置在完成客戶端界面設(shè)計和程序編寫后,我們在局域網(wǎng)內(nèi)運行了三個客戶端??蛻舳俗畛踹\行如圖5-4所示,然后設(shè)置工作人員姓名張三、李四、王五,將服務(wù)器ip設(shè)置為,端口號設(shè)置為5000,界面如圖5-5所示。圖5-4客戶端初始運行界面圖5-5客戶端設(shè)置3個客戶端點擊上線后,客戶端的發(fā)送(回車)、發(fā)送圖片及下線按鈕啟動而上線按鈕停止工作。服務(wù)器端界面和客戶端界面分別如圖5-6、5-7、5-8和5-9。圖5-6服務(wù)器端圖5-7客戶端張三界面圖5-8客戶端李四界面圖5-9客戶端王五界5.3服務(wù)器與客戶端之間的聊天結(jié)果在服務(wù)器與客戶端都設(shè)置完后即可進(jìn)行聊天了以下為服務(wù)器與王五之間的通信如圖5-10和5-11。圖5-10為服務(wù)器通信界面圖5-11為王五的通信界面5.4各個客戶端之間的通信除了服務(wù)器-客戶端通信外,該系統(tǒng)還有多個客戶端之間共同通信的功能,員工可以在其中討論生活和事業(yè)等各項問題,老板們也可以通過該系統(tǒng)向員工傳達(dá)命令??蛻舳碎g的通信如圖5-12、5-13和5-14。圖5-12張三界面圖5-13李四界面圖5-14各個客戶端之間的通信本企業(yè)聊天室系統(tǒng)還有傳送圖片的功能,可以使得員工之間或者上司和員工之間利用圖片形式發(fā)布任務(wù)。如下列圖5-15到圖5-19是發(fā)送和接收圖片的過程:圖5-15打開要發(fā)送的圖片圖5-16接收圖片圖5-17存儲圖片圖5-18圖片接收成功圖5-19接收到的圖片以上為企業(yè)內(nèi)部聊天室所實現(xiàn)的所有功能,包括客戶端與服務(wù)器之間的通信、多個客戶端之間的共同通信以及客戶端之間傳送圖像等。5.5企業(yè)聊天室運行小結(jié)和程序運行步驟本次設(shè)計的企業(yè)聊天室程序能正常編譯運行可以實現(xiàn)設(shè)計所要求的實現(xiàn)多人同時通信和相互傳遞文件圖片的功能。本程序的運行步驟如下:1)打開企業(yè)聊天室服務(wù)器程序,設(shè)置服務(wù)器名稱、IP地址和端口號,然后點擊“啟動”按鈕,此時列表框會顯示服務(wù)器啟動。2)開啟多個客戶端程序,分別設(shè)置員工名、服務(wù)器IP地址以及端口號,再點擊“上線”按鈕,此時服務(wù)器窗口和客戶端窗口都會顯示該客戶端上線的消息切服務(wù)器端和客戶端“在線好友”列表會顯示已在線人員名稱。此時即可以進(jìn)行聊天和發(fā)送圖片。3)在編輯窗口編輯想要發(fā)送的消息,然后點擊發(fā)送(回車)按鈕,消息就會被發(fā)送出去,同時同步的顯示在服務(wù)器窗口和所有客戶端窗口。完成多人聊天功能。4)點擊“發(fā)送圖片”按鈕,會出現(xiàn)一個對話框窗口,選擇要發(fā)送的圖片,即可發(fā)送圖片出去,此后,服務(wù)器會出現(xiàn)“文件接收”選項,保存并打開圖片,完成圖片發(fā)送功能。5)在客戶端點擊“下線”按鈕,即可使此客戶端與所有其他客戶端和服務(wù)器斷開連接。斷開所有客戶端與服務(wù)器的連接,再點擊服務(wù)器端“退出”按鈕。會結(jié)束整個程序。圖5-20為流程圖圖5-20企業(yè)聊天室運行步驟流程圖第六章、總結(jié)與展望應(yīng)用軟件開發(fā)之是很難做的,VC編程有一定的知識,但是很少涉及到網(wǎng)絡(luò),通過學(xué)習(xí)和咨詢知道套接字可以實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸。SOCKET最初被選擇作為網(wǎng)絡(luò)編程最基本的實現(xiàn)。而且這些數(shù)據(jù)分析和實現(xiàn)都是通過一個簡單的數(shù)據(jù)庫連接器來實現(xiàn)的,對底層數(shù)據(jù)進(jìn)行封裝,然后用它可以方便地實現(xiàn)大量的套接字。盡管MFC封裝了很多關(guān)于套接字的API函數(shù),但它的實現(xiàn)并不容易,需要進(jìn)行大量的數(shù)據(jù)分析與實現(xiàn)。當(dāng)?shù)谝淮问褂肧OCKET實現(xiàn)時,安裝連接是成功的,但整個服務(wù)器在等待監(jiān)聽后處于死鎖狀態(tài)。盡管客戶端成功訪問,但服務(wù)端仍然無法做任何事情,甚至可能變得沒有響應(yīng)。關(guān)于這一點有很多的混亂,在一個偶然的研究中出現(xiàn)了阻塞一詞,盡管之前已經(jīng)知道SOCKET正在堵塞編程。這種現(xiàn)象在之前的學(xué)習(xí)過程中一直沒有注意到,但是在最近的一次學(xué)習(xí)過程中終于在這篇文章中找到了答案,那就是多線程編程。后來,我終于明白了多線程編程的重要性,以前整個程序只有一個線程,線程就會一直監(jiān)聽狀態(tài),程序不能運行其他函數(shù)!發(fā)現(xiàn)問題后,開始學(xué)習(xí)多線程編程,準(zhǔn)備將一個線程處理監(jiān)聽事件,另一個線程處理其他事件。由于監(jiān)聽代碼是由多個線程共同開發(fā)的,在多線程的確,多線程編程是非常有效的,它可以使程序運行得更加流暢和穩(wěn)定。當(dāng)線程成功打開時,監(jiān)聽代碼將寫入聲明的線程函數(shù),監(jiān)聽將成功完成,但問題又來了。線程函數(shù)可以聲明為類的全局函數(shù)或靜態(tài)函數(shù),后者在開發(fā)中被選擇以保持代碼封裝性。如何將線程函數(shù)中接收到的消息返回到對話框?這次試驗證明這個問題的存在,并且消息的傳遞方式是動態(tài)的,因此,線程函數(shù)中的數(shù)據(jù)傳送就是在對話框中進(jìn)行的。最初嘗試定義一個全局變量,然后使用API函數(shù)SetDlgItem()處理它,但出現(xiàn)了一個編譯問題,注意到?jīng)]有定義聲明的全局變量。線程函數(shù)定義為全局函數(shù)(它也可以使類成為靜態(tài)函數(shù)),那么為什么線程中的數(shù)據(jù)不能被直接傳輸呢?最后,必須使用PostMessage方法返回消息,這一次成功地傳遞了消息。在后來的開發(fā)過程中,我們發(fā)現(xiàn)了這個問題,通過對線程函數(shù)中數(shù)據(jù)的處理,可以實現(xiàn)對話框的定義,而且可以實現(xiàn)消息傳遞是由一個類的靜態(tài)函數(shù)實現(xiàn)的。然后問題來了,當(dāng)成功地接收和發(fā)送消息時,它們最終被弄混了。亂碼的問題是數(shù)組可以跨界訪問,在設(shè)計過程中最好檢查數(shù)組的安全性。但這一次,亂碼似乎不尋常,并最終沒有很好的解釋,只有另尋他徑完成設(shè)計。應(yīng)當(dāng)指出,不鼓勵使用全局函數(shù)和變量是有理由的。全局函數(shù)和變量易于實現(xiàn),但它們對程序封裝和可移植性是一個巨大的挑戰(zhàn)。C++的優(yōu)點在于實現(xiàn)了多態(tài)和封裝,程序員會盡量提高整個程序的低耦合度,使開發(fā)出來的程序易于移植。在一個多文件程序中,全局變量可以在多個地方進(jìn)行修改,使得它們難以維護(hù),在檢查錯誤時也很難檢測到。如果一個文件中有多個變量,那么這些變量的定義就很復(fù)雜。此外,全局變量可能會有重復(fù)定義問題,導(dǎo)致編譯錯誤。在了解了CSocket類及其實現(xiàn)之后,我發(fā)現(xiàn)這是一種非阻塞的網(wǎng)絡(luò)編程,它非常簡單,不需要打開線程來處理監(jiān)聽事件。

但是由于在監(jiān)聽過程中,消息發(fā)送亂碼經(jīng)常出現(xiàn),所以需要重新設(shè)計監(jiān)聽流程。

由于CSocket確實有許多優(yōu)點,而且消息發(fā)送胡言亂語從來沒有被解決過,所以最終使用CSocket來解決這個問題。通過使用該類函數(shù)我們可以在一定程度上解決亂碼問題,但是也帶來了一些負(fù)面影響,比如我們不能直接讀取函數(shù)。在CSocket中,當(dāng)應(yīng)用程序框架收到有關(guān)特定特殊事件的消息時,會自動調(diào)用某些函數(shù),在該消息中,您可以編寫自己的代碼以完成特定的事件。CSocket是一個基于CassyncSocket的擴展類,它封裝了許多函數(shù),其中OnAccept、OnSend、OnReceive、OnClose和OnConnect函數(shù)是由應(yīng)用程序框架自動調(diào)用的。這些函數(shù)在連接、發(fā)送、接收和斷開連接時調(diào)用,因此很容易向它們添加自己的代碼以完成通信。但是,應(yīng)該注意的是,這些都是虛函數(shù),在使用之前必須內(nèi)建到從CAsyncSocket或CSocket繼承的新類中,然后在該類中重新定義以完成調(diào)用。應(yīng)用程序框架調(diào)用這些函數(shù)的時候,需要在程序中增加一個內(nèi)容提示的功能。如果您不這樣做,應(yīng)用程序框架將調(diào)用上面的函數(shù),但是不會實現(xiàn)任何東西[7]。服務(wù)器監(jiān)聽時,請設(shè)置監(jiān)聽端口并創(chuàng)建監(jiān)聽套接字,以便客戶端能夠成功偵聽??蚣軙鶕?jù)消息的格式來判斷是否允許連接,如果允許則會發(fā)送連接請求,如果不允許則會發(fā)送消息。客戶端請求與函數(shù)Connect()連接,當(dāng)連接成功時,框架自動調(diào)用OnAceept()函數(shù)。然后,連接到服務(wù)器上的客戶端可以聊天。在聊天過程中,框架會在消息到達(dá)時自動調(diào)用函數(shù)OnReceive,并可以在函數(shù)中寫入Receivee()來接收消息。當(dāng)用戶離開聊天室時,該框架自動調(diào)用OnClose()函數(shù),該函數(shù)實時捕獲用戶的活動,正確顯示在線狀態(tài),并向用戶發(fā)送退出消息。服務(wù)器將所有客戶端連接到網(wǎng)絡(luò),客戶端發(fā)送的所有消息都被發(fā)送到服務(wù)器,服務(wù)器將對消息進(jìn)行過濾并為每個客戶端提供服務(wù)。向客戶端傳輸數(shù)據(jù),所以服務(wù)器中存儲的數(shù)據(jù)量非常大,在服務(wù)器端需要對大規(guī)模的圖像和語音信息進(jìn)行處理,用戶對服務(wù)器的性能要求也越來越高,服務(wù)器的處理速度已經(jīng)不再是用戶滿意度的主要因素。服務(wù)器也面臨著提供大規(guī)模圖片、語音和視頻的壓力,特別是在擁有大量用戶的情況下。在開發(fā)過程中,需要更多的研究,如圖片發(fā)送、抖動窗口、語音視頻發(fā)送、文件傳送等。文章主要是通過對文字聊天功能的研究來達(dá)到提高用戶體驗的目標(biāo)是通過文字聊天這一功能來幫助用戶解決這時候就利用網(wǎng)絡(luò)上的軟件來完成自己的工作。但是我發(fā)現(xiàn)自己的知識有限,而且剩下的時間很短,只實現(xiàn)了文字聊天功能。在成功完成文字聊天后,我還嘗試發(fā)送語音信息,當(dāng)我調(diào)用API函數(shù)檢測硬件信息時出現(xiàn)了錯誤。不為人知的錯誤信息總是很難被發(fā)現(xiàn)。[8]?;竟δ軐崿F(xiàn)后,我們開始進(jìn)行界面設(shè)計,觀看孫鑫的教學(xué)視頻,并對基本界面開發(fā)的開發(fā)有一定的了解。單擊狀態(tài)欄時,該區(qū)域?qū)⒏臑榭删庉嫚顟B(tài),并選擇所有以前存在的文本。當(dāng)時,我想知道為什么一個熱門的東西會變成一個編輯框去寫,仔細(xì)考慮,最后想出如何去做。騰訊公司提供的視頻教學(xué)系統(tǒng)是一種基于多媒體技術(shù)的教育種場景分析:在本次設(shè)計中,我們使用的是騰訊的靜態(tài)文本。兩個控件,靜態(tài)文本和編輯框,可以放在一個區(qū)域中。編輯框的作用是在屏幕上顯示出來的,所以編輯輸入文字符串顯示在文本的下方,編輯框用于顯示編輯框。靜態(tài)文本用來顯示文字,編輯框用來編輯輸入文字。單擊該區(qū)域時隱藏靜態(tài)文本,顯示編輯框。當(dāng)鼠標(biāo)單擊該區(qū)域之外的任何區(qū)域時,會出現(xiàn)靜態(tài)文本,影藏編輯框。當(dāng)然,還有信息傳遞的問題。在軟件開發(fā)過程中,我自己做得很不滿意,尤其是時間安排上。在編寫代碼之前,對相應(yīng)的知識的了解也很少。但通過不斷地努力學(xué)習(xí),最終取得了一定的收獲,成功解決了許多問題。在實際使用時,也得到了不少的收益,有時還可以獲得一些榮譽稱號。這也證明,只要付出總會得到回報。

參考文獻(xiàn)[1]明日科技,VisualC++從入門到精通(第4版)[M],清華大學(xué)出版社,2020.

[2]梁偉.

Visualc++網(wǎng)絡(luò)編程案例實戰(zhàn)[M],清華大學(xué)出版社,2020.

[3]謝希仁.計算機網(wǎng)絡(luò)[M],電子工業(yè)出版社,2021.

[4]BehrouzA.ForouzanDataCommunicationandNetworking,online,2016.[5]孫鑫,余安萍.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.[6]孫雄勇,VisualC++6.0入門與提高實用教程[M].中國鐵道出版社,2003.[7]呂軍,曲寶軍.VisualC++從初學(xué)到精通[M].電子工業(yè)出社,2014.[8]JacksonMA.PrinciplesofProgramDesign[M].Houston:AcademicPress,2000.[9]AnthonyJones.NetworkProgrammingforMicrosoftWindows[M].Microsoftpress,2013.[10]鄭阿奇,VisualC++6.0應(yīng)用案例教程[M].電子工業(yè)出版社,2013.[11]梁普選,VisualC++程序設(shè)計與實踐[M].清華大學(xué)出版社,2005.[12]候俊杰.深入淺出MFC[M].武漢:華中科技大學(xué)出版社,2001.

附錄以下為服務(wù)器和客戶端設(shè)計過程中創(chuàng)建套接字等各種功能實現(xiàn)的部分程序:服務(wù)器端:UINTListenThread(LPVOIDp){ CServer3Dlg*pDlg=NULL; pDlg=(CServer3Dlg*)p; ASSERT(pDlg!=NULL); CStringstrError; interror; sockaddr_inclientaddr; intclientlen=sizeof(clientaddr); intk=0; for(;k<=csnum;++k) { if(!clientsock[k].clientsock) { if(k==csnum)csnum++;//如果前面沒有空,則使最大連接數(shù)加1 clientsock[k].clientsock=accept(pDlg->m_serversock,(sockaddr*)&clientaddr,&clientlen); if(clientsock[k].clientsock==SOCKET_ERROR) { strError.Format("AcceptError:%d",error=WSAGetLastError()); AfxMessageBox(strError); closesocket(pDlg->m_serversock); return-1; } break; } } //開啟另外一個監(jiān)聽線程,監(jiān)聽其他用戶連接 AfxBeginThread(ListenThread,p); //判斷標(biāo)識符,以調(diào)用不同的處理函數(shù) charrecvflag[3]; memset(recvflag,0,3); intflagc=recv(clientsock[k].clientsock,recvflag,2,0); recvflag[2]='\0'; CStringstrflag; strflag.Format("%s",recvflag); CStringclientName;//客戶名 while(strflag!=_T("QQ")) { if(strflag==_T("CC")) { //接收客戶名 charreclientName[100]; memset(reclientName,0,100); intrecvlgc=recv(clientsock[k].clientsock,reclientName,sizeof(reclientName),0); if(recvlgc<0) { AfxMessageBox("recvclientnameerror"); return-1; } clientName.Format("%s",reclientName); clientsock[k].clientname=clientName; intitemcount=0; itemcount=pDlg->m_serverlist.GetItemCount(); //當(dāng)有客戶上線時更新列表 pDlg->m_serverlist.InsertItem(itemcount,clientName); itemcount=pDlg->m_serverlist.GetItemCount(); CStringcnames[25]; CStringstrsend; strsend.Format("%d*",itemcount); for(inti=0;i!=itemcount;++i) { cnames[i]=pDlg->m_serverlist.GetItemText(i,0); strsend=strsend+cnames[i]+"*"; } strsend="CC"+clientName+"*"+strsend; //sendtoalltoupdatelist pDlg->SendBackToall(strsend); CStringstrlog; pDlg->GetDlgItemText(IDC_EDIT_MESSHOW,strlog); strlog=strlog+"\r\n"+reclientName+"上線了。。。。"; pDlg->m_smesshow=strlog; pDlg->SetDlgItemText(IDC_EDIT_MESSHOW,pDlg->m_smesshow); CEdit*ce=((CEdit*)pDlg->GetDlgItem(IDC_EDIT_MESSHOW)); ce->LineScroll(ce->GetLineCount()-1); } elseif(strflag==_T("MM")) { pDlg->RecvMessage(clientsock[k].clientsock); } elseif(strflag==_T("FF")) { pDlg->RecvFile(clientsock[k].clientsock); } memset(recvflag,0,3); flagc=recv(clientsock[k].clientsock,recvflag,2,0); recvflag[2]='\0'; strflag.Format("%s",recvflag); } //下線時的操作 LVFINDINFOfindinfo; findinfo.flags=LVFI_STRING; findinfo.psz=clientsock[k].clientname; introw=pDlg->m_serverlist.FindItem(&findinfo); pDlg->m_serverlist.DeleteItem(row); CStringstrshow; pDlg->GetDlgItemText(IDC_EDIT_MESSHOW,strshow); strshow+="\r\n"+clientName+"下線了。。。。。"; pDlg->SetDlgItemText(IDC_EDIT_MESSHOW,strshow); CStringstrlose="QQ"+clientName; pDlg->SendBackToall(strlose); closesocket(clientsock[k].clientsock); clientsock[k].clientsock=NULL; clientsock[k].clientname=""; ASSERT(clientsock[k].clientsock==NULL); return0;}classCAboutDlg:publicCDialog{public: CAboutDlg(); //DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg)protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL //Itected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){ //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)//Nomessagehandlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CServer3DlgdialogCServer3Dlg::CServer3Dlg(CWnd*pParent/*=NULL*/):CDialog(CServer3Dlg::IDD,pParent){ //{{AFX_DATA_INIT(CServer3Dlg) m_smesshow=_T(""); m_smessend=_T(""); m_port=0; m_servername

溫馨提示

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

最新文檔

評論

0/150

提交評論