版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
文檔從互聯(lián)網(wǎng)中收集,已重新修正排版,word格式支持編輯,如有幫助歡迎下載支持。摘要隨著網(wǎng)絡技術的發(fā)展及人們生活的需求,網(wǎng)絡聊天已越來越受到人們的青睞。網(wǎng)絡聊天已經(jīng)成為人們工作生活中傳遞信息、交流感情的重要工具,給人們帶來了很大的方便。本設計開發(fā)的是一個局域網(wǎng)QQ聊天軟件,運用軟件工程的設計流程,使用現(xiàn)在比較普遍和流行的C#語言,采用面向?qū)ο蟮姆椒?,綜合運用數(shù)據(jù)庫編程技術、多線程開發(fā)技術、網(wǎng)絡通訊技術,以MicrosoftVisualStudio2005作為系統(tǒng)前臺應用程序開發(fā)工具,MicrosoftSQLServer2000作為后臺數(shù)據(jù)庫管理系統(tǒng),在WindowsXP平臺下進行開發(fā)。本局域網(wǎng)QQ聊天軟件采用服務器端/客戶端(C/S)模式??蛻舳瞬捎肬DP與服務器連接,客戶端之間也是通過UDP互相通訊。服務器端主要用于開啟和關閉UDP協(xié)議的監(jiān)聽服務,還可以查看局域網(wǎng)內(nèi)已注冊的所有的用戶以及他們的在線狀態(tài)??蛻舳朔譃樽源翱?、登錄窗口、QQ窗體主界面以及聊天界面。服務器端要先開啟監(jiān)聽服務,客戶端才可以進行登錄,然后才可以與其他登錄的在線用戶進行文本信息的聊天,還可以進行點對點的語音聊天,視頻聊天和文件傳輸,還可以進行拍照和錄像等。此外,還對該軟件進行了皮膚的加載以及打包成安裝源。該軟件運行穩(wěn)定,界面美觀、操作簡便。在局域網(wǎng)內(nèi)部使用該局域網(wǎng)QQ聊天軟件,可以方便人與人之間的溝通、交流;可以大大提高企業(yè)的工作效率;拉近人與人之間的關系。關鍵詞:局域網(wǎng);聊天軟件;客戶端;服務器端;UDP協(xié)議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目錄引言 錯誤!未定義書簽。系統(tǒng)概述與需求分析 錯誤!未定義書簽。系統(tǒng)概述 錯誤!未定義書簽。需求分析 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽??尚行苑治?錯誤!未定.義書簽。2系統(tǒng)總體設計 錯誤!未定義書簽。相關開發(fā)技術的原理性說明 錯誤!未定義書簽。FrameWork和C# 錯誤!未定義書簽。Server2005 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。2.2系統(tǒng)功能結構 錯誤!未定義書簽。業(yè)務流程圖 錯誤!未定義書簽。程序運行環(huán)境 錯誤!未定義書簽。3數(shù)據(jù)庫以及類庫的詳細設計與實現(xiàn) 錯誤!未定義書簽。數(shù)據(jù)庫的創(chuàng)建 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽?!?錯誤!未定義書簽。..…………………..錯誤!未定義書簽。………………………..錯誤!未定義書簽。類庫的設計 錯誤!未定義書簽。4客戶端模塊的詳細設計及實現(xiàn) 錯誤!未定義書簽??蛻舳俗阅K的設計 錯誤!未定義書簽。 錯誤!未定義書簽。 ……………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽??蛻舳说顷懩K設計 錯誤!未定義書簽。 錯誤!未定義書簽。 ……………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽??蛻舳薗Q模塊設計 錯誤!未定義書簽。..…………………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽。 ……………..錯誤!未定義書簽??蛻舳讼l(fā)送模塊設計 錯誤!未定義書簽。 錯誤!未定義書簽。 ………..錯誤!未定義書簽。 ………..錯誤!未定義書簽。5服務器端模塊的詳細設計與實現(xiàn) 錯誤!未定義書簽。服務器端控制臺窗體概述 錯誤!未定義書簽。服務器端控制臺窗體技術分析 錯誤!未定義書簽。服務器端控制臺窗體實現(xiàn)過程 錯誤!未定義書簽。6系統(tǒng)特色及關鍵技術 錯誤!未定義書簽。7結論 錯誤!未定義書簽。謝辭 錯誤!未定義書簽。參考文獻 錯誤!未定義書簽。附錄 錯誤!未定義書簽。引言在Internet飛速發(fā)展的今天,互聯(lián)網(wǎng)成為人們快速獲取、發(fā)布和傳遞信息的重要渠道,它在人們政治、經(jīng)濟、生活等各個方面發(fā)揮著重要的作用。網(wǎng)絡聊天已經(jīng)成為人們工作生活中傳遞信息、交流感情的重要工具。網(wǎng)絡版的聊天軟件種類繁多,如QQ、OICQ、MSN等,給人們帶來了很大的方便,也使世界好象一下子縮小了,不管在哪里,只要能上網(wǎng),打開這些軟件,就可以給朋友發(fā)信息,不管對方是否也同時在線,只要知道對方的號碼。但是這些聊天軟件也存在以下不足:用戶必須連接Internet;用戶在工作時容易沉迷于網(wǎng)絡聊天。為了方便單位企業(yè)內(nèi)部的信息交流,減少不必要的財力和人力資源浪費,開發(fā)一個局域網(wǎng)聊天軟件是非常必要的。隨著科學技術的不斷提高,計算機科學日漸成熟,其強大的功能已為人們深刻認識,它已進入人類社會的各個領域并發(fā)揮著越來越重要的作用。計算機應用技術在日益的普及,網(wǎng)絡也遍及到生活的每個角落,很好的利用這些資源,將為人們的工作和學習,帶來極大的方便和提高工作效率?,F(xiàn)在,企業(yè)、機關、學校都建立起了自己的局域網(wǎng),在局域網(wǎng),雖然可以通過文件共享的方式進行通訊,但單單使用這種方式,是非常不方便的,首先,在局域網(wǎng)里的網(wǎng)上鄰居里,只能看到機器名,不清楚對方是誰,也不知道對方機器里有什么資源可以共享,而且,當局域網(wǎng)的機器很多時,這種方式更加麻煩。于是,就想到做一個在局域網(wǎng)里的聊天軟件,在局域網(wǎng)里,可以通過它,實現(xiàn)在局域網(wǎng)里方便的聯(lián)絡,進行文件傳輸,消息的發(fā)布,還可以語音、視頻等。所以,開發(fā)一個局域網(wǎng)里的基于C/S模式的QQ聊天軟件,是十分必要。在學校建立起校園網(wǎng)里,局域網(wǎng)聊天系統(tǒng)可以起到方便同學之間,教師之間,師生之間的相互聯(lián)絡,這樣,不用上Intemet,可以節(jié)省資源,在學校這個大環(huán)境里,就可以同學之間聯(lián)系,聯(lián)絡感情,促進同學之間的友誼,學生可以通過它來與不同寢室的同學,教師討論問題。并能最大限度地利用現(xiàn)有的網(wǎng)絡資源,極大地提高工作效率。為了適應校園網(wǎng)的建設,實現(xiàn)校園網(wǎng)內(nèi)進行消息發(fā)布,學生交流,師生交流,網(wǎng)上作業(yè)等功能。在公司企業(yè)建立起的局域網(wǎng)里,應用于局域網(wǎng)內(nèi)企業(yè)(組織)內(nèi)部成員之間的交流領域,在沒有因特網(wǎng)的支持下也可以進行即時通訊,亦因此使之更安全、更高效;同時因為它界面簡潔實用,沒有娛樂功能,所以簡單易用,是企業(yè)(組織)成員更加專注于工作,減少不必要的財力和人力資源浪費。因此,本畢業(yè)設計開發(fā)了一個局域網(wǎng)的QQ聊天軟件。該聊天軟件分為服務器端和客戶端,采用的是C#語言,在WindowsXP系統(tǒng)下,使用的開發(fā)工具是MicrosoftVisualStudio2005,運行于.NET平臺上,使用SQLServer2000作為后臺的數(shù)據(jù)庫管理。為實現(xiàn)和方便客戶端之間的通信,在客戶端進行了人性化的界面設計,用戶可以進行注冊,注冊后,憑借用戶名和密碼就可以登陸到QQ聊天界面,然后就可以與其他的在線用戶進行局域網(wǎng)內(nèi)部的文本聊天、語音聊天、視頻聊天和文件的傳輸。系統(tǒng)概述與需求分析系統(tǒng)概述該局域網(wǎng)QQ聊天軟件操作簡單方便、界面簡潔。該系統(tǒng)分為客戶端和服務器端。前臺為客戶端,包括的主要功能有用戶注冊、用戶登陸、文字聊天、文件傳輸、語音聊天和視頻聊天等功能。后臺為服務器端,主要功能包括:數(shù)據(jù)庫的建立、查看用戶的狀態(tài)、管理用戶的資料、開啟和關閉服務器的監(jiān)聽等功能。服務器端直接與數(shù)據(jù)庫相連,服務器端要先開啟監(jiān)聽,然后客戶端登陸的時候要與服務器端進行通信,服務器端進行驗證客戶端的用戶名和密碼。客戶端經(jīng)過服務器端的驗證后,才可以登陸成功。本軟件還對客戶端的各個窗口進行了皮膚加載,使界面看起來更加的美觀、大方。本局域網(wǎng)QQ聊天軟件還具有系統(tǒng)托盤和右鍵菜單的功能。每個客戶端只能進行一次并且只需注冊一次。用戶登錄成功之后,可以看到局域網(wǎng)內(nèi)所有的在線和不在線的的注冊用戶。用鼠標雙擊打開某一個在線的用戶的聊天窗口,就可以與該用戶進行文字信息的互發(fā)與接收,可以利用本地的攝像頭進行錄像和拍照,還可以與對方進行點對點的視頻、語音和傳輸文件等操作。本系統(tǒng)運行比較的穩(wěn)定、安全可靠。此外,本軟件還對源程序進行了打包成安裝源,便于用戶使用的時候進行安裝。安裝源也分為客戶端和服務器的安裝源。一般的局域網(wǎng)用戶只需要安裝客戶端即可。需求分析近年來,隨著全球信息化進程的不斷發(fā)展,網(wǎng)絡也在飛速發(fā)展。出于高效、快速地處理各種事務的目的,越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的不斷擴大,業(yè)務量的不斷增加,企業(yè)內(nèi)部的信息越來越私密,企業(yè)只希望員工通過內(nèi)部局域網(wǎng)進行溝通與交流,避免企業(yè)內(nèi)部機密通過Internet泄露到外部。為了解決上述矛盾,人們提出了開發(fā)局域網(wǎng)聊天軟件的構想,通過局域網(wǎng)聊天軟件,企業(yè)員工可以隨時的與局域網(wǎng)內(nèi)部的用戶進行即時消息的傳遞,召開網(wǎng)絡會議,進行語音視頻和文件的傳輸?shù)?,有利于提高工作消息效率,同時又保護了企業(yè)內(nèi)部信息的安全性。本局域網(wǎng)QQ聊天軟件主要是采用MicrosoftVisualStudio2005結合SQLSever2000數(shù)據(jù)庫技術,采用C#語言來實現(xiàn)各功能模塊的開發(fā)。開發(fā)出來的軟件必須結構比較的合理、功能比較的齊全、使用起來比較的方便。該局域網(wǎng)QQ聊天軟件開發(fā)的重點和難點是客戶端和服務器端與數(shù)據(jù)庫的連接,建立連接后還要保證通信的暢通性和正確性。此外要實現(xiàn)在兩個客戶端之間實現(xiàn)點對點的文件傳輸,語音聊天以及視頻等功能,也是本局域網(wǎng)QQ聊天軟件開發(fā)的難點。止匕外,還要著重處理好各模塊間的劃分以及模塊間的連接。在開發(fā)中應注意系統(tǒng)性能的優(yōu)化,數(shù)據(jù)庫的安全和優(yōu)化,盡可能的提高系統(tǒng)的安全性和整個系統(tǒng)的運行的穩(wěn)定性。同時,開發(fā)出來的軟件系統(tǒng)還必需功能完備、安全性高、易于維護和使用,操作也要簡單、方便,界面也要簡潔、美觀、大方。網(wǎng)絡聊天已經(jīng)成為人們工作生活中傳遞信息、交流感情的重要工具。網(wǎng)絡版的聊天軟件種類繁多,如QQ、OICQ、MSN等,實現(xiàn)了隨時隨地上網(wǎng)聊天,給人們帶來了很大的方便。但是這些聊天軟件也存在以下不足:用戶必須連接Internet;用戶在工作時容易沉迷于網(wǎng)絡聊天。為了方便單位企業(yè)內(nèi)部的信息交流,減少不必要的財力和人力資源浪費,開發(fā)一個局域網(wǎng)聊天軟件是非常必要的。開發(fā)該局域網(wǎng)聊天軟件需要完成以下的幾個要求,以便于用戶進行操作。這樣才能使該軟件易學易用、更加的人性化。合理的設計數(shù)據(jù)庫盡量合理地減少數(shù)據(jù)庫數(shù)據(jù)的冗余,使重復的數(shù)據(jù)保持在最小限度,這樣將不必要的多占用存儲空間,減少產(chǎn)生混亂影響的危險,還能提高計算機的運行速度。設計出友好的界面界面的友好與否是用戶評價一個軟件優(yōu)劣的重要方面之一,使用戶有一個良好的心情。另外窗口界面的各個控件布局要合理,美觀。要充分的利用MicrosoftVisualStudio.Net2005提供的強大的功能。(3)根據(jù)局域網(wǎng)對QQ聊天軟件的要求,本QQ聊天軟件需要實現(xiàn)以下的目標:操作簡單方便、界面簡潔美觀每個客戶端只能注冊一次可以在局域網(wǎng)中實現(xiàn)文字的傳輸可以實現(xiàn)多用戶的信息通信可以實現(xiàn)兩個用戶之間的點對點的語音聊天可以實現(xiàn)兩個用戶之間的點對點的視頻聊天可以使用本地的攝像頭的進行錄像和拍照可以實現(xiàn)兩個用戶之間點對點的文件的傳輸和接收系統(tǒng)運行要比較的穩(wěn)定、安全可靠(1)可靠性高,能在由于系統(tǒng)問題或其它原因產(chǎn)生錯誤后,作出相對應處理,比如網(wǎng)絡初始化失敗、服務器未啟動等,可以提示用戶安全退出本程序,在出現(xiàn)不可知的錯誤以后,可以盡量安全的退出程序。在程序的設計過程中,要求能盡可能多的設想到用戶使用過程中可能發(fā)生的事件,并能在判斷事件后做出相應的處理,使程序具有較高的容錯性能。(2)易操作性,程序簡單易懂,容易上手使用。設計界面是,簡化界面的復雜性,模擬QQ等現(xiàn)有即時通訊工具的界面,使用戶能很容易看懂并使用。(3)模塊化設計此軟件的功能,不同的模塊實現(xiàn)不同的功能,使得軟件易于以后的維護與擴展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應用。1.3可行性分析可行性研究的目的就是要用最小的代價在盡可能短的時間內(nèi)確定問題是否能夠解決。可行性研究可以在較高的層次以比較抽象的方式討論系統(tǒng)的分析和設計。本局域網(wǎng)QQ聊天軟件的可行性研究主要從技術可行性、經(jīng)濟可行性、開發(fā)可行性和現(xiàn)有的條件四個方面來進行討論。1)技術可行性隨著國內(nèi)軟件開發(fā)的日益發(fā)展壯大,各種中小企事業(yè)單位和學校等部門已具備獨立開發(fā)各種類型的應用軟件的能力,能夠滿足不同行業(yè)的特別的需求。而本局域網(wǎng)QQ聊天軟件其在組織關系上并不存在著很大的復雜性,繁瑣性,從整個系統(tǒng)的技術構成上來看,它是屬于一個與數(shù)據(jù)庫應用有關的軟件,使用的是UDP協(xié)議。只要對C#語言比較的熟悉,對UDP協(xié)議以及Microsoft的API函數(shù)相對比較了解的話,開發(fā)出這樣的一個系統(tǒng),并不存在很大的困難。2)經(jīng)濟可行性對于整個系統(tǒng)而言,并不需要花費太多的經(jīng)費。只要一兩個人或者一個小團隊,即可以完成系統(tǒng)的開發(fā)。3)開發(fā)可行性本局域網(wǎng)QQ聊天軟件采用的是MicrosoftVisualStudio.Net2005作為開發(fā)工具,利用SQLServer2000對數(shù)據(jù)庫表進行存儲,提供數(shù)據(jù)之間的操作。首先MicrosoftVisualStudio.Net2005是一個開放的協(xié)作式系統(tǒng),可以連接許多比較常用的數(shù)據(jù)庫。其次它具有可視化的開發(fā)環(huán)境,使代碼的編寫比較的直觀,并且在可視化環(huán)境下的調(diào)試和維護也相對比較容易。再次MicrosoftVisualStudio.Net2005提供了大量的控件,這既豐富了應用程序的表達能力,也加快了項目的開發(fā)速度。4)現(xiàn)有設備及實驗條件:計算機:GenuineIntel(R)CPU2140@1.60GHz1G內(nèi)存,160G硬盤系統(tǒng):MicrosoftWindowsXPProfessional版本2002ServicePack3軟件:MicrosoftVisualStudio2005MicrosoftSQLServer2000以上的設備,對于開發(fā)出一個功能比較完備,性能比較完善的局域網(wǎng)QQ聊天軟件,已經(jīng)足夠了。系統(tǒng)總體設計相關開發(fā)技術的原理性說明Framework和C#本局域網(wǎng)QQ聊天軟件的開發(fā)采用的是CIS結構,基于.NET開發(fā)環(huán)境下,使用C#語言進行開發(fā)。C#是一種精確、簡單、類型安全、面向?qū)ο蟮恼Z言,是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\行于.NETFramework之上的高級程序設計語言。并定于在微軟職業(yè)開發(fā)者論壇(PDC)上登臺亮相.C#是微軟公司研究員AnderSHejlSberg的最新成果.C#看起來與java有著驚人的相似;它包括了諸如單一繼承,接口,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NETwindows網(wǎng)絡框架的主角。C#的特點:(1)完全面向?qū)ο?。?)支持分布式,處理過程可以分布在客戶機和服務器上。C#能很好的解決分布式問題。(3)跟Java類似,C#代碼經(jīng)過編譯后,成為了一種IL(中間語言)。在運行時,再把IL編譯為平臺專用的代碼。(4)健壯,C#在檢查程序錯誤和編譯與運行時錯誤一點也不遜于Java,C#也用了自動管理內(nèi)存機制。(5)C#不像Java那樣完全摒棄了指針和手動內(nèi)存管理。C#默認情況下是不能使用指針的,程序員在有必要時可以打開指針來使用。這樣可以保證編程的靈活性。(6)安全性:C#的安全性是有.net平臺來提供的。C#代碼編譯后成為IL語言。是一種受控代碼,.net提供類型安全檢查等機制保證代碼是安全的。(7)可移植性:由于C#使用類似Java的中間語言機制。使得C#也跟Java類似,可以很方便的移植到其他系統(tǒng)。在運行時,再把中間代碼編譯為適合特定機器的代碼。(8)解釋性:C#也是一種特殊的解釋性語言。(9)高性能:C#把代碼編譯成中間語言后,可以高效的執(zhí)行程序。(10)多線程:與Java類似,可以由一個主進程分出多個執(zhí)行小任務的多線程。(11)組件模式:C#很適合組件開發(fā)。各個組件可以由其他語言實現(xiàn)的,然后集成?.net中。.NETFramework類似于Java虛擬機,它不但使Internet上運行的應用程序更容易被開發(fā),而且也可用于開發(fā)運行于Windows桌面上的傳統(tǒng)業(yè)務應用程序。它為創(chuàng)建、部署以及管理安全、強大、高效的應用程序提供了前所未有的最大支持。.NETFramework是一個創(chuàng)建、部署和運行應用程序的多語言平臺環(huán)境,.NET支持的語言使用的基類庫由.NETFramework類庫(FCL)提供。C#是Microsoft公司設計的一種編程語言。它松散地基于C/C++,并且有很多方面和Java類似。Microsoft是這樣描述C#的:C#是從C和C++派生來的一種簡單、現(xiàn)代、面向?qū)ο蠛皖愋桶踩木幊陶Z言。C#主要是從C/C++編程語言家族移植過來的,C和C++的程序員會馬上熟悉它。Server2005SQLServer數(shù)據(jù)平臺SQLServer是一個全面的、集成的、端到端的數(shù)據(jù)解決方案,它為企業(yè)中的用戶提供了一個安全、可靠和高效的平臺用于企業(yè)數(shù)據(jù)管理和商業(yè)智能應用。SQLServer2005為IT專家和信息共作者帶來了強大的、熟悉的工具,同時減少了在從移動設備到企業(yè)數(shù)據(jù)系統(tǒng)的多平臺上創(chuàng)建、部署、管理及使用企業(yè)數(shù)據(jù)和分析應用程序的復雜度。通過全面的功能集、和現(xiàn)有系統(tǒng)的集成性、以及對日常任務的自動化管理能力,SQLServer2005為不同規(guī)模的企業(yè)提供了一個完整的數(shù)據(jù)解決方案。本局域網(wǎng)QQ聊天軟件使用的是UDP協(xié)議。用戶數(shù)據(jù)報協(xié)議(USerDatagramProtocol)是OSI參考模型中一種無連接的傳輸層協(xié)議,提供面向事務的簡單不可靠信息傳送服務。是一個簡單的面向數(shù)據(jù)報的傳輸層協(xié)議,IETFRFC768是UDP的正式規(guī)范。UDP協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口。UDP協(xié)議適用端口分別運行在同一臺設備上的多個應用程序。與TCP不同,UDP并不提供對IP協(xié)議的可靠機制、流控制以及錯誤恢復功能等。由于UDP比較簡單,UDP頭包含很少的字節(jié),比TCP負載消耗少。UDP適用于不需要TCP可靠機制的情形,比如,當高層協(xié)議或應用程序提供錯誤和流控制功能的時候。UDP是傳輸層協(xié)議,服務于很多知名應用層協(xié)議,包括網(wǎng)絡文件系統(tǒng)(NFS)、簡單網(wǎng)絡管理協(xié)議(SNMP)、域名系統(tǒng)(DNS)以及簡單文件傳輸系統(tǒng)(TFTP)、動態(tài)主機配置協(xié)議(DHCP)、路由信息協(xié)議(RIP)和某些影音串流服務等等。選定WindowsXP平臺開發(fā)網(wǎng)絡通信程序,可以選擇Windows的Sockets編程接口,WindowsSockets是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡編程接口。現(xiàn)在的Winsock已經(jīng)基本上實現(xiàn)了與協(xié)議無關,可以使用Winsock來調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Windowssockets無疑是進行網(wǎng)絡編程的利器。所有的WindowsSockets實現(xiàn)都支持流套接口和數(shù)據(jù)報套接口。應用程序調(diào)用WindowsSockets的API實現(xiàn)相互之間的通訊。WindowsSockets又利用下層的網(wǎng)絡通訊協(xié)議功能和操作系統(tǒng)調(diào)用實現(xiàn)實際的通訊工作。SOCket,簡稱套接字,用于實現(xiàn)網(wǎng)絡上客戶和服務器之間的連接。也就是說網(wǎng)絡上兩個或兩個以上雙工方式通信的進程之間總有一個連接,這個連接的端點成為套接字,套接字是在比較低的層次上通信的。具體的說:一個服務器應用程序一般偵聽一個特定的端口等待客戶端的連接請求,當一個連接請求到達時,客戶端和服武器端建立一個通信連接,在連接過程中,客戶端被分配一個本地端口與一個Socket建立連接,客戶端通過寫Socket來通知服務器,以讀取Socket中的信息,類似的服務器也獲得一個本地端口,它需要一個新的端口號來偵聽原始端口上的其他連接請求。服務器也通過它的本地端口連接一個Socket,通過讀寫和客戶端通信。一般的Socket網(wǎng)絡編程的函數(shù)調(diào)用步驟如下:(1)創(chuàng)建套接字應用程序在使用套接字前,首先必須創(chuàng)建一個套接字,以便系統(tǒng)分配相應的資源給它。(2)指定本地地址當一個套接字被創(chuàng)建后,存在一個名字空間(地址族),但它沒有被命名。需要將套接字地址(包括本地主機地址和本地端口地址)與所創(chuàng)建的套接字號聯(lián)系起來,即將名字賦予套接字,以指定本地相關。(3)建立套接字連接即開啟監(jiān)聽功能。監(jiān)聽遠程客戶端的請求。(4)數(shù)據(jù)傳輸當一個連接建立以后,就可以進行數(shù)據(jù)傳輸了。分為數(shù)據(jù)的發(fā)送和接收。(5)關閉套接字連接也就是關閉監(jiān)聽,并釋放分配給該套接字的資源。系統(tǒng)功能結構根據(jù)局域網(wǎng)QQ聊天軟件的特點,可以將其分為客戶端和服務器端兩個部分進行設計。客戶端主要用于用戶的注冊、登陸和信息的發(fā)送、語音、視頻和文件的傳輸?shù)龋环掌鞫酥饕糜谟涗浻脩糇缘挠脩裘?、密碼、IP地址、端口號以及用戶在線的狀態(tài)等信息,并作為客戶端向遠程客戶端發(fā)送信息的一個中轉站。UDP局域網(wǎng)聊天程序客戶端與服務器端的功能結構圖如圖2-1所示:UTlP局域隨F天程序Q客戶端÷l服務器端服務器銜體圖2-1局域網(wǎng)QQ聊天程序功能結構圖業(yè)務流程圖UDP局域網(wǎng)聊天程序是由客戶端和服務器端組合而成的,業(yè)務流程圖如圖2-2所示。客戶端登陸的時候,先判斷用戶是否已經(jīng)進行過了注冊。如果用戶已經(jīng)注冊后,則直接進入到登陸窗口。如果用戶沒有注冊過,則跳轉到注冊窗口,讓用戶先進行注冊。用戶注冊需要填寫服務器IP地址、端口號、用戶名和密碼等信息。注冊完成后,客戶端與遠程服務器取得通信,將注冊的信息發(fā)送到遠程的服務器端進行注冊保存。客戶端在本地將生成一個Server.ini文件,該文件主要是記錄服務器的IP地址和端口號以及注冊用戶的用戶名。當用戶下一次登陸的時候就是通過讀取Server.ini文件,來取得服務器的IP地址和端口號,然后再根據(jù)該IP地址和端口號與服務器建立通信。注冊完成后,然后就會跳轉到登陸窗口。用戶只要輸入正確的用戶名和密碼,就可以登陸成功。就可以與服務器端建立通信。登陸之后,就進入到了QQ界面。雙擊某一個在線的用戶,就可以與該用戶進行聊天、語音、視頻和文本的傳輸。圖2-2局域網(wǎng)QQ聊天軟件業(yè)務流程圖程序運行環(huán)境本局域網(wǎng)QQ聊天軟件運行的環(huán)境具體如下:(1)系統(tǒng)開發(fā)平臺:MicrosoftVisualStudio2005(2)系統(tǒng)開發(fā)語言:C#(3)數(shù)據(jù)庫管理系統(tǒng)軟件:MicrosoftSQLServer2000(4)運行平臺:WindowsXP(5)運行環(huán)境:MiCroSoft.NETFrameworkSDKv2.0數(shù)據(jù)庫以及類庫的詳細設計與實現(xiàn)數(shù)據(jù)庫的創(chuàng)建在開發(fā)應用程序時,對數(shù)據(jù)庫的操作是必不可少的,數(shù)據(jù)庫設計是根據(jù)程序的需求及其實現(xiàn)功能所制定的。本局域網(wǎng)QQ聊天軟件后臺數(shù)據(jù)庫主要是用于記錄注冊人員的編號、用戶名、密碼、IP地址、端口號和在線和離線的狀態(tài)等信息。使用MicrosoftSQLServer2000作為后臺數(shù)據(jù)庫。數(shù)據(jù)庫命名為db_MyQQData,其中包含了一張數(shù)據(jù)表db_CurrencyUser,用于存儲當前已注冊的用戶的基本信息。數(shù)據(jù)庫db_MyQQData的具體創(chuàng)建步驟如下:(1)選擇“開始/所有程序/MicrosoftSQLServer/企業(yè)管理器”命令,打開SQLServerEnterpriseManager數(shù)據(jù)庫窗體。(2)在SQLServerEnterpriseManager數(shù)據(jù)庫窗體的(local)(WindowsNT)中,用鼠標右鍵單擊“數(shù)據(jù)庫”文件,在彈出的快捷菜單中選擇“新建數(shù)據(jù)庫”命令,打開“數(shù)據(jù)庫屬性”對話框,在該對話框的“名稱”文本框中輸入要創(chuàng)建的數(shù)據(jù)庫名稱“db_MyQQData”,單擊“確定”按鈕創(chuàng)建數(shù)據(jù)庫。在QQ用戶登陸時,為了可以在服務器端返回所有注冊用戶的信息,可以在服務器端的數(shù)據(jù)庫中創(chuàng)建一個用戶注冊表,用于記錄注冊用戶的IP地址、端口號、在線狀態(tài)、用戶名和密碼等基本信息。用戶注冊表的實體E-R圖如圖3-1所示。圖3-1用戶注冊表的實體E-R圖根據(jù)上面設計好的E-R圖,可以在數(shù)據(jù)庫中創(chuàng)建相應的數(shù)據(jù)表,此外根據(jù)注冊用戶的實體E-R圖來創(chuàng)建數(shù)據(jù)表。數(shù)據(jù)庫創(chuàng)建完成后,在db_MyQQData數(shù)據(jù)庫的下拉節(jié)點的“表”節(jié)點上單擊鼠標右鍵,在彈出的快捷菜單中選擇“新建表”命令,將在SQLServerEnterpriseManager數(shù)據(jù)庫窗體中彈出“新表”對話框。在“新表”對話框的“列名”中輸入ID、IP、Port、Name、PaSSWord和Sign字段,將其數(shù)據(jù)類型分別設置為int、VarChar(20)、int、VarChar(20)、VarChar(20)和int,并將ID字段設為主鍵和自動編號,然后在各“列”的“描述”文本框中對應字段進行中文解釋。字段名稱和數(shù)據(jù)類型設置完成后,單擊保存按鈕,彈出“選擇名稱”窗口,在該窗口中輸入創(chuàng)建數(shù)據(jù)表的名稱db_CurrencyUser,單擊“確定”按鈕,就完成了對本局域網(wǎng)QQ聊天軟件后臺數(shù)據(jù)庫的創(chuàng)建。在本系統(tǒng)中創(chuàng)建了五個解決方案和一個類庫,分別是客戶端解決方案、表情方案、語音和文件傳輸方案以及服務器端解決方案,還有一個名為QQClass的類庫。為了便于對它們進行操作,將客戶端解決方案和類庫添加到了服務器端解的決方案中。文件夾組織結構圖如圖3-2所示。MyQQClient解決方案主要是用于客戶端各個窗口的開發(fā),MyQQServer解決方案主要是用于服務器端后臺的用戶信息管理平臺界面的開發(fā),QQClaSS類庫主要是對UDP協(xié)議進行封裝,還有定義其他一些類。ImageListPopupDemo解決方案主要是用于實現(xiàn)QQ表情的發(fā)送的,MatureVoice解決方案主要是用于實現(xiàn)語音的,UdpSendFile解決方案主要是用于實現(xiàn)文件的傳輸功能的。圖3-2文件夾組織結構圖類庫的設計在本局域網(wǎng)QQ聊天軟件中,因為在后臺服務器端的用戶信息管理平臺以及前臺的客戶端的注冊窗口、登錄窗口、QQ界面窗口以及聊天窗口都需要用到UDP協(xié)議。所以本程序中,將UDP協(xié)議封裝成了一個控件,主要是為了便于客戶端和服務器端的調(diào)用,并且將UDP控件和自定義類存儲在了QQClass類庫中。當需要使用到UDP協(xié)議的時候,只需要在相應的窗口中加入UDPSocket控件,然后設置UDPSocket控件的相關的屬性即可。下面對QQClass類庫中的UDPSocket控件和其他的類分別進行說明。(1)UDPSocket控件該控件主要是將UDP協(xié)議中的IP地址和端口號以及開啟或者關閉的狀態(tài)以控件的形式進行設置,并自定義一個了DataArrival事件,用于對主機的端口號進行監(jiān)聽,以獲取遠程計算機發(fā)送過來的消息。在自定義控件上制作了localHost、localPort、active屬性,以及DataArrival事件。IocalHost用于設置服務器端的IP地址;IocalPort屬性用于設置端口號;active屬性是一個Bool型,可以控制端口號是否處于監(jiān)聽狀態(tài)。UDPSOCket控件中包含了方法OPenSOCket和ClOSeSOCketO方法分別用于打開和關閉UDP協(xié)議端口的監(jiān)聽功能,并在監(jiān)聽關閉的同時關閉用于接收信息的子線程。Listener()方法用于實現(xiàn)主機端口號的監(jiān)聽功能,主要是將IP地址和端口號以網(wǎng)絡端點進行存儲,然后創(chuàng)建一個新的端口號,再設置接收緩沖區(qū)和發(fā)送緩沖區(qū)的大小。此外,還創(chuàng)建了一個線程,主要是用于獲取當前接收到的信息,就是將獲取的遠程信息轉換成二進制流。在線程打開時,將GetUDPData()方法所接收的信息傳遞給線程的委托。GetUDPData()方法是在獲取遠程消息時,將消息轉發(fā)給UDPSOCket控件的DataArrival事件,可以通過該事件將消息發(fā)送給遠程客戶端。Send()方法用于將主機獲取的消息,通過IP地址和端口號發(fā)送給遠程客戶端。通過以上的方法,便制作完成了一個UDPSocket控件。如圖3-3所示:圖3-3UDP控件屬性圖(2)PubleC_Class類該類用于記錄服務器端和客戶端的基本信息,并通過自定義的方法MyHostIP()獲取服務器端的所有IP地址,通過自定義方法Get_Windows()獲取Windows目錄。(3)ClassForms類該類將獲取的的窗體在InnerList列表中進行添加和移除操作,在列表中查找相應的窗體。(4)ClassMsg類該類主要是用枚舉型的元素指定消息發(fā)送的命令、消息類型、消息發(fā)送的狀態(tài)等。其中,發(fā)送的消息命令包括了用戶的注冊、用戶注冊結束、用戶登錄、用戶登錄結束上線、用戶列表、打開視頻、關閉視頻、下線等命令;發(fā)送的消息類型包括了無類型、發(fā)送命令、發(fā)送消息、發(fā)送文件等。此外,該類還用來記錄發(fā)送方和接收方的發(fā)送編號、IP地址以及端口號等信息,還記錄了用戶注冊的用戶名和密碼等信息。(5)ClassOPtionData類該類將服務器端對數(shù)據(jù)庫的操作進行了封裝,通過對該類中各方法的調(diào)用,可以對數(shù)據(jù)表進行添加、修改及讀取的操作。下面對各方法進行一下簡要的說明。①EXSQL()方法該方法通過ConStr參數(shù)所傳遞的SQL語句,對指定的數(shù)據(jù)表進行查詢,并將記錄的個數(shù)進行返回。②ExSQLReDr()方法該方法通過ConStr參數(shù)所傳遞的SQL語句,對指定數(shù)據(jù)進行查詢,并將查找到的數(shù)據(jù)信息以SqlDataReader對象進行返回。(6)ClassSerializers類SerializeBinary()方法該方法是在客戶端發(fā)送信息時,將發(fā)送的對象序列化為二進制流,并返回序列化的二進制流,因為Socket只能以二進制流的形式進行傳輸。DeSerialiZeBinary()方法該方法是在客戶端接收信息時,將二進制流反序列化為對象,并返回反序列化后的對象,這樣,便于在指定的控件上顯示接收的信息。(7)ClaSSUSerInfo類該類用于記錄當前QQ用戶的編號、IP地址、端口號、用戶名稱和用戶狀態(tài)。(8)ClaSSUSerS類該類主要是將服務器端所有注冊的用戶信息存儲到base類的InnerLiSt列表中。這樣,當用戶注冊或登陸時,可以將該列表中的信息發(fā)給當前在線的所有用戶,以改變QQ窗體的顯示情況。(9)Video類該類主要是一個API的視頻類。主要是通過調(diào)用API的視頻類的函數(shù),來打開攝像頭,進行數(shù)據(jù)的讀取。打開攝像頭之后,還可以在本地進行拍照以及錄像等功能。4客戶端模塊的詳細設計及實現(xiàn)客戶端注冊模塊的設計注冊模塊主要是在客戶端用戶第一次使用UDP局域網(wǎng)聊天程序的時候,對當前用戶進行注冊,并將注冊的信息發(fā)送給服務器端進行記錄。當注冊成功后,就將返回的服務器端的ID、端口號和姓名等信息寫入名為Server.ini文件中,保存在本地的系統(tǒng)目錄中。主要是為了方便下次登錄的時候判斷用戶是否進行了注冊。如果用戶注冊了,在登錄的時候就讀取本地的Server.ini文件,獲得服務器端的ip地址和端口號。客戶端就可以根據(jù)獲得的服務器端的IP地址和端口號,與服務器建立通信。客戶端通過服務器端的驗證后即可登錄成功。注冊窗體運行結果如圖4-1所示。圖4-1客戶端注冊窗體在注冊模塊中應用了INI文件,以及獲取Windows路徑的技術,它們都是利用API函數(shù)實現(xiàn)的,所以應在命名空間中添加uSing(1)INI文件①創(chuàng)建INI文件創(chuàng)建INI文件主要應用了API函數(shù)WritePrivateProfileStringO,在應用API函數(shù)前,首先要對其進行聲明。②讀取INI文件讀取INI文件主要應用了API函數(shù)Getprivateprofilestring(),在應用API函數(shù)前,首先要對其進行聲明。(2)獲取Windows路徑獲取Windows路徑應用了API函數(shù)的GetWindoWSDireCtory(),在應用API函數(shù)前,首先要對其進行聲明。(1)、新建一個Windows窗體,命名為F_SerSetup.cs,主要用于實現(xiàn)用戶的注冊功能,該窗體主要用到了TeXtBoX和UDPSoCketI控件。(2)、在輸入完服務器的IP地址和注冊用戶的用戶名和密碼等注冊信息后,確保兩次輸入的密碼要一致,然后單擊“確定”按鈕,將通過自定義控件UdPSoCketI的Send()方法,將注冊信息以二進制流的形式發(fā)送給服務器端進行注冊。注冊成功后,服務器端將返回一個消息,告訴客戶端已經(jīng)注冊成功,然后就可以進入到登陸窗口。(3)、在自定義控件的DataArrival事件中,利用托管調(diào)用DataArrival事件,并在該控件的線程上,用指定的參數(shù)對其進行異步托管。(4)、托管對DataArrival事件進行異步執(zhí)行,用于獲取服務器端所返回的消息,當返回的是注冊成功消息時,創(chuàng)建一個INI文件,并寫入服務器的IP地址、端口號和用戶名稱,關閉注冊窗體。將INI文件保存在本地的系統(tǒng)目錄下。用戶在下一次登陸的時候,是要讀取該INI文件,取得服務器的IP地址和端口號,然后就可以向服務器發(fā)送登陸請求。獲得服務器的驗證通過后,就可以成功的登陸了??蛻舳说顷懩K設計登陸模塊主要是將用戶名和密碼發(fā)送到服務器端進行驗證,當服務器端有該用戶時,將返回一個登陸成功的消息,通過該消息,將關閉登陸窗體,進入QQ窗體。登陸窗體運行結果如圖4-2所示。圖4-2客戶端登陸窗體在UDP協(xié)議的監(jiān)聽事件中通過開啟一個線程,來實現(xiàn)局域網(wǎng)信息的發(fā)送和接收。要想創(chuàng)建一個子線程,需要實例化一個Thread類型的對象。子線程創(chuàng)建完后,可以使用線程的StartO方法開啟當前線程。當子線程使用完之后,可以使用Thread對象的Sleep(0)方法將主線程睡眠,然后調(diào)用線程的trd.Abort()方法終止當前線程。(1)新建一個Windows窗體,命名為F_Logon.cs,將窗體的FormBorderStyle屬性設為None,去掉窗口的邊框,使窗口看起來更加的美觀大方。該窗體主要實現(xiàn)客戶端的登陸功能。該窗體用到的主要控件有PictureBox和TextBox,分別用于顯示登陸窗體的背景和輸入登陸用戶的密碼。(2)在登陸窗體加載時,首先在Windows目錄中查找S文件,當該文件不存在時,調(diào)用注冊窗體;否則,在INI文件中讀取服務器的IP地址和端口號。(3)單擊窗體的“登陸”按鈕,該按鈕通過窗體加載所獲取的服務器IP和端口號,將用戶名和密碼以二進制流的形式發(fā)送給服務器端。再根據(jù)該IP地址和端口號與服務器建立通信,把用戶的用戶名和密碼發(fā)送給服務器進行驗證。驗證通過后,用戶就可以進行登錄了。(4)在自定義控件UDPSoCketI的DataArrival事件中,利用托管調(diào)用DataArrival事件,并在該控件的線程上,用指定的參數(shù)對其進行異步托管。(5)托管對DataArrival事件進行異步執(zhí)行,用于獲取服務器端所返回的消息,當返回的是登陸成功消息時,存儲服務器端返回的ID值,關閉登陸窗體,進入客戶端QQ窗體。如果驗證不通過,就不能進行登錄??蛻舳薗Q模塊設計QQ模塊主要顯示當前已注冊的所有用戶的名稱,并根據(jù)用戶的在線情況,設置用戶名稱前的圖標樣式。QQ窗體運行結果如圖4-3所示。圖4-3客戶端QQ窗體在本窗體中使用InnerLiSt列表記錄當前已注冊用戶的信息,并將InnerLiSt列表中的信息添加到treeview1控件中。treeviewI控件上同級節(jié)點的連接線已經(jīng)去掉,這樣使各個圖標看起來更加的美觀。InnerList用于存儲項目的ArrayList對象,它是CollectionBase對象中的一個屬性,可以通過該屬性的Add()和Remove()方法向列表中添加和移除元素。具有在線和離線的功能。當用戶在線時,就設置亮度的圖標,當用戶離線時,就設置成灰色的圖標。當點擊離線時,UDP協(xié)議將關閉監(jiān)聽。顯示的所有的用戶都是離線的狀態(tài)。此時,不能給其他用戶發(fā)送消息。此外,還具有系統(tǒng)托盤圖標的功能,當最小化程序時,程序?qū)⒖s小為右下角的系統(tǒng)圖標。系統(tǒng)托盤圖標上還具有右鍵菜單的功能。另外,當該QQ窗體移動到屏幕頂端時,還可以實現(xiàn)自動隱藏的功能。(1)新建一個Windows應用程序,將默認創(chuàng)建的Windows窗體命名為F_Clinent.cs,將窗體的FormBorderStyle屬性設為FixeDialog,主要用于實現(xiàn)系統(tǒng)的登陸功能。該窗體用到的主要控件有PictureBox和Treeview,主要功能是用于顯示QQ窗體的背景圖片和將控件的邊框設為無。還用到了ComboBox1控件,該控件主要是用于設置用戶的上線和離線狀態(tài)。(2)在QQ窗體加載時,首先要調(diào)用登陸窗體,當?shù)顷懘绑w驗證成功后,發(fā)送消息給服務器端,返回所有注冊的用戶信息。然后再根據(jù)用戶的在線和離線狀態(tài),在Treeview上設置用戶的圖標。(3)自定義方法GetUserList(),通過udpSocket1的控件的Send()方法將消息發(fā)送到服務器端,用于獲取服務器端已注冊的用戶消息。(4)利用UdPSoCketI控件的DataArrival事件,對服務器端發(fā)送的消息進行監(jiān)聽,以實現(xiàn)客戶端與遠程客戶端的通信功能。當監(jiān)聽到有遠程客戶端發(fā)送消息過來時,就自動在treeView1控件中遍歷節(jié)點查找消息接收對應的節(jié)點,然后就自動打開該聊天窗體,將接收到的信息顯示在該窗體上。(5)GetUserList()方法用于遍歷服務器端的所有用戶,根據(jù)用戶的當前狀態(tài),以圖片的形式在Treeview控件中顯示用戶的在線狀態(tài)。(6)GetMsg()方法用于獲取客戶端所發(fā)送的消息,根據(jù)信息容量的大小,以不同的接收方式存儲信息,并在接收信息后,遍歷窗體列表,當窗體列表中有相應的接收窗體時,將信息添加到窗體的顯示控件中;否則,重新調(diào)用消息發(fā)送窗體,將接收信息顯示在該窗體的顯示控件上。(7)自動隱藏的功能主要是使用的timer控件來實現(xiàn)的。就是每毫秒執(zhí)行一次,獲取鼠標在屏幕的坐標點,當鼠標在當前窗體內(nèi),并且窗體的TOP屬性小于0時,就設置窗體的TOP屬性值為0;當窗體的上邊框與屏幕的頂端的距離小于5時,就將QQ窗體隱藏到屏幕的頂端。當窗體隱藏之后,將鼠標移動到窗體內(nèi)的時候,窗體就立刻顯示出來。關鍵的代碼如下;privatevoidtimer1_Tick(objectsender,EventArgse){pp=newPoint(Cursor.Position.X,;//獲取鼠標在屏幕的坐標點RectangleRects=newRectangle(this.Left,this.Top,this.Left+this.Width,this.Top+this.Height);〃存儲當前窗體在屏幕的所在區(qū)域if((this.Top<0)&&Win32API.PtInRect(refRects,pp))〃當鼠標在當前窗體內(nèi),并且窗體的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)系統(tǒng)托盤圖標主要是使用notifyIcon控件來實現(xiàn)的。托盤圖標的右鍵菜單使用的是COnteXtMenuStriP控件。右鍵菜單具有上線、離線和退出等功能。上線是通過開啟UPD控件的監(jiān)聽功能,然后讀取數(shù)據(jù)庫的用戶信息,將在線和不在線的用戶信息顯示到treeview1控件上。離線是通過關閉UPD控件的監(jiān)聽功能,停止服務。然后將所有的用戶設置成離線的狀態(tài)。此時,用戶不能與其他用戶進行通信,只有再次上線,才能與其他用戶進行通信。(9)QQ窗體上ComboBoX1上的的上線和離線功能主要也是通過開啟或者關閉UDPSocket控件來實現(xiàn)的。當為離線時,就是關閉UDPSocket控件,并把所有的用戶圖標都設置為灰色即可。(10)當在用戶頭像上雙擊某一個在線用戶的圖標時,即可打開該用戶的聊天窗口。然后在文本框輸入文本信息發(fā)送,就可以與該用戶進行文本信息的聊天。點擊該窗口上的語音、視頻和文件傳輸?shù)陌粹o,還可以與該用戶進行點對點的語音、視頻和文件傳輸??蛻舳讼l(fā)送模塊設計消息發(fā)送模塊主要用于實現(xiàn)客戶端與遠程客戶端的消息通信。不但具有具有文本聊天的功能,還具有點對點的語音、視頻和文件傳輸?shù)裙δ埽送?,還可以利用本地的攝像頭就行錄像和拍照,還可以進行字體的設置,QQ表情的發(fā)送以及圖片的發(fā)送等功能。消息發(fā)送窗體運行結果如圖4-4所示。圖4-4客戶端聊天窗體(1)在用Socket發(fā)送消息時,只能以二進制流的形式進行發(fā)送,并且Socket發(fā)送的內(nèi)存流不能大于1024個字節(jié)。當發(fā)送的消息大于1024個字節(jié)時,就需要對信息進行分流發(fā)送。QQ表情以及圖片的發(fā)送也是把它們放在發(fā)送框里面,經(jīng)過序列化成二進制流的消息,當做信息來發(fā)送。對方接收到后,再將消息反序列化成對象,再在接收框上面顯示出來就可以了。(2)視頻功能的實現(xiàn),主要是使用API函數(shù),通過讀取攝像頭的數(shù)據(jù),取得照片,然后保存在本地系統(tǒng)目錄中,然后再讀取已保存的照片,將照片發(fā)送給遠程的客戶端進行顯示。遠程的客戶端主要是將接收到的照片也保存在本地目錄中,然后再讀取保存的照片顯示在上方的PiCtureBoX中,就實現(xiàn)了視頻的功能。(3)語音的實現(xiàn),主要是使用微軟提供的的DirectXAPI中的DireCtSound來實現(xiàn)。先是通過耳機采集到語音,然后再將語音傳輸出去,客戶端接收到語音后,就將語音進行播放。(4)文件傳輸?shù)膶崿F(xiàn),跟文本信息的發(fā)送有點類似。也是要以文件流的形式進行傳輸。傳輸前,先將要傳輸?shù)奈募蛄谢啥M制流的形式,然后再進行傳輸。當文件比較大時,就要進行分塊傳輸。(1)新建一個Windows窗體,命名為F_Chat.cs,用于顯示用戶發(fā)送或接收的信息。該窗體主要用到了PiCtureBox、RichTextBox>UDPSoCket、Timer、toolStrip、Button等控件。PictureBox主要是用于進行視頻通信顯示雙方的視頻。上方的PictureBox顯示的是對方的視頻,下方的PictureBox顯示的是自己的視頻。Timer控件主要是用于視頻信息的發(fā)送。RichTextBox控件主要是用于顯示接收的和發(fā)送的文本信息。toolStrip控件主要是作為語音、視頻和文件傳輸?shù)陌粹o使用。UDPSocket控件主要用于消息的發(fā)送和接收,利用udpSocket1控件的DataArrival事件,對遠程客戶端所發(fā)送的消息進行監(jiān)聽,以便執(zhí)行相應的操作。(2)單擊消息發(fā)送窗體中的“發(fā)送”按鈕,先是將文本信息轉換成二進制流的形式,然后根據(jù)rich_Input文本框中的信息大小,以不同方式,將文本信息以二進制流的形式進行發(fā)送。當信息小于1024字節(jié)時,可以直接進行發(fā)送。當信息大于1024個字節(jié)時,就要將信息先進行拆分,以分塊的形式進行發(fā)送。當信息發(fā)送結束后,再向遠程客戶端發(fā)送一個消息,通知對方消息已經(jīng)發(fā)送完畢。然后再將發(fā)送出去的消息顯示在當前窗體的RichTextBox顯示文本框中。(3)“視頻”按鈕主要的實現(xiàn)過程是,首先打開視頻設備,設置攝像頭的一些基本參數(shù),然后將設置的基本信息發(fā)送給遠程的客戶端,請求遠程客戶端進行視頻連接。然后啟動timer1控件。該控件就是將從攝像頭拍到的保存在本地系統(tǒng)目錄中的照片,以每秒的速度發(fā)送給遠程的客戶端。遠程客戶端默認是將圖片保存在C盤根目錄下。當照片大于1024個字節(jié)時,就將照片進行分塊發(fā)送。因為在進行視頻通信時,是要將照片連續(xù)不斷的發(fā)送出去,遠程客戶端接收到照片后,再不斷的在PiCtureBoX中更新照片,然后才會達到“視頻”的效果。因此發(fā)送的照片的數(shù)據(jù)量相對的比較大,所以為了減少網(wǎng)絡的擁堵,減少發(fā)送的數(shù)據(jù)量。對發(fā)送出去的照片進行了壓縮之后,再發(fā)送出去是很有必要的。在本程序中,API函數(shù)從攝像頭拍照到的照片是位圖的格式。原始的大小是90K左右。圖片沒壓縮之前,每次都要發(fā)送90k左右的數(shù)據(jù)量,所以相對來說,要發(fā)送的數(shù)據(jù)量是比較大的。這樣就給傳輸造成了一定的擁堵。所以對方看到的“視頻”就會顯得比較的“卡”,并不是那么的流暢。對方看到的視頻,就像是在放幻燈片一樣,感覺好像是將圖片一張一張的貼上去的一樣,一卡一卡的。所以,將圖片進行壓縮,減少數(shù)據(jù)的傳輸量是非常有必要的。所以,在發(fā)送圖片之前,要先對圖片進行了壓縮處理。然后再將處理后的圖片發(fā)送出去。經(jīng)過圖片壓縮算法壓縮后,圖片的大小由原來的90K的,變成了現(xiàn)在的14K左右。圖片的格式由原來的位圖格式,變成了JPG的格式。雖然圖片的格式改變了,但是對于傳輸并沒有造成影響。反而因為壓縮的質(zhì)量非常好,這樣只需要將JPG格式的圖片發(fā)送給遠程的客戶端就可以了?,F(xiàn)在每次只需要發(fā)送14K左右的數(shù)據(jù)量就可以了,相比原來的90K的數(shù)據(jù)量,數(shù)據(jù)量小了很多。這樣就大大的減少了發(fā)送的信息量。這樣,相比于原來沒有經(jīng)過壓縮處理的圖片來說,視頻就不會顯得那么的卡了。(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)使用本地的攝像頭進行拍照也相對的比較簡單,只要調(diào)用API函數(shù)即可實現(xiàn)。拍攝的照片是默認的保存在本地的C盤根目錄下。關鍵代碼如下:///<summary>///拍照///</summary>〃/ <param 要保存bmp文件的路徑<∕param>publicvoidGrabImage(IntPtrhWndC,stringpath){IntPtrhBmp=Marshal.StringToHGlobalAnsi(path);VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_SAVEDIB,0,hBmp.ToInt32());}(6)語音的實現(xiàn),主要有以下的幾個步驟:①語音采集采集的作用就是從麥克風中獲取數(shù)據(jù),這里采用的是DireCtSound類來實現(xiàn)這個技術。DirectSound是微軟提供的的DirectXAPI的一部分。它能以極低的時延播放聲音,使應用程序可以高度利用資源。所謂的錄音,就是將采集自麥克風的模擬信號轉換成數(shù)字信號(ADC),一般麥克風只提供模擬信號。一般聲卡采集到的數(shù)據(jù)會被存放到緩存區(qū)后進行處理,如果是集成聲卡,那就是先把數(shù)據(jù)放在內(nèi)存中后再處理。WAVE格式WAVE是錄音時用的標準的WINDOWS文件格式,擴展名為“WAV”,使用DirectSound采集的WAV聲音,其音頻數(shù)據(jù)是按照PCM(脈沖編碼調(diào)制,對連續(xù)變化的模擬信號進行抽樣、量化和編碼產(chǎn)生的數(shù)據(jù),0和1的組合)調(diào)制后放入緩沖區(qū)的。WAVE文件格式采用RIFF文件格式結構,對PCM數(shù)據(jù)和其它一些音頻信息進行相應的編排,從而最終形成的WAVE文件才能被音頻播放器識別,才能進行播放。緩沖區(qū)指針緩沖區(qū)是存放音頻數(shù)據(jù)的地方,并且它還提供了兩個指針:讀指針和捕捉指針。它們的位置按照相對于緩沖區(qū)起始位置的偏移量計算。讀指針位于當前已經(jīng)被完全捕捉到緩沖區(qū)的數(shù)據(jù)末尾。捕捉指針位于當前將要從硬件中復制的數(shù)據(jù)塊的末尾。如果想從緩沖區(qū)中讀取數(shù)據(jù),則只能從已經(jīng)完全寫入緩沖區(qū)的數(shù)據(jù)中讀取,也就是說只能從偏移量小于讀指針的地方讀取。緩沖區(qū)通知大家應該都知道時間相同的音頻文件,WAVE文件會比其它格式的音頻文件大得多,這是因為WAVE文件沒有對數(shù)據(jù)進行壓縮。如果錄音的時候,不限制緩沖區(qū)大小,那么錄制很短的時間可能就會占用很多內(nèi)存,說不定不過多久,1G內(nèi)存就不夠用了。因此必須對緩沖區(qū)的大小進行限制,而且當緩沖區(qū)滿了之后,還可以重新從緩沖區(qū)起始處開始,用新的數(shù)據(jù)覆蓋舊的數(shù)據(jù)。那舊的數(shù)據(jù)怎么辦呢?如果不想丟失舊的數(shù)據(jù),那就得在舊的數(shù)據(jù)被覆蓋之前,將它轉移到其它地方。如何才能在舊的數(shù)據(jù)沒有被覆蓋之前,將它轉移走呢?微軟提供了一個解決辦法:“通知”??梢栽诰彌_區(qū)中的某些位置處設置通知,當讀指針到達通知位置的時候,就會觸發(fā)相應的事件執(zhí)行轉移操作。有點像操作系統(tǒng)中的“響應中斷”。錄音大致過程如下:1>設置PCM格式,設置相關的參數(shù),如:采樣頻率、量化位數(shù)等。2>創(chuàng)建WAVE文件.數(shù)據(jù)還沒開始采集,就先創(chuàng)建文件是因為RIFF結構的WAVE文件除了音頻數(shù)據(jù)之外,還有其它數(shù)據(jù),比如音頻格式、格式長度等類似于文件頭的數(shù)據(jù)。有了文件頭后,接下來就只需要把接收到的數(shù)據(jù)添加在這個后面就好了。3>建立設備對象,建立緩沖區(qū)對象。4>設置緩沖區(qū)通知,設置通知被觸發(fā)后的事件。5>準備就緒后,就可以開始錄音了。6>當通知被觸發(fā)后,建立一個新的線程來處理數(shù)據(jù)轉移的事件。(建立一個新的線程,就是為了防止錄音過程被中斷)。7>錄音結束,寫入WAV文件尾。這樣一個可以播放的WAVE文件就OK了。與錄音不同的是,錄音需要建立一個WAVE文件來存儲這些采集到的數(shù)據(jù),而在語音聊天中,則不需要存儲,當采集到一些數(shù)據(jù)后,就立刻發(fā)送出去,因此也不需要開辟很大的空間來存放PCM數(shù)據(jù)。語音聊天基本的步驟如下:1>設置PCM格式,設置相關的參數(shù),如:采樣頻率、量化參數(shù)等。2>建立采集用的設備對象,建立采集用的緩沖區(qū)對象。3>設置緩沖區(qū)通知,設置通知被觸發(fā)后的事件。通知是用于緩沖區(qū)的讀指針達到某預設位置時觸發(fā)通知事件,提醒可以對某部分的數(shù)據(jù)進行傳送了。4>開始采集語音。5>當通知被觸發(fā)后,建立一個新的線程來處理數(shù)據(jù)傳送的事件。(建立一個新的線程,就是為了防止采集過程被中斷。)語音傳輸就是將采集到的語音通過UDP協(xié)議傳輸?shù)狡渌闹鳈C上。大致的流程如下:.建立socket對象,在實例化這個對象的時候設置參數(shù)為UDP協(xié)議。.綁定本機的IP和端口,因為一個主機可能會有不止一個IP地址,如回發(fā)地址:和局域網(wǎng)地址:202.193.#.#。為了增加可用性,這里選擇綁定到任何本機可用的IP地址(IPAddreSS.Any),而端口約定默認為8000。.啟動監(jiān)聽線程,來監(jiān)聽網(wǎng)絡。采用的是異步的方式,以便獲得更好的系統(tǒng)響應度。.發(fā)送的關鍵代碼是:Client.SendTo(capturedata,epServer);〃傳送語音語音播放當對方將語音通過網(wǎng)絡傳輸?shù)奖緳C時,就可以進行實時播放了。因為聲音播放是從緩沖區(qū)中獲取聲音數(shù)據(jù)的,因此必須先將獲取到的數(shù)據(jù)寫入緩沖區(qū),然后再調(diào)用相應的方法來播放。大致的思路如下:利用MemoryStream來代表這個接收緩沖區(qū)。設置兩個表示指針位置的字段:privateintintPoSWrite=0;//內(nèi)存流中寫指針位移privateintintPoSPlay=0;//內(nèi)存流中播放指針位移當接收到數(shù)據(jù)后,則移動寫指針,移動的長度為接收到的數(shù)據(jù)長度。利用一個字段表示通知大?。簆rivateintintNotifySize=5000;當寫指針的位置達到通知大小,則執(zhí)行播放操作,然后移動播放指針到剛才的通知的位置。如果當前寫指針的位移與將要寫入到緩沖區(qū)的數(shù)據(jù)大小相加后超過緩沖容量的,則進行摩爾運算,實現(xiàn)循環(huán)的效果。(7)文件傳輸?shù)膶崿F(xiàn),分別定義了文件發(fā)送管理類(SendFileManager),文件接收管理類(ReceiveFileManager),文件發(fā)送類(UdpSendFile)和文件接收類(UdpRecieveFile),以便實現(xiàn)盡量簡單的就可以使用它們。文件傳輸中的發(fā)送和讀寫文件都是基于異步的,實現(xiàn)了對大文件的分塊發(fā)送。與前面的文本信息的發(fā)送比較的類似,因為傳輸?shù)氖嵌M制流,所以傳輸前要先將文件進行序列化成二進制流的形式,再進行傳輸。只要知道了對方的IP地址,本地需要開啟一個端口進行監(jiān)聽,文件接收方也需要開啟一個端口進行監(jiān)聽,看是否有文件流到達本地。如果有文件流到達本地后,就進行讀取接收。與傳輸?shù)倪^程剛好是相反的,是要將二進制流的信息反序列化成文件對象。接收的文件默認放在接受文件端得根目錄下。當給對方發(fā)送文件的時候,同時給對方發(fā)送一個消息,提示對方自己已經(jīng)給對方發(fā)送了一個文件。在文件發(fā)送的時候,也獨立開辟了一個線程來處理。文件接收的時候也開辟的一個線程來處理接收。這樣,可以提高系統(tǒng)的效率,加快文件傳輸?shù)乃俣?。服務器端模塊的詳細設計與實現(xiàn)服務器端控制臺窗體概述該窗體是客戶端與遠程客戶端相互通信的一個中轉站,并且在該窗體上顯示已注冊的所有用戶信息,包括注冊的ID、IP地址、端口號、姓名、狀態(tài),并顯示用戶的在線狀態(tài),4是表示在線,12是表示不在線。服務器端控制臺窗體運行結果如圖5-1所示。圖5-1服務器端控制臺窗體服務器端控制臺窗體技術分析在本模塊中使用了BinaryFOrmatter對象,該對象是以二進制格式將對象或整個連接對象序列化或反序列化。服務器端控制臺窗體實現(xiàn)過程(1)新建一個Windows窗體,命名為F_Server.cs,主要用于實現(xiàn)系統(tǒng)的登陸功能,該窗體用到的主要控件有LiStView和UDPSOCket。(2)在控制臺窗體的菜單欄中選擇“控制臺/開始服務”命令,打開UDP協(xié)議的監(jiān)聽。然后再選中“控制臺/關閉服務”命令,即可關閉UDP協(xié)議的監(jiān)聽。(3)在UDPSocket1的控件的DataArrival事件中,對客戶端發(fā)送的消息進行監(jiān)聽,并根據(jù)發(fā)送的消息對數(shù)據(jù)庫進行相應的操作。(4)RegiSterUSerO方法將客戶端注冊的信息添加到數(shù)據(jù)庫中,并更新用戶列表。(5)InsertUser()方法的主要功能是將用戶注冊的相關信息添加到數(shù)據(jù)庫的tb_CurreneyUse數(shù)據(jù)表中,并更新用戶列表。(6)UPdateUSerLiStO方法的主要功能是將剛剛注冊成功的用戶信息,發(fā)送給當前所有在線的用戶,并告知其他用戶,當然已有人注冊。(7)UserLogin()方法的主要功能是當前用戶上線時,更改tb-CurreneyUser數(shù)據(jù)表中相關用戶的標識,并更新用戶的在線狀態(tài)。系統(tǒng)特色及關鍵技術(1)當QQ窗體上邊框拖動到屏幕頂端時,QQ窗體會自動隱藏。實現(xiàn)這一過程,使用的是timer1控件對鼠標進行實時監(jiān)控,用API函數(shù)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);〃存儲當前窗體在屏幕的所在區(qū)域if((this.Top<0)&&Win32API.PtInRect(refRects,pp))〃當鼠標在當前窗體內(nèi),并且窗體的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)為了使程序窗口的界面看起來更加的美觀、大方。對所有的窗體都進行了皮膚的加載。皮膚的加載技術相對的來說比較的簡單。只要在程序中引入相應的皮膚加載庫,然后將相關的文件放到當前程序的目錄下,即可實現(xiàn)動態(tài)加載皮膚了。(3)該程序中還使用的系統(tǒng)托盤圖標的功能。該功能的實現(xiàn)主要是使用了notifyIcon1控件實現(xiàn)。托盤圖標還具有右鍵菜單的功能。菜單上具有在線、離線、和退出的功能。(4)此外,還對窗體圖標已經(jīng)可執(zhí)行程序的圖標都進行插入“QQ”圖片,使程序看起來更加的美觀、大方。(5)本程序還對客戶端和服務器端程序分別進行了打包。使用戶在使用的時候能夠比較方便的安裝。打包使用的是VS2005中的“安裝和部署”功能來進行打包的。打包的時候,只要將程序使用的到的相關的動態(tài)鏈接庫和可執(zhí)行文件進行打包即可。到了其他機器上,只要單擊運行“安裝程序”即可自動的快速的在本地完成QQ聊天程序的安裝。然后點擊快捷方式,即可方便的進行登錄了。(6)語音、視頻和文件傳輸是本程序最大的特色,也是在本系統(tǒng)開發(fā)中最難開發(fā)的、技術含量最多的模塊。7結論經(jīng)過2個多月緊張的畢業(yè)設計,采用C#做的局域網(wǎng)QQ聊天軟件已基本完成,系統(tǒng)的基本功能已經(jīng)實現(xiàn),測試運行也比較正常。該系統(tǒng)操作簡便、易于使用、用戶界面友好,所以具有比較好的易用性。但是在開發(fā)的過程中,也遇到了不少的困難和挑戰(zhàn):(1)剛開始碰到的一個比較大的問題就是,服務器IP地址的確定的問題。因為學校分配給每個人的IP地址不是固定的,是經(jīng)常變化的,而在開始調(diào)試程序的時候是指定了固定的本地IP地址進行調(diào)試的,所以在調(diào)試程序的過程中經(jīng)常出現(xiàn)連不上服務器的情況。開始的時候,以為是自己程序的問題,后來經(jīng)過調(diào)試才發(fā)現(xiàn)原來是服務器IP地址經(jīng)常變動的原因,才導致客戶端連接不上服務器,所以才導致客戶端不能正常的登錄。因為剛開始不知道有回環(huán)地址,所以每過一兩天,當IP地址一改變的時候,就得改變程序中的所有的固定了的IP地址,這樣做非常的麻煩,有時候因為疏漏,漏改了一兩處的話,就會導致連不上服務器的情況。后來,經(jīng)過到網(wǎng)上,查詢,知道了本機的回環(huán)地址:,調(diào)試程序就方便多了,就不用經(jīng)常改變程序中的IP地址了。(2)另外,就是在做視頻的時候,也遇到了比較大的麻煩。剛開始時,是可以實現(xiàn)了視頻,但是發(fā)現(xiàn)本地攝像頭拍攝到的圖像是“歪”的,就是在視頻控件上看到的圖像是“歪”的,后來,在網(wǎng)上不斷的尋找有關方面的資料,最終把問題給解決了。另外一個問題是,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年膠帶提升機易損件項目可行性研究報告
- 高效課堂培訓心得體會800字
- 2025版家政洗衣店員工培訓及就業(yè)合同3篇
- 2025年度智慧停車場安裝服務協(xié)議3篇
- 2025版藝術品抵押貸款擔保合同3篇
- 工程機械租賃合同范本
- 2024年中國全封閉微型智能集菌儀市場調(diào)查研究報告
- 學生社會實踐報告15篇
- 軟件開發(fā)合同
- 北京信息職業(yè)技術學院《第二語言習得》2023-2024學年第一學期期末試卷
- 法律意見書(適用于股權投資)
- JJF(蘇) 276-2024 接觸(觸針)式表面輪廓測量儀校準規(guī)范
- 2024-2025學年五年級科學上冊第二單元《地球表面的變化》測試卷(教科版)
- 污泥(廢水)運輸服務方案(技術方案)
- 2024-2030年中國降壓藥行業(yè)市場規(guī)模分析及發(fā)展趨勢與投資研究報告
- 二十屆三中全會精神應知應會知識測試30題(附答案)
- 一例下肢靜脈血栓疑難病例護理討論
- 2024年信息系統(tǒng)項目管理師題庫及答案
- 輸血相關法律法規(guī)臨床輸血安全管理課件
- DL∕T 5161.6-2018 電氣裝置安裝工程質(zhì)量檢驗及評定規(guī)程 第6部分:接地裝置施工質(zhì)量檢驗
- DL∕T 1502-2016 廠用電繼電保護整定計算導則
評論
0/150
提交評論