UDP局域網QQ聊天程序設計說明書_第1頁
UDP局域網QQ聊天程序設計說明書_第2頁
UDP局域網QQ聊天程序設計說明書_第3頁
UDP局域網QQ聊天程序設計說明書_第4頁
UDP局域網QQ聊天程序設計說明書_第5頁
已閱讀5頁,還剩37頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

文檔從互聯網中收集,已重新修正排版,word格式支持編輯,如有幫助歡迎下載支持。摘要隨著網絡技術的發展及人們生活的需求,網絡聊天已越來越受到人們的青睞。網絡聊天已經成為人們工作生活中傳遞信息、交流感情的重要工具,給人們帶來了很大的方便。本設計開發的是一個局域網QQ聊天軟件,運用軟件工程的設計流程,使用現在比較普遍和流行的C#語言,采用面向對象的方法,綜合運用數據庫編程技術、多線程開發技術、網絡通訊技術,以MicrosoftVisualStudio2005作為系統前臺應用程序開發工具,MicrosoftSQLServer2000作為后臺數據庫管理系統,在WindowsXP平臺下進行開發。本局域網QQ聊天軟件采用服務器端/客戶端(C/S)模式。客戶端采用UDP與服務器連接,客戶端之間也是通過UDP互相通訊。服務器端主要用于開啟和關閉UDP協議的監聽服務,還可以查看局域網內已注冊的所有的用戶以及他們的在線狀態。客戶端分為注冊窗口、登錄窗口、QQ窗體主界面以及聊天界面。服務器端要先開啟監聽服務,客戶端才可以進行登錄,然后才可以與其他登錄的在線用戶進行文本信息的聊天,還可以進行點對點的語音聊天,視頻聊天和文件傳輸,還可以進行拍照和錄像等。此外,還對該軟件進行了皮膚的加載以及打包成安裝源。該軟件運行穩定,界面美觀、操作簡便。在局域網內部使用該局域網QQ聊天軟件,可以方便人與人之間的溝通、交流;可以大大提高企業的工作效率;拉近人與人之間的關系。關鍵詞:局域網;聊天軟件;客戶端;服務器端;UDP協議AbstractWiththedevelopmentofnetworkingtechnologyandthelivingdemandofpeople,chattingonnetworkismoreandmoreacceptablebypeople.Internetchathasbecomeanimportanttooltotransmissionofinformationandexchangeoffeelingsinourlife,itbringsagreatconvenience.ThetopicofthispaperisgoingtotalkaboutthattodevelopthelocalareanetworkQQchatsoftware.Thislocalareanetworkchatsoftwareusingthedesignstreamofthesoftwareproject,usingtheC#languagewhichisverycommonandpopular,usingtheobject-orientedapproach,thetechnologyofthedatabaseprogramming,multi-threadingdevelopmenttechnologyandthenetworkcommunicationtechnology,makesMicrosoftVisualStudio2005asthefrontapplicationdesigntool,MicrosoftSQLServer2000areusedasthebackgroundDBMS(thedatabasemanagementsystem),anditwasprogrammedintheWindowsXPSystem.ThelocalareanetworkQQchatsoftwareusestheserverandclient(C/S)mechanism.AndtheclientconnectstheserverusingUDP,andtheycommunicateeachotherbyUDP.Server-sideismainlyusedtoopenandclosetheUDPprotocolmonitoringservice,andyoucanalsolookoveralltheregisteredusersandtheironlinestatuswhominthelocalareanetwork.Clientisdividedintoregistrationwindow,theloginwindow,themainQQformandthechatform.Iftheclientwantstologin,theservermonitoringservicemustfirstopenthelisteningservice,thentheclientcanchatwiththeotherswhichhavealreadylogged,andalsocanvoicechat,videochatandfilestransfers,andalsocantakepicturesandvideos.Inaddition,thesoftwarehasbeenloadthebeautifulskinandpackageintotheinstallationsource.Thissoftwarehasaninterfaceaesthetics,stableoperation,simpleoperation.UsingQQsoftwareintheLANinternalcanhelppeopletocommunicatewithotherseasily,cangreatlyimprovetheefficiencyoftheenterprises,closerelationshipsbetweenpeople.KeyWords:LocalAreaNetwork;ChatSoftware;Client;Server-side;UDPprotocol目錄引言 錯誤!未定義書簽。系統概述與需求分析 錯誤!未定義書簽。系統概述 錯誤!未定義書簽。需求分析 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。可行性分析 錯誤!未定.義書簽。2系統總體設計 錯誤!未定義書簽。相關開發技術的原理性說明 錯誤!未定義書簽。FrameWork和C# 錯誤!未定義書簽。Server2005 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。2.2系統功能結構 錯誤!未定義書簽。業務流程圖 錯誤!未定義書簽。程序運行環境 錯誤!未定義書簽。3數據庫以及類庫的詳細設計與實現 錯誤!未定義書簽。數據庫的創建 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。……………………… 錯誤!未定義書簽。..…………………..錯誤!未定義書簽。………………………..錯誤!未定義書簽。類庫的設計 錯誤!未定義書簽。4客戶端模塊的詳細設計及實現 錯誤!未定義書簽。客戶端注冊模塊的設計 錯誤!未定義書簽。 錯誤!未定義書簽。 ……………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽。客戶端登陸模塊設計 錯誤!未定義書簽。 錯誤!未定義書簽。 ……………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽。客戶端QQ模塊設計 錯誤!未定義書簽。..…………………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽。客戶端消息發送模塊設計 錯誤!未定義書簽。 錯誤!未定義書簽。 ………..錯誤!未定義書簽。 ………..錯誤!未定義書簽。5服務器端模塊的詳細設計與實現 錯誤!未定義書簽。服務器端控制臺窗體概述 錯誤!未定義書簽。服務器端控制臺窗體技術分析 錯誤!未定義書簽。服務器端控制臺窗體實現過程 錯誤!未定義書簽。6系統特色及關鍵技術 錯誤!未定義書簽。7結論 錯誤!未定義書簽。謝辭 錯誤!未定義書簽。參考文獻 錯誤!未定義書簽。附錄 錯誤!未定義書簽。引言在Internet飛速發展的今天,互聯網成為人們快速獲取、發布和傳遞信息的重要渠道,它在人們政治、經濟、生活等各個方面發揮著重要的作用。網絡聊天已經成為人們工作生活中傳遞信息、交流感情的重要工具。網絡版的聊天軟件種類繁多,如QQ、OICQ、MSN等,給人們帶來了很大的方便,也使世界好象一下子縮小了,不管在哪里,只要能上網,打開這些軟件,就可以給朋友發信息,不管對方是否也同時在線,只要知道對方的號碼。但是這些聊天軟件也存在以下不足:用戶必須連接Internet;用戶在工作時容易沉迷于網絡聊天。為了方便單位企業內部的信息交流,減少不必要的財力和人力資源浪費,開發一個局域網聊天軟件是非常必要的。隨著科學技術的不斷提高,計算機科學日漸成熟,其強大的功能已為人們深刻認識,它已進入人類社會的各個領域并發揮著越來越重要的作用。計算機應用技術在日益的普及,網絡也遍及到生活的每個角落,很好的利用這些資源,將為人們的工作和學習,帶來極大的方便和提高工作效率。現在,企業、機關、學校都建立起了自己的局域網,在局域網,雖然可以通過文件共享的方式進行通訊,但單單使用這種方式,是非常不方便的,首先,在局域網里的網上鄰居里,只能看到機器名,不清楚對方是誰,也不知道對方機器里有什么資源可以共享,而且,當局域網的機器很多時,這種方式更加麻煩。于是,就想到做一個在局域網里的聊天軟件,在局域網里,可以通過它,實現在局域網里方便的聯絡,進行文件傳輸,消息的發布,還可以語音、視頻等。所以,開發一個局域網里的基于C/S模式的QQ聊天軟件,是十分必要。在學校建立起校園網里,局域網聊天系統可以起到方便同學之間,教師之間,師生之間的相互聯絡,這樣,不用上Intemet,可以節省資源,在學校這個大環境里,就可以同學之間聯系,聯絡感情,促進同學之間的友誼,學生可以通過它來與不同寢室的同學,教師討論問題。并能最大限度地利用現有的網絡資源,極大地提高工作效率。為了適應校園網的建設,實現校園網內進行消息發布,學生交流,師生交流,網上作業等功能。在公司企業建立起的局域網里,應用于局域網內企業(組織)內部成員之間的交流領域,在沒有因特網的支持下也可以進行即時通訊,亦因此使之更安全、更高效;同時因為它界面簡潔實用,沒有娛樂功能,所以簡單易用,是企業(組織)成員更加專注于工作,減少不必要的財力和人力資源浪費。因此,本畢業設計開發了一個局域網的QQ聊天軟件。該聊天軟件分為服務器端和客戶端,采用的是C#語言,在WindowsXP系統下,使用的開發工具是MicrosoftVisualStudio2005,運行于.NET平臺上,使用SQLServer2000作為后臺的數據庫管理。為實現和方便客戶端之間的通信,在客戶端進行了人性化的界面設計,用戶可以進行注冊,注冊后,憑借用戶名和密碼就可以登陸到QQ聊天界面,然后就可以與其他的在線用戶進行局域網內部的文本聊天、語音聊天、視頻聊天和文件的傳輸。系統概述與需求分析系統概述該局域網QQ聊天軟件操作簡單方便、界面簡潔。該系統分為客戶端和服務器端。前臺為客戶端,包括的主要功能有用戶注冊、用戶登陸、文字聊天、文件傳輸、語音聊天和視頻聊天等功能。后臺為服務器端,主要功能包括:數據庫的建立、查看用戶的狀態、管理用戶的資料、開啟和關閉服務器的監聽等功能。服務器端直接與數據庫相連,服務器端要先開啟監聽,然后客戶端登陸的時候要與服務器端進行通信,服務器端進行驗證客戶端的用戶名和密碼。客戶端經過服務器端的驗證后,才可以登陸成功。本軟件還對客戶端的各個窗口進行了皮膚加載,使界面看起來更加的美觀、大方。本局域網QQ聊天軟件還具有系統托盤和右鍵菜單的功能。每個客戶端只能進行一次并且只需注冊一次。用戶登錄成功之后,可以看到局域網內所有的在線和不在線的的注冊用戶。用鼠標雙擊打開某一個在線的用戶的聊天窗口,就可以與該用戶進行文字信息的互發與接收,可以利用本地的攝像頭進行錄像和拍照,還可以與對方進行點對點的視頻、語音和傳輸文件等操作。本系統運行比較的穩定、安全可靠。此外,本軟件還對源程序進行了打包成安裝源,便于用戶使用的時候進行安裝。安裝源也分為客戶端和服務器的安裝源。一般的局域網用戶只需要安裝客戶端即可。需求分析近年來,隨著全球信息化進程的不斷發展,網絡也在飛速發展。出于高效、快速地處理各種事務的目的,越來越多的企業在其內部使用局域網來進行工作。在內部局域網的幫助下,企業得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業規模的不斷擴大,業務量的不斷增加,企業內部的信息越來越私密,企業只希望員工通過內部局域網進行溝通與交流,避免企業內部機密通過Internet泄露到外部。為了解決上述矛盾,人們提出了開發局域網聊天軟件的構想,通過局域網聊天軟件,企業員工可以隨時的與局域網內部的用戶進行即時消息的傳遞,召開網絡會議,進行語音視頻和文件的傳輸等,有利于提高工作消息效率,同時又保護了企業內部信息的安全性。本局域網QQ聊天軟件主要是采用MicrosoftVisualStudio2005結合SQLSever2000數據庫技術,采用C#語言來實現各功能模塊的開發。開發出來的軟件必須結構比較的合理、功能比較的齊全、使用起來比較的方便。該局域網QQ聊天軟件開發的重點和難點是客戶端和服務器端與數據庫的連接,建立連接后還要保證通信的暢通性和正確性。此外要實現在兩個客戶端之間實現點對點的文件傳輸,語音聊天以及視頻等功能,也是本局域網QQ聊天軟件開發的難點。止匕外,還要著重處理好各模塊間的劃分以及模塊間的連接。在開發中應注意系統性能的優化,數據庫的安全和優化,盡可能的提高系統的安全性和整個系統的運行的穩定性。同時,開發出來的軟件系統還必需功能完備、安全性高、易于維護和使用,操作也要簡單、方便,界面也要簡潔、美觀、大方。網絡聊天已經成為人們工作生活中傳遞信息、交流感情的重要工具。網絡版的聊天軟件種類繁多,如QQ、OICQ、MSN等,實現了隨時隨地上網聊天,給人們帶來了很大的方便。但是這些聊天軟件也存在以下不足:用戶必須連接Internet;用戶在工作時容易沉迷于網絡聊天。為了方便單位企業內部的信息交流,減少不必要的財力和人力資源浪費,開發一個局域網聊天軟件是非常必要的。開發該局域網聊天軟件需要完成以下的幾個要求,以便于用戶進行操作。這樣才能使該軟件易學易用、更加的人性化。合理的設計數據庫盡量合理地減少數據庫數據的冗余,使重復的數據保持在最小限度,這樣將不必要的多占用存儲空間,減少產生混亂影響的危險,還能提高計算機的運行速度。設計出友好的界面界面的友好與否是用戶評價一個軟件優劣的重要方面之一,使用戶有一個良好的心情。另外窗口界面的各個控件布局要合理,美觀。要充分的利用MicrosoftVisualStudio.Net2005提供的強大的功能。(3)根據局域網對QQ聊天軟件的要求,本QQ聊天軟件需要實現以下的目標:操作簡單方便、界面簡潔美觀每個客戶端只能注冊一次可以在局域網中實現文字的傳輸可以實現多用戶的信息通信可以實現兩個用戶之間的點對點的語音聊天可以實現兩個用戶之間的點對點的視頻聊天可以使用本地的攝像頭的進行錄像和拍照可以實現兩個用戶之間點對點的文件的傳輸和接收系統運行要比較的穩定、安全可靠(1)可靠性高,能在由于系統問題或其它原因產生錯誤后,作出相對應處理,比如網絡初始化失敗、服務器未啟動等,可以提示用戶安全退出本程序,在出現不可知的錯誤以后,可以盡量安全的退出程序。在程序的設計過程中,要求能盡可能多的設想到用戶使用過程中可能發生的事件,并能在判斷事件后做出相應的處理,使程序具有較高的容錯性能。(2)易操作性,程序簡單易懂,容易上手使用。設計界面是,簡化界面的復雜性,模擬QQ等現有即時通訊工具的界面,使用戶能很容易看懂并使用。(3)模塊化設計此軟件的功能,不同的模塊實現不同的功能,使得軟件易于以后的維護與擴展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應用。1.3可行性分析可行性研究的目的就是要用最小的代價在盡可能短的時間內確定問題是否能夠解決。可行性研究可以在較高的層次以比較抽象的方式討論系統的分析和設計。本局域網QQ聊天軟件的可行性研究主要從技術可行性、經濟可行性、開發可行性和現有的條件四個方面來進行討論。1)技術可行性隨著國內軟件開發的日益發展壯大,各種中小企事業單位和學校等部門已具備獨立開發各種類型的應用軟件的能力,能夠滿足不同行業的特別的需求。而本局域網QQ聊天軟件其在組織關系上并不存在著很大的復雜性,繁瑣性,從整個系統的技術構成上來看,它是屬于一個與數據庫應用有關的軟件,使用的是UDP協議。只要對C#語言比較的熟悉,對UDP協議以及Microsoft的API函數相對比較了解的話,開發出這樣的一個系統,并不存在很大的困難。2)經濟可行性對于整個系統而言,并不需要花費太多的經費。只要一兩個人或者一個小團隊,即可以完成系統的開發。3)開發可行性本局域網QQ聊天軟件采用的是MicrosoftVisualStudio.Net2005作為開發工具,利用SQLServer2000對數據庫表進行存儲,提供數據之間的操作。首先MicrosoftVisualStudio.Net2005是一個開放的協作式系統,可以連接許多比較常用的數據庫。其次它具有可視化的開發環境,使代碼的編寫比較的直觀,并且在可視化環境下的調試和維護也相對比較容易。再次MicrosoftVisualStudio.Net2005提供了大量的控件,這既豐富了應用程序的表達能力,也加快了項目的開發速度。4)現有設備及實驗條件:計算機:GenuineIntel(R)CPU2140@1.60GHz1G內存,160G硬盤系統:MicrosoftWindowsXPProfessional版本2002ServicePack3軟件:MicrosoftVisualStudio2005MicrosoftSQLServer2000以上的設備,對于開發出一個功能比較完備,性能比較完善的局域網QQ聊天軟件,已經足夠了。系統總體設計相關開發技術的原理性說明Framework和C#本局域網QQ聊天軟件的開發采用的是CIS結構,基于.NET開發環境下,使用C#語言進行開發。C#是一種精確、簡單、類型安全、面向對象的語言,是微軟公司發布的一種面向對象的、運行于.NETFramework之上的高級程序設計語言。并定于在微軟職業開發者論壇(PDC)上登臺亮相.C#是微軟公司研究員AnderSHejlSberg的最新成果.C#看起來與java有著驚人的相似;它包括了諸如單一繼承,接口,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NETwindows網絡框架的主角。C#的特點:(1)完全面向對象。(2)支持分布式,處理過程可以分布在客戶機和服務器上。C#能很好的解決分布式問題。(3)跟Java類似,C#代碼經過編譯后,成為了一種IL(中間語言)。在運行時,再把IL編譯為平臺專用的代碼。(4)健壯,C#在檢查程序錯誤和編譯與運行時錯誤一點也不遜于Java,C#也用了自動管理內存機制。(5)C#不像Java那樣完全摒棄了指針和手動內存管理。C#默認情況下是不能使用指針的,程序員在有必要時可以打開指針來使用。這樣可以保證編程的靈活性。(6)安全性:C#的安全性是有.net平臺來提供的。C#代碼編譯后成為IL語言。是一種受控代碼,.net提供類型安全檢查等機制保證代碼是安全的。(7)可移植性:由于C#使用類似Java的中間語言機制。使得C#也跟Java類似,可以很方便的移植到其他系統。在運行時,再把中間代碼編譯為適合特定機器的代碼。(8)解釋性:C#也是一種特殊的解釋性語言。(9)高性能:C#把代碼編譯成中間語言后,可以高效的執行程序。(10)多線程:與Java類似,可以由一個主進程分出多個執行小任務的多線程。(11)組件模式:C#很適合組件開發。各個組件可以由其他語言實現的,然后集成?.net中。.NETFramework類似于Java虛擬機,它不但使Internet上運行的應用程序更容易被開發,而且也可用于開發運行于Windows桌面上的傳統業務應用程序。它為創建、部署以及管理安全、強大、高效的應用程序提供了前所未有的最大支持。.NETFramework是一個創建、部署和運行應用程序的多語言平臺環境,.NET支持的語言使用的基類庫由.NETFramework類庫(FCL)提供。C#是Microsoft公司設計的一種編程語言。它松散地基于C/C++,并且有很多方面和Java類似。Microsoft是這樣描述C#的:C#是從C和C++派生來的一種簡單、現代、面向對象和類型安全的編程語言。C#主要是從C/C++編程語言家族移植過來的,C和C++的程序員會馬上熟悉它。Server2005SQLServer數據平臺SQLServer是一個全面的、集成的、端到端的數據解決方案,它為企業中的用戶提供了一個安全、可靠和高效的平臺用于企業數據管理和商業智能應用。SQLServer2005為IT專家和信息共作者帶來了強大的、熟悉的工具,同時減少了在從移動設備到企業數據系統的多平臺上創建、部署、管理及使用企業數據和分析應用程序的復雜度。通過全面的功能集、和現有系統的集成性、以及對日常任務的自動化管理能力,SQLServer2005為不同規模的企業提供了一個完整的數據解決方案。本局域網QQ聊天軟件使用的是UDP協議。用戶數據報協議(USerDatagramProtocol)是OSI參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。是一個簡單的面向數據報的傳輸層協議,IETFRFC768是UDP的正式規范。UDP協議基本上是IP協議與上層協議的接口。UDP協議適用端口分別運行在同一臺設備上的多個應用程序。與TCP不同,UDP并不提供對IP協議的可靠機制、流控制以及錯誤恢復功能等。由于UDP比較簡單,UDP頭包含很少的字節,比TCP負載消耗少。UDP適用于不需要TCP可靠機制的情形,比如,當高層協議或應用程序提供錯誤和流控制功能的時候。UDP是傳輸層協議,服務于很多知名應用層協議,包括網絡文件系統(NFS)、簡單網絡管理協議(SNMP)、域名系統(DNS)以及簡單文件傳輸系統(TFTP)、動態主機配置協議(DHCP)、路由信息協議(RIP)和某些影音串流服務等等。選定WindowsXP平臺開發網絡通信程序,可以選擇Windows的Sockets編程接口,WindowsSockets是一套開放的、支持多種協議的Windows下的網絡編程接口。現在的Winsock已經基本上實現了與協議無關,可以使用Winsock來調用多種協議的功能,但較常使用的是TCP/IP協議。Windowssockets無疑是進行網絡編程的利器。所有的WindowsSockets實現都支持流套接口和數據報套接口。應用程序調用WindowsSockets的API實現相互之間的通訊。WindowsSockets又利用下層的網絡通訊協議功能和操作系統調用實現實際的通訊工作。SOCket,簡稱套接字,用于實現網絡上客戶和服務器之間的連接。也就是說網絡上兩個或兩個以上雙工方式通信的進程之間總有一個連接,這個連接的端點成為套接字,套接字是在比較低的層次上通信的。具體的說:一個服務器應用程序一般偵聽一個特定的端口等待客戶端的連接請求,當一個連接請求到達時,客戶端和服武器端建立一個通信連接,在連接過程中,客戶端被分配一個本地端口與一個Socket建立連接,客戶端通過寫Socket來通知服務器,以讀取Socket中的信息,類似的服務器也獲得一個本地端口,它需要一個新的端口號來偵聽原始端口上的其他連接請求。服務器也通過它的本地端口連接一個Socket,通過讀寫和客戶端通信。一般的Socket網絡編程的函數調用步驟如下:(1)創建套接字應用程序在使用套接字前,首先必須創建一個套接字,以便系統分配相應的資源給它。(2)指定本地地址當一個套接字被創建后,存在一個名字空間(地址族),但它沒有被命名。需要將套接字地址(包括本地主機地址和本地端口地址)與所創建的套接字號聯系起來,即將名字賦予套接字,以指定本地相關。(3)建立套接字連接即開啟監聽功能。監聽遠程客戶端的請求。(4)數據傳輸當一個連接建立以后,就可以進行數據傳輸了。分為數據的發送和接收。(5)關閉套接字連接也就是關閉監聽,并釋放分配給該套接字的資源。系統功能結構根據局域網QQ聊天軟件的特點,可以將其分為客戶端和服務器端兩個部分進行設計。客戶端主要用于用戶的注冊、登陸和信息的發送、語音、視頻和文件的傳輸等;服務器端主要用于記錄用戶注冊的用戶名、密碼、IP地址、端口號以及用戶在線的狀態等信息,并作為客戶端向遠程客戶端發送信息的一個中轉站。UDP局域網聊天程序客戶端與服務器端的功能結構圖如圖2-1所示:UTlP局域隨F天程序Q客戶端÷l服務器端服務器銜體圖2-1局域網QQ聊天程序功能結構圖業務流程圖UDP局域網聊天程序是由客戶端和服務器端組合而成的,業務流程圖如圖2-2所示。客戶端登陸的時候,先判斷用戶是否已經進行過了注冊。如果用戶已經注冊后,則直接進入到登陸窗口。如果用戶沒有注冊過,則跳轉到注冊窗口,讓用戶先進行注冊。用戶注冊需要填寫服務器IP地址、端口號、用戶名和密碼等信息。注冊完成后,客戶端與遠程服務器取得通信,將注冊的信息發送到遠程的服務器端進行注冊保存。客戶端在本地將生成一個Server.ini文件,該文件主要是記錄服務器的IP地址和端口號以及注冊用戶的用戶名。當用戶下一次登陸的時候就是通過讀取Server.ini文件,來取得服務器的IP地址和端口號,然后再根據該IP地址和端口號與服務器建立通信。注冊完成后,然后就會跳轉到登陸窗口。用戶只要輸入正確的用戶名和密碼,就可以登陸成功。就可以與服務器端建立通信。登陸之后,就進入到了QQ界面。雙擊某一個在線的用戶,就可以與該用戶進行聊天、語音、視頻和文本的傳輸。圖2-2局域網QQ聊天軟件業務流程圖程序運行環境本局域網QQ聊天軟件運行的環境具體如下:(1)系統開發平臺:MicrosoftVisualStudio2005(2)系統開發語言:C#(3)數據庫管理系統軟件:MicrosoftSQLServer2000(4)運行平臺:WindowsXP(5)運行環境:MiCroSoft.NETFrameworkSDKv2.0數據庫以及類庫的詳細設計與實現數據庫的創建在開發應用程序時,對數據庫的操作是必不可少的,數據庫設計是根據程序的需求及其實現功能所制定的。本局域網QQ聊天軟件后臺數據庫主要是用于記錄注冊人員的編號、用戶名、密碼、IP地址、端口號和在線和離線的狀態等信息。使用MicrosoftSQLServer2000作為后臺數據庫。數據庫命名為db_MyQQData,其中包含了一張數據表db_CurrencyUser,用于存儲當前已注冊的用戶的基本信息。數據庫db_MyQQData的具體創建步驟如下:(1)選擇“開始/所有程序/MicrosoftSQLServer/企業管理器”命令,打開SQLServerEnterpriseManager數據庫窗體。(2)在SQLServerEnterpriseManager數據庫窗體的(local)(WindowsNT)中,用鼠標右鍵單擊“數據庫”文件,在彈出的快捷菜單中選擇“新建數據庫”命令,打開“數據庫屬性”對話框,在該對話框的“名稱”文本框中輸入要創建的數據庫名稱“db_MyQQData”,單擊“確定”按鈕創建數據庫。在QQ用戶登陸時,為了可以在服務器端返回所有注冊用戶的信息,可以在服務器端的數據庫中創建一個用戶注冊表,用于記錄注冊用戶的IP地址、端口號、在線狀態、用戶名和密碼等基本信息。用戶注冊表的實體E-R圖如圖3-1所示。圖3-1用戶注冊表的實體E-R圖根據上面設計好的E-R圖,可以在數據庫中創建相應的數據表,此外根據注冊用戶的實體E-R圖來創建數據表。數據庫創建完成后,在db_MyQQData數據庫的下拉節點的“表”節點上單擊鼠標右鍵,在彈出的快捷菜單中選擇“新建表”命令,將在SQLServerEnterpriseManager數據庫窗體中彈出“新表”對話框。在“新表”對話框的“列名”中輸入ID、IP、Port、Name、PaSSWord和Sign字段,將其數據類型分別設置為int、VarChar(20)、int、VarChar(20)、VarChar(20)和int,并將ID字段設為主鍵和自動編號,然后在各“列”的“描述”文本框中對應字段進行中文解釋。字段名稱和數據類型設置完成后,單擊保存按鈕,彈出“選擇名稱”窗口,在該窗口中輸入創建數據表的名稱db_CurrencyUser,單擊“確定”按鈕,就完成了對本局域網QQ聊天軟件后臺數據庫的創建。在本系統中創建了五個解決方案和一個類庫,分別是客戶端解決方案、表情方案、語音和文件傳輸方案以及服務器端解決方案,還有一個名為QQClass的類庫。為了便于對它們進行操作,將客戶端解決方案和類庫添加到了服務器端解的決方案中。文件夾組織結構圖如圖3-2所示。MyQQClient解決方案主要是用于客戶端各個窗口的開發,MyQQServer解決方案主要是用于服務器端后臺的用戶信息管理平臺界面的開發,QQClaSS類庫主要是對UDP協議進行封裝,還有定義其他一些類。ImageListPopupDemo解決方案主要是用于實現QQ表情的發送的,MatureVoice解決方案主要是用于實現語音的,UdpSendFile解決方案主要是用于實現文件的傳輸功能的。圖3-2文件夾組織結構圖類庫的設計在本局域網QQ聊天軟件中,因為在后臺服務器端的用戶信息管理平臺以及前臺的客戶端的注冊窗口、登錄窗口、QQ界面窗口以及聊天窗口都需要用到UDP協議。所以本程序中,將UDP協議封裝成了一個控件,主要是為了便于客戶端和服務器端的調用,并且將UDP控件和自定義類存儲在了QQClass類庫中。當需要使用到UDP協議的時候,只需要在相應的窗口中加入UDPSocket控件,然后設置UDPSocket控件的相關的屬性即可。下面對QQClass類庫中的UDPSocket控件和其他的類分別進行說明。(1)UDPSocket控件該控件主要是將UDP協議中的IP地址和端口號以及開啟或者關閉的狀態以控件的形式進行設置,并自定義一個了DataArrival事件,用于對主機的端口號進行監聽,以獲取遠程計算機發送過來的消息。在自定義控件上制作了localHost、localPort、active屬性,以及DataArrival事件。IocalHost用于設置服務器端的IP地址;IocalPort屬性用于設置端口號;active屬性是一個Bool型,可以控制端口號是否處于監聽狀態。UDPSOCket控件中包含了方法OPenSOCket和ClOSeSOCketO方法分別用于打開和關閉UDP協議端口的監聽功能,并在監聽關閉的同時關閉用于接收信息的子線程。Listener()方法用于實現主機端口號的監聽功能,主要是將IP地址和端口號以網絡端點進行存儲,然后創建一個新的端口號,再設置接收緩沖區和發送緩沖區的大小。此外,還創建了一個線程,主要是用于獲取當前接收到的信息,就是將獲取的遠程信息轉換成二進制流。在線程打開時,將GetUDPData()方法所接收的信息傳遞給線程的委托。GetUDPData()方法是在獲取遠程消息時,將消息轉發給UDPSOCket控件的DataArrival事件,可以通過該事件將消息發送給遠程客戶端。Send()方法用于將主機獲取的消息,通過IP地址和端口號發送給遠程客戶端。通過以上的方法,便制作完成了一個UDPSocket控件。如圖3-3所示:圖3-3UDP控件屬性圖(2)PubleC_Class類該類用于記錄服務器端和客戶端的基本信息,并通過自定義的方法MyHostIP()獲取服務器端的所有IP地址,通過自定義方法Get_Windows()獲取Windows目錄。(3)ClassForms類該類將獲取的的窗體在InnerList列表中進行添加和移除操作,在列表中查找相應的窗體。(4)ClassMsg類該類主要是用枚舉型的元素指定消息發送的命令、消息類型、消息發送的狀態等。其中,發送的消息命令包括了用戶的注冊、用戶注冊結束、用戶登錄、用戶登錄結束上線、用戶列表、打開視頻、關閉視頻、下線等命令;發送的消息類型包括了無類型、發送命令、發送消息、發送文件等。此外,該類還用來記錄發送方和接收方的發送編號、IP地址以及端口號等信息,還記錄了用戶注冊的用戶名和密碼等信息。(5)ClassOPtionData類該類將服務器端對數據庫的操作進行了封裝,通過對該類中各方法的調用,可以對數據表進行添加、修改及讀取的操作。下面對各方法進行一下簡要的說明。①EXSQL()方法該方法通過ConStr參數所傳遞的SQL語句,對指定的數據表進行查詢,并將記錄的個數進行返回。②ExSQLReDr()方法該方法通過ConStr參數所傳遞的SQL語句,對指定數據進行查詢,并將查找到的數據信息以SqlDataReader對象進行返回。(6)ClassSerializers類SerializeBinary()方法該方法是在客戶端發送信息時,將發送的對象序列化為二進制流,并返回序列化的二進制流,因為Socket只能以二進制流的形式進行傳輸。DeSerialiZeBinary()方法該方法是在客戶端接收信息時,將二進制流反序列化為對象,并返回反序列化后的對象,這樣,便于在指定的控件上顯示接收的信息。(7)ClaSSUSerInfo類該類用于記錄當前QQ用戶的編號、IP地址、端口號、用戶名稱和用戶狀態。(8)ClaSSUSerS類該類主要是將服務器端所有注冊的用戶信息存儲到base類的InnerLiSt列表中。這樣,當用戶注冊或登陸時,可以將該列表中的信息發給當前在線的所有用戶,以改變QQ窗體的顯示情況。(9)Video類該類主要是一個API的視頻類。主要是通過調用API的視頻類的函數,來打開攝像頭,進行數據的讀取。打開攝像頭之后,還可以在本地進行拍照以及錄像等功能。4客戶端模塊的詳細設計及實現客戶端注冊模塊的設計注冊模塊主要是在客戶端用戶第一次使用UDP局域網聊天程序的時候,對當前用戶進行注冊,并將注冊的信息發送給服務器端進行記錄。當注冊成功后,就將返回的服務器端的ID、端口號和姓名等信息寫入名為Server.ini文件中,保存在本地的系統目錄中。主要是為了方便下次登錄的時候判斷用戶是否進行了注冊。如果用戶注冊了,在登錄的時候就讀取本地的Server.ini文件,獲得服務器端的ip地址和端口號。客戶端就可以根據獲得的服務器端的IP地址和端口號,與服務器建立通信。客戶端通過服務器端的驗證后即可登錄成功。注冊窗體運行結果如圖4-1所示。圖4-1客戶端注冊窗體在注冊模塊中應用了INI文件,以及獲取Windows路徑的技術,它們都是利用API函數實現的,所以應在命名空間中添加uSing(1)INI文件①創建INI文件創建INI文件主要應用了API函數WritePrivateProfileStringO,在應用API函數前,首先要對其進行聲明。②讀取INI文件讀取INI文件主要應用了API函數Getprivateprofilestring(),在應用API函數前,首先要對其進行聲明。(2)獲取Windows路徑獲取Windows路徑應用了API函數的GetWindoWSDireCtory(),在應用API函數前,首先要對其進行聲明。(1)、新建一個Windows窗體,命名為F_SerSetup.cs,主要用于實現用戶的注冊功能,該窗體主要用到了TeXtBoX和UDPSoCketI控件。(2)、在輸入完服務器的IP地址和注冊用戶的用戶名和密碼等注冊信息后,確保兩次輸入的密碼要一致,然后單擊“確定”按鈕,將通過自定義控件UdPSoCketI的Send()方法,將注冊信息以二進制流的形式發送給服務器端進行注冊。注冊成功后,服務器端將返回一個消息,告訴客戶端已經注冊成功,然后就可以進入到登陸窗口。(3)、在自定義控件的DataArrival事件中,利用托管調用DataArrival事件,并在該控件的線程上,用指定的參數對其進行異步托管。(4)、托管對DataArrival事件進行異步執行,用于獲取服務器端所返回的消息,當返回的是注冊成功消息時,創建一個INI文件,并寫入服務器的IP地址、端口號和用戶名稱,關閉注冊窗體。將INI文件保存在本地的系統目錄下。用戶在下一次登陸的時候,是要讀取該INI文件,取得服務器的IP地址和端口號,然后就可以向服務器發送登陸請求。獲得服務器的驗證通過后,就可以成功的登陸了。客戶端登陸模塊設計登陸模塊主要是將用戶名和密碼發送到服務器端進行驗證,當服務器端有該用戶時,將返回一個登陸成功的消息,通過該消息,將關閉登陸窗體,進入QQ窗體。登陸窗體運行結果如圖4-2所示。圖4-2客戶端登陸窗體在UDP協議的監聽事件中通過開啟一個線程,來實現局域網信息的發送和接收。要想創建一個子線程,需要實例化一個Thread類型的對象。子線程創建完后,可以使用線程的StartO方法開啟當前線程。當子線程使用完之后,可以使用Thread對象的Sleep(0)方法將主線程睡眠,然后調用線程的trd.Abort()方法終止當前線程。(1)新建一個Windows窗體,命名為F_Logon.cs,將窗體的FormBorderStyle屬性設為None,去掉窗口的邊框,使窗口看起來更加的美觀大方。該窗體主要實現客戶端的登陸功能。該窗體用到的主要控件有PictureBox和TextBox,分別用于顯示登陸窗體的背景和輸入登陸用戶的密碼。(2)在登陸窗體加載時,首先在Windows目錄中查找S文件,當該文件不存在時,調用注冊窗體;否則,在INI文件中讀取服務器的IP地址和端口號。(3)單擊窗體的“登陸”按鈕,該按鈕通過窗體加載所獲取的服務器IP和端口號,將用戶名和密碼以二進制流的形式發送給服務器端。再根據該IP地址和端口號與服務器建立通信,把用戶的用戶名和密碼發送給服務器進行驗證。驗證通過后,用戶就可以進行登錄了。(4)在自定義控件UDPSoCketI的DataArrival事件中,利用托管調用DataArrival事件,并在該控件的線程上,用指定的參數對其進行異步托管。(5)托管對DataArrival事件進行異步執行,用于獲取服務器端所返回的消息,當返回的是登陸成功消息時,存儲服務器端返回的ID值,關閉登陸窗體,進入客戶端QQ窗體。如果驗證不通過,就不能進行登錄。客戶端QQ模塊設計QQ模塊主要顯示當前已注冊的所有用戶的名稱,并根據用戶的在線情況,設置用戶名稱前的圖標樣式。QQ窗體運行結果如圖4-3所示。圖4-3客戶端QQ窗體在本窗體中使用InnerLiSt列表記錄當前已注冊用戶的信息,并將InnerLiSt列表中的信息添加到treeview1控件中。treeviewI控件上同級節點的連接線已經去掉,這樣使各個圖標看起來更加的美觀。InnerList用于存儲項目的ArrayList對象,它是CollectionBase對象中的一個屬性,可以通過該屬性的Add()和Remove()方法向列表中添加和移除元素。具有在線和離線的功能。當用戶在線時,就設置亮度的圖標,當用戶離線時,就設置成灰色的圖標。當點擊離線時,UDP協議將關閉監聽。顯示的所有的用戶都是離線的狀態。此時,不能給其他用戶發送消息。此外,還具有系統托盤圖標的功能,當最小化程序時,程序將縮小為右下角的系統圖標。系統托盤圖標上還具有右鍵菜單的功能。另外,當該QQ窗體移動到屏幕頂端時,還可以實現自動隱藏的功能。(1)新建一個Windows應用程序,將默認創建的Windows窗體命名為F_Clinent.cs,將窗體的FormBorderStyle屬性設為FixeDialog,主要用于實現系統的登陸功能。該窗體用到的主要控件有PictureBox和Treeview,主要功能是用于顯示QQ窗體的背景圖片和將控件的邊框設為無。還用到了ComboBox1控件,該控件主要是用于設置用戶的上線和離線狀態。(2)在QQ窗體加載時,首先要調用登陸窗體,當登陸窗體驗證成功后,發送消息給服務器端,返回所有注冊的用戶信息。然后再根據用戶的在線和離線狀態,在Treeview上設置用戶的圖標。(3)自定義方法GetUserList(),通過udpSocket1的控件的Send()方法將消息發送到服務器端,用于獲取服務器端已注冊的用戶消息。(4)利用UdPSoCketI控件的DataArrival事件,對服務器端發送的消息進行監聽,以實現客戶端與遠程客戶端的通信功能。當監聽到有遠程客戶端發送消息過來時,就自動在treeView1控件中遍歷節點查找消息接收對應的節點,然后就自動打開該聊天窗體,將接收到的信息顯示在該窗體上。(5)GetUserList()方法用于遍歷服務器端的所有用戶,根據用戶的當前狀態,以圖片的形式在Treeview控件中顯示用戶的在線狀態。(6)GetMsg()方法用于獲取客戶端所發送的消息,根據信息容量的大小,以不同的接收方式存儲信息,并在接收信息后,遍歷窗體列表,當窗體列表中有相應的接收窗體時,將信息添加到窗體的顯示控件中;否則,重新調用消息發送窗體,將接收信息顯示在該窗體的顯示控件上。(7)自動隱藏的功能主要是使用的timer控件來實現的。就是每毫秒執行一次,獲取鼠標在屏幕的坐標點,當鼠標在當前窗體內,并且窗體的TOP屬性小于0時,就設置窗體的TOP屬性值為0;當窗體的上邊框與屏幕的頂端的距離小于5時,就將QQ窗體隱藏到屏幕的頂端。當窗體隱藏之后,將鼠標移動到窗體內的時候,窗體就立刻顯示出來。關鍵的代碼如下;privatevoidtimer1_Tick(objectsender,EventArgse){pp=newPoint(Cursor.Position.X,;//獲取鼠標在屏幕的坐標點RectangleRects=newRectangle(this.Left,this.Top,this.Left+this.Width,this.Top+this.Height);〃存儲當前窗體在屏幕的所在區域if((this.Top<0)&&Win32API.PtInRect(refRects,pp))〃當鼠標在當前窗體內,并且窗體的Top屬性小于0this.ToP=0;〃設置窗體的Top屬性為0else//當窗體的上邊框與屏幕的頂端的距離小于5時if(this.Top>-5&&this.Top<5&&!(Win32API.PtInRect(refRects,pp)))this.Top=5-this.Height;〃將QQ窗體隱藏到屏幕的頂端}(8)系統托盤圖標主要是使用notifyIcon控件來實現的。托盤圖標的右鍵菜單使用的是COnteXtMenuStriP控件。右鍵菜單具有上線、離線和退出等功能。上線是通過開啟UPD控件的監聽功能,然后讀取數據庫的用戶信息,將在線和不在線的用戶信息顯示到treeview1控件上。離線是通過關閉UPD控件的監聽功能,停止服務。然后將所有的用戶設置成離線的狀態。此時,用戶不能與其他用戶進行通信,只有再次上線,才能與其他用戶進行通信。(9)QQ窗體上ComboBoX1上的的上線和離線功能主要也是通過開啟或者關閉UDPSocket控件來實現的。當為離線時,就是關閉UDPSocket控件,并把所有的用戶圖標都設置為灰色即可。(10)當在用戶頭像上雙擊某一個在線用戶的圖標時,即可打開該用戶的聊天窗口。然后在文本框輸入文本信息發送,就可以與該用戶進行文本信息的聊天。點擊該窗口上的語音、視頻和文件傳輸的按鈕,還可以與該用戶進行點對點的語音、視頻和文件傳輸。客戶端消息發送模塊設計消息發送模塊主要用于實現客戶端與遠程客戶端的消息通信。不但具有具有文本聊天的功能,還具有點對點的語音、視頻和文件傳輸等功能,此外,還可以利用本地的攝像頭就行錄像和拍照,還可以進行字體的設置,QQ表情的發送以及圖片的發送等功能。消息發送窗體運行結果如圖4-4所示。圖4-4客戶端聊天窗體(1)在用Socket發送消息時,只能以二進制流的形式進行發送,并且Socket發送的內存流不能大于1024個字節。當發送的消息大于1024個字節時,就需要對信息進行分流發送。QQ表情以及圖片的發送也是把它們放在發送框里面,經過序列化成二進制流的消息,當做信息來發送。對方接收到后,再將消息反序列化成對象,再在接收框上面顯示出來就可以了。(2)視頻功能的實現,主要是使用API函數,通過讀取攝像頭的數據,取得照片,然后保存在本地系統目錄中,然后再讀取已保存的照片,將照片發送給遠程的客戶端進行顯示。遠程的客戶端主要是將接收到的照片也保存在本地目錄中,然后再讀取保存的照片顯示在上方的PiCtureBoX中,就實現了視頻的功能。(3)語音的實現,主要是使用微軟提供的的DirectXAPI中的DireCtSound來實現。先是通過耳機采集到語音,然后再將語音傳輸出去,客戶端接收到語音后,就將語音進行播放。(4)文件傳輸的實現,跟文本信息的發送有點類似。也是要以文件流的形式進行傳輸。傳輸前,先將要傳輸的文件序列化成二進制流的形式,然后再進行傳輸。當文件比較大時,就要進行分塊傳輸。(1)新建一個Windows窗體,命名為F_Chat.cs,用于顯示用戶發送或接收的信息。該窗體主要用到了PiCtureBox、RichTextBox>UDPSoCket、Timer、toolStrip、Button等控件。PictureBox主要是用于進行視頻通信顯示雙方的視頻。上方的PictureBox顯示的是對方的視頻,下方的PictureBox顯示的是自己的視頻。Timer控件主要是用于視頻信息的發送。RichTextBox控件主要是用于顯示接收的和發送的文本信息。toolStrip控件主要是作為語音、視頻和文件傳輸的按鈕使用。UDPSocket控件主要用于消息的發送和接收,利用udpSocket1控件的DataArrival事件,對遠程客戶端所發送的消息進行監聽,以便執行相應的操作。(2)單擊消息發送窗體中的“發送”按鈕,先是將文本信息轉換成二進制流的形式,然后根據rich_Input文本框中的信息大小,以不同方式,將文本信息以二進制流的形式進行發送。當信息小于1024字節時,可以直接進行發送。當信息大于1024個字節時,就要將信息先進行拆分,以分塊的形式進行發送。當信息發送結束后,再向遠程客戶端發送一個消息,通知對方消息已經發送完畢。然后再將發送出去的消息顯示在當前窗體的RichTextBox顯示文本框中。(3)“視頻”按鈕主要的實現過程是,首先打開視頻設備,設置攝像頭的一些基本參數,然后將設置的基本信息發送給遠程的客戶端,請求遠程客戶端進行視頻連接。然后啟動timer1控件。該控件就是將從攝像頭拍到的保存在本地系統目錄中的照片,以每秒的速度發送給遠程的客戶端。遠程客戶端默認是將圖片保存在C盤根目錄下。當照片大于1024個字節時,就將照片進行分塊發送。因為在進行視頻通信時,是要將照片連續不斷的發送出去,遠程客戶端接收到照片后,再不斷的在PiCtureBoX中更新照片,然后才會達到“視頻”的效果。因此發送的照片的數據量相對的比較大,所以為了減少網絡的擁堵,減少發送的數據量。對發送出去的照片進行了壓縮之后,再發送出去是很有必要的。在本程序中,API函數從攝像頭拍照到的照片是位圖的格式。原始的大小是90K左右。圖片沒壓縮之前,每次都要發送90k左右的數據量,所以相對來說,要發送的數據量是比較大的。這樣就給傳輸造成了一定的擁堵。所以對方看到的“視頻”就會顯得比較的“卡”,并不是那么的流暢。對方看到的視頻,就像是在放幻燈片一樣,感覺好像是將圖片一張一張的貼上去的一樣,一卡一卡的。所以,將圖片進行壓縮,減少數據的傳輸量是非常有必要的。所以,在發送圖片之前,要先對圖片進行了壓縮處理。然后再將處理后的圖片發送出去。經過圖片壓縮算法壓縮后,圖片的大小由原來的90K的,變成了現在的14K左右。圖片的格式由原來的位圖格式,變成了JPG的格式。雖然圖片的格式改變了,但是對于傳輸并沒有造成影響。反而因為壓縮的質量非常好,這樣只需要將JPG格式的圖片發送給遠程的客戶端就可以了。現在每次只需要發送14K左右的數據量就可以了,相比原來的90K的數據量,數據量小了很多。這樣就大大的減少了發送的信息量。這樣,相比于原來沒有經過壓縮處理的圖片來說,視頻就不會顯得那么的卡了。(4)在錄像的時候因為錄像占用的資源比較的大,所以在進行錄像的時候,就會顯得很卡。為了減少資源的占用,所以采用了多線程的技術。就是為錄像“功能”單獨開辟了一個線程來處理錄像。錄制出來的錄像的格式為avi的格式。錄像的關鍵代碼如下:///<summary>///錄像///</summary>要保存avi文件的路徑</param>publiCvoidKinesCope(stringpath){IntPtrhBmp=Marshal.StringToHGlobalAnsi(path);VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_DRIVER_CONNECT,0,hBmp.ToInt32());VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_SEQUENCE,0,0);}(5)使用本地的攝像頭進行拍照也相對的比較簡單,只要調用API函數即可實現。拍攝的照片是默認的保存在本地的C盤根目錄下。關鍵代碼如下:///<summary>///拍照///</summary>〃/ <param 要保存bmp文件的路徑<∕param>publicvoidGrabImage(IntPtrhWndC,stringpath){IntPtrhBmp=Marshal.StringToHGlobalAnsi(path);VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_SAVEDIB,0,hBmp.ToInt32());}(6)語音的實現,主要有以下的幾個步驟:①語音采集采集的作用就是從麥克風中獲取數據,這里采用的是DireCtSound類來實現這個技術。DirectSound是微軟提供的的DirectXAPI的一部分。它能以極低的時延播放聲音,使應用程序可以高度利用資源。所謂的錄音,就是將采集自麥克風的模擬信號轉換成數字信號(ADC),一般麥克風只提供模擬信號。一般聲卡采集到的數據會被存放到緩存區后進行處理,如果是集成聲卡,那就是先把數據放在內存中后再處理。WAVE格式WAVE是錄音時用的標準的WINDOWS文件格式,擴展名為“WAV”,使用DirectSound采集的WAV聲音,其音頻數據是按照PCM(脈沖編碼調制,對連續變化的模擬信號進行抽樣、量化和編碼產生的數據,0和1的組合)調制后放入緩沖區的。WAVE文件格式采用RIFF文件格式結構,對PCM數據和其它一些音頻信息進行相應的編排,從而最終形成的WAVE文件才能被音頻播放器識別,才能進行播放。緩沖區指針緩沖區是存放音頻數據的地方,并且它還提供了兩個指針:讀指針和捕捉指針。它們的位置按照相對于緩沖區起始位置的偏移量計算。讀指針位于當前已經被完全捕捉到緩沖區的數據末尾。捕捉指針位于當前將要從硬件中復制的數據塊的末尾。如果想從緩沖區中讀取數據,則只能從已經完全寫入緩沖區的數據中讀取,也就是說只能從偏移量小于讀指針的地方讀取。緩沖區通知大家應該都知道時間相同的音頻文件,WAVE文件會比其它格式的音頻文件大得多,這是因為WAVE文件沒有對數據進行壓縮。如果錄音的時候,不限制緩沖區大小,那么錄制很短的時間可能就會占用很多內存,說不定不過多久,1G內存就不夠用了。因此必須對緩沖區的大小進行限制,而且當緩沖區滿了之后,還可以重新從緩沖區起始處開始,用新的數據覆蓋舊的數據。那舊的數據怎么辦呢?如果不想丟失舊的數據,那就得在舊的數據被覆蓋之前,將它轉移到其它地方。如何才能在舊的數據沒有被覆蓋之前,將它轉移走呢?微軟提供了一個解決辦法:“通知”。可以在緩沖區中的某些位置處設置通知,當讀指針到達通知位置的時候,就會觸發相應的事件執行轉移操作。有點像操作系統中的“響應中斷”。錄音大致過程如下:1>設置PCM格式,設置相關的參數,如:采樣頻率、量化位數等。2>創建WAVE文件.數據還沒開始采集,就先創建文件是因為RIFF結構的WAVE文件除了音頻數據之外,還有其它數據,比如音頻格式、格式長度等類似于文件頭的數據。有了文件頭后,接下來就只需要把接收到的數據添加在這個后面就好了。3>建立設備對象,建立緩沖區對象。4>設置緩沖區通知,設置通知被觸發后的事件。5>準備就緒后,就可以開始錄音了。6>當通知被觸發后,建立一個新的線程來處理數據轉移的事件。(建立一個新的線程,就是為了防止錄音過程被中斷)。7>錄音結束,寫入WAV文件尾。這樣一個可以播放的WAVE文件就OK了。與錄音不同的是,錄音需要建立一個WAVE文件來存儲這些采集到的數據,而在語音聊天中,則不需要存儲,當采集到一些數據后,就立刻發送出去,因此也不需要開辟很大的空間來存放PCM數據。語音聊天基本的步驟如下:1>設置PCM格式,設置相關的參數,如:采樣頻率、量化參數等。2>建立采集用的設備對象,建立采集用的緩沖區對象。3>設置緩沖區通知,設置通知被觸發后的事件。通知是用于緩沖區的讀指針達到某預設位置時觸發通知事件,提醒可以對某部分的數據進行傳送了。4>開始采集語音。5>當通知被觸發后,建立一個新的線程來處理數據傳送的事件。(建立一個新的線程,就是為了防止采集過程被中斷。)語音傳輸就是將采集到的語音通過UDP協議傳輸到其他的主機上。大致的流程如下:.建立socket對象,在實例化這個對象的時候設置參數為UDP協議。.綁定本機的IP和端口,因為一個主機可能會有不止一個IP地址,如回發地址:和局域網地址:202.193.#.#。為了增加可用性,這里選擇綁定到任何本機可用的IP地址(IPAddreSS.Any),而端口約定默認為8000。.啟動監聽線程,來監聽網絡。采用的是異步的方式,以便獲得更好的系統響應度。.發送的關鍵代碼是:Client.SendTo(capturedata,epServer);〃傳送語音語音播放當對方將語音通過網絡傳輸到本機時,就可以進行實時播放了。因為聲音播放是從緩沖區中獲取聲音數據的,因此必須先將獲取到的數據寫入緩沖區,然后再調用相應的方法來播放。大致的思路如下:利用MemoryStream來代表這個接收緩沖區。設置兩個表示指針位置的字段:privateintintPoSWrite=0;//內存流中寫指針位移privateintintPoSPlay=0;//內存流中播放指針位移當接收到數據后,則移動寫指針,移動的長度為接收到的數據長度。利用一個字段表示通知大小:privateintintNotifySize=5000;當寫指針的位置達到通知大小,則執行播放操作,然后移動播放指針到剛才的通知的位置。如果當前寫指針的位移與將要寫入到緩沖區的數據大小相加后超過緩沖容量的,則進行摩爾運算,實現循環的效果。(7)文件傳輸的實現,分別定義了文件發送管理類(SendFileManager),文件接收管理類(ReceiveFileManager),文件發送類(UdpSendFile)和文件接收類(UdpRecieveFile),以便實現盡量簡單的就可以使用它們。文件傳輸中的發送和讀寫文件都是基于異步的,實現了對大文件的分塊發送。與前面的文本信息的發送比較的類似,因為傳輸的是二進制流,所以傳輸前要先將文件進行序列化成二進制流的形式,再進行傳輸。只要知道了對方的IP地址,本地需要開啟一個端口進行監聽,文件接收方也需要開啟一個端口進行監聽,看是否有文件流到達本地。如果有文件流到達本地后,就進行讀取接收。與傳輸的過程剛好是相反的,是要將二進制流的信息反序列化成文件對象。接收的文件默認放在接受文件端得根目錄下。當給對方發送文件的時候,同時給對方發送一個消息,提示對方自己已經給對方發送了一個文件。在文件發送的時候,也獨立開辟了一個線程來處理。文件接收的時候也開辟的一個線程來處理接收。這樣,可以提高系統的效率,加快文件傳輸的速度。服務器端模塊的詳細設計與實現服務器端控制臺窗體概述該窗體是客戶端與遠程客戶端相互通信的一個中轉站,并且在該窗體上顯示已注冊的所有用戶信息,包括注冊的ID、IP地址、端口號、姓名、狀態,并顯示用戶的在線狀態,4是表示在線,12是表示不在線。服務器端控制臺窗體運行結果如圖5-1所示。圖5-1服務器端控制臺窗體服務器端控制臺窗體技術分析在本模塊中使用了BinaryFOrmatter對象,該對象是以二進制格式將對象或整個連接對象序列化或反序列化。服務器端控制臺窗體實現過程(1)新建一個Windows窗體,命名為F_Server.cs,主要用于實現系統的登陸功能,該窗體用到的主要控件有LiStView和UDPSOCket。(2)在控制臺窗體的菜單欄中選擇“控制臺/開始服務”命令,打開UDP協議的監聽。然后再選中“控制臺/關閉服務”命令,即可關閉UDP協議的監聽。(3)在UDPSocket1的控件的DataArrival事件中,對客戶端發送的消息進行監聽,并根據發送的消息對數據庫進行相應的操作。(4)RegiSterUSerO方法將客戶端注冊的信息添加到數據庫中,并更新用戶列表。(5)InsertUser()方法的主要功能是將用戶注冊的相關信息添加到數據庫的tb_CurreneyUse數據表中,并更新用戶列表。(6)UPdateUSerLiStO方法的主要功能是將剛剛注冊成功的用戶信息,發送給當前所有在線的用戶,并告知其他用戶,當然已有人注冊。(7)UserLogin()方法的主要功能是當前用戶上線時,更改tb-CurreneyUser數據表中相關用戶的標識,并更新用戶的在線狀態。系統特色及關鍵技術(1)當QQ窗體上邊框拖動到屏幕頂端時,QQ窗體會自動隱藏。實現這一過程,使用的是timer1控件對鼠標進行實時監控,用API函數PtInRect()判斷當前鼠標是否在QQ窗體上,如果在,判斷窗體的Top屬性值,并進行相應的操作。代碼如下:Privatevoidtimer1_Tick(objectsender,EventArgse){pp=newPoint(Cursor.Position.X,;//獲取鼠標在屏幕的坐標點RectangleRects=newRectangle(this.Left,this.Top,this.Left+this.Width,this.Top+this.Height);〃存儲當前窗體在屏幕的所在區域if((this.Top<0)&&Win32API.PtInRect(refRects,pp))〃當鼠標在當前窗體內,并且窗體的Top屬性小于0this.Top=0;//設置窗體的Top屬性為0else//當窗體的上邊框與屏幕的頂端的距離小于5時if(this.Top>-5&&this.Top<5&&!(Win32API.PtInRect(refRects,pp)))this.Top=5-this.Heigh匕//將QQ窗體隱藏到屏幕的頂端}(2)為了使程序窗口的界面看起來更加的美觀、大方。對所有的窗體都進行了皮膚的加載。皮膚的加載技術相對的來說比較的簡單。只要在程序中引入相應的皮膚加載庫,然后將相關的文件放到當前程序的目錄下,即可實現動態加載皮膚了。(3)該程序中還使用的系統托盤圖標的功能。該功能的實現主要是使用了notifyIcon1控件實現。托盤圖標還具有右鍵菜單的功能。菜單上具有在線、離線、和退出的功能。(4)此外,還對窗體圖標已經可執行程序的圖標都進行插入“QQ”圖片,使程序看起來更加的美觀、大方。(5)本程序還對客戶端和服務器端程序分別進行了打包。使用戶在使用的時候能夠比較方便的安裝。打包使用的是VS2005中的“安裝和部署”功能來進行打包的。打包的時候,只要將程序使用的到的相關的動態鏈接庫和可執行文件進行打包即可。到了其他機器上,只要單擊運行“安裝程序”即可自動的快速的在本地完成QQ聊天程序的安裝。然后點擊快捷方式,即可方便的進行登錄了。(6)語音、視頻和文件傳輸是本程序最大的特色,也是在本系統開發中最難開發的、技術含量最多的模塊。7結論經過2個多月緊張的畢業設計,采用C#做的局域網QQ聊天軟件已基本完成,系統的基本功能已經實現,測試運行也比較正常。該系統操作簡便、易于使用、用戶界面友好,所以具有比較好的易用性。但是在開發的過程中,也遇到了不少的困難和挑戰:(1)剛開始碰到的一個比較大的問題就是,服務器IP地址的確定的問題。因為學校分配給每個人的IP地址不是固定的,是經常變化的,而在開始調試程序的時候是指定了固定的本地IP地址進行調試的,所以在調試程序的過程中經常出現連不上服務器的情況。開始的時候,以為是自己程序的問題,后來經過調試才發現原來是服務器IP地址經常變動的原因,才導致客戶端連接不上服務器,所以才導致客戶端不能正常的登錄。因為剛開始不知道有回環地址,所以每過一兩天,當IP地址一改變的時候,就得改變程序中的所有的固定了的IP地址,這樣做非常的麻煩,有時候因為疏漏,漏改了一兩處的話,就會導致連不上服務器的情況。后來,經過到網上,查詢,知道了本機的回環地址:,調試程序就方便多了,就不用經常改變程序中的IP地址了。(2)另外,就是在做視頻的時候,也遇到了比較大的麻煩。剛開始時,是可以實現了視頻,但是發現本地攝像頭拍攝到的圖像是“歪”的,就是在視頻控件上看到的圖像是“歪”的,后來,在網上不斷的尋找有關方面的資料,最終把問題給解決了。另外一個問題是,

溫馨提示

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

評論

0/150

提交評論