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