[精品論文]基于VB的網絡數據傳輸、聊天室畢業(yè)論文_第1頁
[精品論文]基于VB的網絡數據傳輸、聊天室畢業(yè)論文_第2頁
[精品論文]基于VB的網絡數據傳輸、聊天室畢業(yè)論文_第3頁
[精品論文]基于VB的網絡數據傳輸、聊天室畢業(yè)論文_第4頁
[精品論文]基于VB的網絡數據傳輸、聊天室畢業(yè)論文_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

畢業(yè)設計課程定做 QQ1714879127畢業(yè)設計說明書基于VB的網絡數據傳輸基于VB的網絡數據傳輸摘要 隨著Internet的普及和工業(yè)自動化的迅速發(fā)展,網絡已深入家庭、辦公室、工廠、自動化控制領域。人們在各個地方都可通過互聯(lián)網來交換信息,因而網絡數據傳輸就顯得尤為的重要。在VB中就提供了支持數據傳輸的控件,如:Winsock控件和MSComm控件等。通過程序開發(fā)和控件的使用, 可實現網絡的數據通信,滿足網絡用戶對數據通信和數據交換的需求。在本文中介紹了利用Winsock控件編程實現C/S模式的數據傳輸;同時在RS-232串口通信中使用MSCOMM控件編程來模擬實現對受控方的相關操作。關鍵詞 WinSock控件;客戶端/服務器模式;網絡數據傳輸;串口通信;MSCOMM控件NETWORK DATA TRANSMISSIONOF BASED ON THE VISUAL BASICABSTRACTWith the popularity of Internet and the rapid development of industrial automation, Network has penetrated into home, office, factory, automation fields. People in various places accessible through the Internet to exchange informations ,So data transmission in the network is particularly important. However it Provided controls of supporting data transmission in the visual basic,like Winsock and MSComm control and so on. Through the design of procedures and the use of controls, Can realize the data communications in the network,and meet the Demand of data communications and data exchange for internet users. In this article, will introduce to the use of Winsock control programming C / S mode data transmission; at the same time, in the RS-232 serial communication through the MSCOMM control programs to simulate the realization of the relevant operation.KEY WORDS Winsock control; client/server mode; network data transmission; serial communication; MSCOMM control目 錄中文摘要2英文摘要3第一章 緒論51.1 數據傳輸及通信概述51.2 課題選擇71.3 論文結構7第二章 概述82.1 Winsock控件簡述92.1.1 Winsock控件介紹92.1.2 Winsock控件重要屬性、方法、和事件92.2 RS-232串口通信概述122.2.1 RS-232串口通信簡述122.2.2 MSComm控件重要屬性、方法和事件12第三章 需求分析143.1 功能需求153.2 性能需求15第四章 總體設計154.1 功能模塊圖154.2 C/S模型時序圖164.3 客戶端、服務器界面設計17第五章 詳細設計215.1 構架模型215.2 通信協(xié)議215.3 動態(tài)添加客戶端225.4 樹型目錄結構的實現235.5 文件傳輸模塊33第六章 典型問題分析386.1 動態(tài)添加、刪除客戶端問題386.2 文件傳送和接收問題386.3 文件夾傳輸問題386.4 各種命令標志的接收處理問題39第七章 網絡數據傳輸的應用417.1 網絡數據傳輸的應用417.2 網絡數據傳輸與RS-232串口通信結合應用41第八章 設計心得及軟件不足438.1 設計心得438.2 軟件不足43致 謝44參考文獻45附 錄46第一章 緒論1.1數據傳輸及通信概述1. 數據通信方式按傳輸方向分有:(1) 單工通信:在單工信道上信息只能在一個方向傳送。(2) 半雙工通信:在半雙工信道上,通信的雙方可交替發(fā)送和接收信息。(3) 全雙工通信:一種可以同時進行雙向信息傳送的通信方式。按同步方式分:(1) 異步傳輸:把各個字符分開傳輸,字符之間插入同步信息。其優(yōu)點是簡單,但由于起止位和檢驗位的加入會引入20%30%的開銷,傳輸的速率也不高。(2) 同步傳輸:發(fā)送方在發(fā)送數據之前先發(fā)送一串同步字符SYNC。2交換方式:(1) 線路交換:交換的特點是建立連接需要等待較長的時間。特點:連接建立后通路是專用的。不再有傳輸延遲,這種交換方式適合于傳輸大量的數據。在傳輸少量信息時效率不高。(2) 報文交換:特點:不建立專用鏈路。線路利用率較高。電子郵件系統(tǒng)(例如E-Mail)適合采用報文交換方式。(3) 分組交換:有兩種方式:數據報:類似于報文交換。引入分組拆裝設備PAD(Packet Assembly and Disassembly device)。虛電路:類似于電路交換。 虛電路與線路交換的區(qū)別:邏輯連接并不意味著別的通信不能使用這條線路。它仍然具有線路共享的優(yōu)點。虛電路與數據報的區(qū)別:虛電路意味著可靠的通信,它涉及更多的技術,需要更在的開銷。沒有數據報方式靈活,效率不如數據報方式高。虛電路適合于交互式通信,數據報方式更適合于單向地傳送短信息。虛電路可以是暫時的,即會話開始建立,會話結束拆除,這叫虛呼叫;也可以是永久的,即通信雙方一開機就自動建立,直到一方(或同時)關機才拆除。這叫永久虛電路。 分組交換的特點:數據包有固定的長度。采用固定的、短的分組相對于報文交換是一個重要的優(yōu)點。除了交換結點的存儲緩沖區(qū)可以不些外,也帶來了傳播時延的減少,分組交換也意味著按分組糾錯:發(fā)現錯誤只需重發(fā)出錯的分組,使通信效率提高。1.2 課題選擇隨著Internet的普及和工業(yè)自動化的迅速發(fā)展,網絡已深入家庭、辦公室、工廠、自動化控制領域。人們在各個地點都可通過互聯(lián)網來交換信息。因而網絡數據傳輸就顯得尤為的重要。鑒于對網絡數據傳輸的必要性和重要性的考慮,我選擇了基于VB的網絡數據傳輸來作為畢業(yè)設計的課題。其意義在于網絡數據傳輸相對與整個互聯(lián)網絡來說有著至關重要的作用,缺失數據傳輸、數據交換,那每一臺計算機只能是孤立的存在,因而這一領域有待我們去開拓、研究,其中有許多求知部分有待去填補。1.3 論文結構本論文介紹了網絡數據的必要性與實際應用,重點從WINSOCK控件進行分析設計,詳細介紹了基于VB語言進行C/S模式的設計。全文分為九個章節(jié)。第一章 緒論。主要闡述了網絡數據傳輸的時代背景和現實需求。第二章 概述。從大體上闡述了基于VB語言來實現網絡數據的傳輸方式方法和可用的途徑。第三章 需求分析。敘述了設計的功能需求和性能需求,明確了軟件的主題方向。第四章 總體設計。本章主要介紹軟件設計的總體功能模塊圖,C/S模式的時序圖以及軟件設計的服務器端和客戶端的相關界面的簡介。第五章 詳細設計。本章分六個小節(jié),分別從構架模型、通信協(xié)議、動態(tài)添加客戶端、樹型目錄結構的顯示、文件傳輸以及主要功能模塊的代碼分析來闡述整個設計的詳細情況。第六章 典型問題分析。本章主要針對在設計過程中所涉及到的一些難點問題的分析,分四個小節(jié)闡述了四個方面值得研究討論的問題。第七章 網絡數據傳輸的應用。本章主要是敘述了網絡數據傳輸的相應的實際應用,并將本設計與實際應用相結合。在本章第二小節(jié)中具體結合RS-232串口通信實現對模擬設備的相關狀態(tài)數據的接收,以達到遠程對設備的控制的目的。第八章 設計心得及軟件不足。本章主要論述了在完成整個軟件過程中的一些心得體會以及本軟件尚存的不足之處。第九章 致謝。第二章 概 述Visual Basic 是Microsoft 公司開發(fā)的Windows 應用程序開發(fā)工具,Visual 可視化的,是一種開發(fā)圖形戶界面(GUI)的方法.使得非計算機專業(yè)的人也可以開發(fā)出專業(yè)的Windows軟件. Visual Basic繼承了BASIC語言簡單易學的優(yōu)點,又增加了許多新的功能,它采用面向對象與事件驅動的程序設計思想,使編程變得更加方便,快捷.使用Visual Basic既可以開發(fā)個人或小組使用的小型工具,又可以開發(fā)多媒體軟件,數據庫應用程序,網絡應用程序等大型軟件.是國內外最流行的程序設計語言之一.基于Visual Basic這種操作簡便、功能強大的優(yōu)點,結合網絡實際情況和需要,研究開發(fā)基于Visual Basic的網絡數據傳輸的軟件。在本文中簡單介紹了網絡數據傳輸的相關協(xié)議,如TCP/IP協(xié)議和UDP協(xié)議;在實現過程中用到的核心控件,如Winsock控件和MSComm控件;介紹了利用Winsock控件實現客戶端和服務器之間的通信原理;利用MSComm控件來模擬對設備的監(jiān)控,通過兩臺模擬機實現各個狀態(tài)信息讀取及相關操作,從另一方面(即RS-232串口通信)來體現數據傳輸。2.1 Winsock控件簡述2.1.1 Winsock控件介紹 WINSOCK即Windows Socket,是微軟公司對Socket編程接口的集成。WINSOCK控件用于Windows Socket接口簡化成易于使用的Visual Basic內部接口,從而避免通過訪問DLL來到如Windows Socket函數,和其他控件一樣,有著使用方便的特點。但是WINSOCK控件并不能完全取代Socket函數,它使用IP協(xié)議,并支持TCP和UDP協(xié)議,但是支持程度偏低,像多播和廣播等特性無法支持,不過在僅僅需要基本的網絡數據通信的前提下,Windows控件仍然是最好的選擇。2.1.2 Winsock控件重要屬性、方法、和事件(1) 屬性Protocol:通過Protocol屬性可以設置WinSock控件連接遠程計算機使用的協(xié)議。可選的協(xié)議是TCP和UDP,對應的VB中常量分別是sckTCPProtocol和sckUDPProtocol,Winsock控件默認協(xié)議是TCP。注意:雖然可以在運行時設置協(xié)議,但必須在連接未建立或斷開連接后。SocketHandle:SocketHandle返回當前socket連接的句柄,這是只讀屬性。RemoteHostIP:返回遠程計算機的IP地址。在客戶端,當使用了控件的Connect方法后,遠程計算機的IP地址就賦給了RemoteHostIP屬性,而在服務器端,當ConnectRequest事件后,遠程計算機(客戶端)的IP地址就賦給了這個屬性。如果使用的是UDP協(xié)議那么當DataArrival事件后,發(fā)送UDP報文的計算機的IP才賦給了這個屬性。ByteReceived:返回當前接收緩沖區(qū)中的字節(jié)數。State:用于返回當前WinSock控件的狀態(tài)。如表2-1所示。表2-1 返回WinSock控件當前的狀態(tài)常數值描述sckClosed0缺省值,關閉SckOpen1打開SckListening2偵聽sckConnectionPending3連接掛起sckResolvingHost4識別主機sckHostResolved5已識別主機sckConnecting6正在連接sckConnected7已連接sckClosing8同級人員正在關閉連接sckError9錯誤(2) 方法Bind:用Bind方法可以把一個端口號固定為本控件使用,使得別的應用程序能再使用這個端口。Listen:只在使用TCP協(xié)議時有用。它將應用程序置于監(jiān)聽檢測狀態(tài)。Connect:當本地計算機希望和遠程計算機建立連接時,就可以調用Connect方法。Accept:當服務器接收到客戶端的連接請求后,服務器有權決定是否接受客戶端的請求。SendData:當連接建立后,要發(fā)送數據就可以調用SendData方法,該方法只有一個參數,就是要發(fā)送的數據。GetData:當本地計算機接收到遠程計算機的數據時,數據存放在緩沖區(qū)中,要從緩沖區(qū)中取出數據,可以使用GetData方法。PeekData:和GetData方法類似,但PeekData在取得數據后并不把緩沖區(qū)清空。(3) 事件ConnectRequest:當本地計算機接收到遠程計算機發(fā)送的連接請求時,控件的ConnectRequest事件將會被觸發(fā)。SendProgress:當一端的計算機正在向另一端的計算機發(fā)送數據時,SendProgress事件將被觸發(fā)。SendProgress事件記錄了當前狀態(tài)下已發(fā)送的字節(jié)數和剩余字節(jié)數。SendComplete:當所有數據發(fā)送完成時,被觸發(fā)。DataArrival:當建立連接后,接受到了新數據就會觸發(fā)這個事件。注意:如果在接受到新數據前,緩沖區(qū)中非空,就不會觸發(fā)這個事件。Error:當在工作中發(fā)生任何錯誤都會觸發(fā)這個事件。2.2 RS-232串口通信概述2.2.1 RS-232串口通信簡述串行通信端口(Serial Communication Port)在系統(tǒng)控制的范圍中一直占據著及其重要的地位,它不僅沒有因為時代的進步而遭淘汰,反而在規(guī)格上越來越完善,應用也越來越廣泛。現在,串行通信端口(RS-232)是計算機上的標準配置,用途上則以連接調制解調器來傳輸數據最為常見,如圖2-1所示為串口外觀。當然,它的重要性還不只如此。RS-232串行通信端口是每臺計算機上的必要-配備,通常有COM1和COM2兩個端口。一般計算機將COM1端口以9引腳的接頭接出,而以25腳的接頭將COM2端口接出。新一代的計算機均以9引腳接頭接出所有的RS-232通信端口。圖2-1 串口外觀圖2.2.2 MSComm控件重要屬性、方法和事件不同于其他控件,MSComm只有一個事件即OnComm事件,所有可能發(fā)生的狀況(錯誤或引發(fā)通信事件)都集中在這個事件中處理,通過對這些狀況的處理來實現各種控制和傳輸,如下表列的即為MSComm控件的OnComm事件中所含的各種可能出現的事件狀況:表2-1 MSComm控件屬性屬性描述CommPort設置并返回通訊端口號Settings字符串的形式設置并返回波特率、奇偶校驗、數據位、停止PortOpen設置并返回通訊端口的狀態(tài)。也可以打開和關閉端口Input從接收緩沖區(qū)返回和刪除字符Output向傳輸緩沖區(qū)寫一個字符串IuBufferCount用于返回在接收緩沖區(qū)中的字符數InputMode設置或返回Input屬性取回的數據類型表2-2 MSComm控件事件事件描述comEventBreak收到中斷信號comEventCDTO載波檢測超時comEventCTSTOCTS信號超時comEventDSRTODSR信號超時comEventFrame發(fā)送框架發(fā)生錯誤comEventOverrun數據遺失comEventRxOver接收緩沖區(qū)滿溢comEventRxParity極性錯誤comEventTxFull發(fā)送緩沖區(qū)已滿comEventDCB連接時發(fā)生非預期錯誤comEvCDCD線的狀態(tài)發(fā)生變化comEvCTSCTS線的狀態(tài)發(fā)生變化comEvDSRDSR線的狀態(tài)發(fā)生變化comEvRingRing Indicator 變化comEvReceiveRThreshold#of chars第三章 需求分析3.1 功能需求1. 動態(tài)添加客戶端:服務器端能夠實現與多個客戶端之間建立連接并進行通信。2. 客戶端樹型目錄結構顯示:服務器可以顯示客戶端的樹型目錄結構,能夠方面的抓取客戶端機器上的任何文件。3. 字符和字符串的傳輸:可以與客戶端之間進行簡單的消息通信,雙方可以交互信息。4. 各種格式的文件傳輸:對于不同格式的文件如視頻、音頻、常用文件word,excel,txt等等,可以實現傳輸操作。5. 文件夾的傳輸:除了單個文件實現傳輸以外,還需要實現對整個文件夾的傳輸。6. 單個發(fā)送和群發(fā):對于消息可以指定發(fā)送也可以群發(fā)消息,同時也可以實現對服務器端某個文件指定客戶端發(fā)送也可以群發(fā)給所有連接成功發(fā)客戶端。3.2 性能需求1. 穩(wěn)定性在程序設計中應當考慮到各種可能發(fā)生的情況,進而避免常規(guī)或者一些低級錯誤。一旦發(fā)生任何錯誤或突發(fā)事件,系統(tǒng)要能夠正常運行甚至及時糾錯,不至于癱瘓而使得軟件無法運行下去。那么在設計對于一些不常規(guī)的輸入和操作均作了相應的限制,從某種程度上提升了軟件的穩(wěn)定性。2. 易用性本程序僅僅是一個雛形,容易上手,操作簡單,使用過程一目了然。相關命令標志處理和臨時處理均使用文件,操作起來比較簡便。 第四章 總體設計4.1 功能模塊圖圖4-1 C/S模式總體功能模塊4.2 C/S模型時序圖圖4-2面向連接的C/S模型時序圖4.3 客戶端、服務器界面設計圖4-3 服務器主界面圖4-4 服務器端帶消息窗口界面圖4-5 客戶端主界面第五章 詳細設計5.1 構架模型圖5-1 C/S 模型構架圖5.2 通信協(xié)議在開始編程之前首先應當對客戶端和服務器之間的通信協(xié)議進行定義,以便雙方在通信過程中可以方便的識別彼此的通信指令和標志。1.服務器端通信協(xié)議定義如表5-1所示:表5-1 服務器端標志命令標志命令標志解釋Read讀取驅動盤符標志信息Fl_Pa_為讀取當前選中目錄的當下的所有子目錄,即展開選中目錄Opt_pa傳輸單個文件標志信息Ins_Tr確認傳輸標志Accept接收數據完畢標志MESG消息傳輸標志Stop斷開連接標志Optpa傳輸文件夾標志信息2. 客戶端通信協(xié)議定義如下:表5-2 服務器端標志命令標志命令標志解釋Fl_Dir壓縮文件夾的長度標志,后跟某壓縮文件夾的長度,同時初始化作好接收準備MESG客戶端信息標志Fl_Len單個文件長度標志,同時初始化文件名,用以接收Pause與客戶端斷開連接標志RE_DIR、RE_FLE在顯示數形目錄結構時目錄中的文件夾和文件標志5.3 動態(tài)添加客戶端單個客戶端與服務器通過winsock控件實現通信以后,必須結合實際情況實現多個客戶端與服務器之間的數據通信,這就涉及到服務器需要有動態(tài)添加客戶端的能力,與請求連接的客戶端建立彼此間連接。在設計中我采用winsock數組來實現服務器端的動態(tài)添加功能,winsock(0)設計為服務器端一直保持監(jiān)聽客戶端連接請求的控件,如果監(jiān)聽到有客戶端的連接請求,首先查找數組中是否存在空閑的winsock(x),如果存在,則使用該winsock(x)與之建立連接,反之加載一個新的winsock數組控件與之建立連接。一旦與客戶端建立連接成功后,服務器將把該winsock的數組下標發(fā)送給該客戶端,如服務器端是使用winsock(2)與客戶端建立連接,則將索引2發(fā)送給客戶端,此時該客戶端就作為“2號客戶端”,同時在服務器端的listbox客戶端狀態(tài)列表中作為2號客戶端顯示5.4 樹型目錄結構的實現樹型目錄結構的顯示是這個設計中的一個特點,總體是模仿微軟的資源管理器,當然外觀效果還不是很完善,其中目錄中“+”符號以及空格是目錄之間區(qū)分上下級的一個關鍵標志,如上級目錄和當下的文件夾子目錄之間相差一個空格,而“+”“-”符號主要是對目錄展開和收起起到一個指示作用。該功能設計的總體思路如下:當服務器端選種“客戶端狀態(tài)”列表中連接成功的客戶端時,向該客戶端發(fā)送命令標志,要求回傳其磁盤驅動列表信息如C盤,D盤等;如果服務器端繼續(xù)點選某磁盤驅動,則向客戶端發(fā)送該磁盤路徑,要求返回該磁盤當下所有的文件夾和文件信息,返回后,在該磁盤當下顯示文件夾目錄,并在“文檔”列表中顯示該磁盤驅動下的文件名,依次類推,可逐級顯示目錄信息;如果某級目錄已經展開,那么起前將顯示“-”符號,再次點擊該目錄時,將收起該目錄(即刪除該目錄下的所有信息),此時其前面將顯示“+”符號。對于具體實現,如圖5-2所示。以下是客戶端根據服務器端指定的目錄路徑進行相應的查找,并返回該目錄下的子目錄和文件名稱。圖 5-2 客戶端根據指定目錄查找子目錄和文件主流程服務器端查看客戶端的樹形目錄,模擬實現本機上的資源管理器來抓取客戶端上的某些文件。在實現過程中考慮到目錄的深淺,如果初始化就將客戶端的所有目錄全部顯示在列表中,會帶來不必要的麻煩,所以采取的方法是服務器端點選某級目錄就向客戶端發(fā)送讀區(qū)該級目錄的命令,以達到減少時間復雜度和空間復雜度的目的,具體實現流程如圖5-3所示。圖5-3 服務器端查看樹形目錄主流程5.5 文件傳輸模塊文件傳輸的實現主要是在客戶端處理,客戶端接收到服務器端的文件傳輸的指令后,采取相應的處理。文件傳輸主要分兩種情況來處理: 1. 單個文件傳輸理論上單個文件傳輸相對于整個文件夾的傳輸要簡單的多,服務器端發(fā)送指令:Winsock1(ClientIndex).SendData Opt_pa & Label2.Caption,其中Opt_pa為單個文件傳輸的標志,Label2.Caption為該文件在客戶端的絕對路徑。客戶端分離信息后,根據文件路徑取得該文件的長度,先向服務器端發(fā)送該文件的長度Winsock1.SendData Fl_Len & LenFile1,目的是為了在文件傳輸過程中能夠判斷該文件是否傳輸完畢。服務器端回送一個Ins_Tr的確認標志后,客戶端開始對該文件進行傳輸。對文件的傳輸的具體實現,需要考慮幾種情況,對于小型文件可以直接利用WINSOCK傳輸,但是對于大型文件或視頻文件的傳輸必須采用分割技術來實現,基于以上的考慮,無論是大型文件還是小型的文件的傳輸首先判斷其長度是否大于65535,如果小于則直接傳輸,否則對該文件進行分塊傳輸(以8K為一個傳輸塊),數據塊傳輸完畢后,還必須考慮所剩下的數據,如果存在剩余的數據也要進行傳輸。2. 整個文件夾的傳輸按照常理來說,對于文件夾的傳輸其實就是對文件的循環(huán)傳輸,原理是:根據服務器端給定的文件夾路徑Winsock1(ClientIndex).SendData Optpa & Label2.Caption,其中Optpa為文件夾傳輸標志,Label2.Caption為文件夾的絕對路徑,客戶端分離路徑后首先查找該文件夾下的所有子文件夾和文件的名稱,保存在文件中傳輸到服務器端,在服務器端建立該文件夾及其包含的所有子目錄和文件名稱,然后客戶端循環(huán)傳輸文件。上述中理論上可以實現整個文件夾的傳輸,但是明顯實現起來比較復雜,比如該文件夾下所嵌套的子文件夾比較深,所包含的文件也比較多,那么在傳輸過程中所要考慮的問題也就非常的復雜,要考慮同級目錄中的文件傳輸和下級文件的傳輸。經過多次試驗后,找到一種替代方法,同樣可以是實現整個文件夾的傳輸,但在原理上有區(qū)別于上面的傳輸途徑:主要是利用微軟rar.exe和unrar.exe可以簡單的實現文件夾的傳輸。起原理是客戶端分離文件夾路徑后,調用rar.exe對該文件夾進行壓縮處理,這樣一來無論文件夾下嵌套有多深,包含了多少個文件,一并作打包處理,然后傳輸給服務器端;服務器端完全接收該壓縮文件到指定路徑下,對該壓縮文件進行解壓縮處理,以此來實現對整個文件夾的傳輸。無論是單個文件還是整個文件夾的傳輸,都使用了如圖5.4.1-3 所示的流程來傳輸。5.6 主要功能實現代碼分析 1. 服務器端動態(tài)添加客戶端實現代碼:Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) If Index = 0 Then intMax = FindOpenWinsock 判斷列表中是否有存在已斷開的winsock控件 Winsock1(intMax).Accept requestID If FindOpenWinsockFlag = 0 Then 無空閑的winsock控件 List3.AddItem intMax & 號客戶端連接成功 Else 有空閑控件 List3.RemoveItem intMax - 1 List3.AddItem intMax & 號客戶端連接成功, intMax - 1 FindOpenWinsockFlag = 0 End If Winsock1(intMax).SendData Cli_ID & Trim(str(intMax) Call RefreshCombox 刷新combox列表 End IfEnd SubPublic Function FindOpenWinsock() As Integer Static LocalPorts As Integer For x = 0 To Winsock1.UBound If Winsock1(x).State = 0 Then 數組中在空閑的winsock元素 FindOpenWinsock = x FindOpenWinsockFlag = 1 Exit Function End If Next x Load Winsock1(Winsock1.UBound + 1) 不存在直接加載控件元素 LocalPorts = LocalPorts + 1 Winsock1(Winsock1.UBound).LocalPort = Winsock1(Winsock1.UBound - 1).LocalPort + LocalPorts FindOpenWinsock = Winsock1.UBoundEnd Function2. 文件傳輸模塊代碼: Public Sub transfer() 核心模塊,用以傳輸 Dim FreeF As Integer Dim LenFile As Long 文件的長度 Dim bytData() As Byte 存放數據的數組 Dim ipos As Long Const imax = 65535 FreeF = FreeFile 獲得空閑的文件號 Open filename For Binary As #FreeF 打開文件 DoEvents LenFile = LOF(FreeF) 獲得文件長度If LenFile = (LenFile - imax) 發(fā)送整塊數據的循環(huán) ReDim bytData(1 To imax) Get #FreeF, ipos + 1, bytData Winsock1.SendData bytDataipos = ipos + imax 移動iPos,使它指向下來要讀的數據 LoopReDim bytData(1 To LenFile - ipos) 發(fā)送剩下的不夠一個數據塊的數據 Get #FreeF, ipos + 1, bytData Winsock1.SendData bytData Close #FreeFEnd Sub 這里要注意的是,必須檢查文件有沒有剩下的數據,如果文件大小正好等于數據塊大小的整數倍,那么就沒有剩下的數據了。3. 服務器端目錄展開和收起 Private Sub List1_Click()Dim p As IntegerFor p = 0 To List1.ListCount 1 If List1.Selected(p) = True Then If judge(p) 0 Then 判斷有無子目錄 ,不等于 0為有子目錄 Call delete(p) 刪除該目錄下的所有子目錄,達到收起的效果 Label2.Caption = Else 等于 0為無子目錄 IndexValue = p Winsock1(ClientIndex).SendData Fl_Pa_ & filepath & space_num & str(spa) spa = 0 發(fā)送該目錄的完整路徑和空格數到客戶端讀取 Call modify(p, -) 修改該目錄的“+”號為“-” Label2.Caption = filepath End If Exit For End IfNext pEnd SubPublic Function judge(x As Integer) As Integer 判斷當前選中項是否含有子目錄 Dim p1 As Integer, p2 As Integer p1 = Len(List1.List(x) - Len(Trim(List1.List(x) 當前項的空格數 p2 = Len(List1.List(x + 1) - Len(Trim(List1.List(x + 1) 當前項的下一項的空格數 If p1 - p2 = 0 Or p1 - p2 = 1 Then 表示無子目錄 judge = 0 p1 - p2 = 1為目錄最后一項與其下一項的空格數的情況 End If p1 - p2 = 0為同級目錄的空格數的情況 If p2 - p1 = 1 Then p2 - p1 = 1為當前目錄含有下級目錄的空格數的情況 judge = -1 End If If p1 0 And p2 = 0 Then judge = 0 表示無子目錄 ; End IfEnd Function 4. 客戶端對目錄的查找 Public Sub FileDir(MyPath As String, spnum As Integer) 查找文件夾 If DirFlag = 0 Then If dir(D:dir.txt) Then Kill D:dir.txt End If Open D:dir.txt For Output As #11 Else Open D:dir.txt For Append As #11 End If If Right(MyPath, 1) Then MyPath = MyPath & End If MyName = dir(MyPath, vbDirectory) 找尋第一項。 Do While MyName 開始循環(huán)。 If MyName . And MyName . Then 跳過當前的目錄及上層目錄。 If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then 使用位比較來確定 MyName 代表一目錄。 If flagg = 1 Then Print #11, RE_DIR & Space(spnum) & + & MyName End If 如果它是一個目錄,將其名稱寫入文件。 End If End IfMyName = dir 查找下一個目錄。 LoopClose #11End SubPublic Sub FileDir1(MyPath As String) 查找文件 If DirFlag = 0 Then If dir(D:file.txt) Then Kill D:file.txt End If Open D:file.txt For Output As #110 Else Open D:dir.txt For Append As #110 End If If Right(MyPath, 1) Then MyPath = MyPath & End If MyName = dir(MyPath, vbArchive)Do While MyName 開始循環(huán) If MyName . And MyName . Then 跳過當前的目錄及上層目錄 If DirFlag = 0 Then Print #110, RE_FLE & - & MyName Else Print #110, RE_FLE & Space(filespace) & - & MyName End If 如果它是文件格式,將其名稱寫入文件。 End If MyName = dir 查找下一個目錄 LoopClose #110End Sub第六章 典型問題分析6.1 動態(tài)添加、刪除客戶端問題服務器端要想實現點對面的數據通信,必須要解決與客戶端之間動態(tài)建立連接和斷開連接的實際問題。在設計起初我采用的方案是服務器端只要接收到客戶端的連接請求,便動態(tài)加載一個winsock數組元素,這樣可以實現動態(tài)與客戶端建立連接,當數組中某一個客戶端與服務器端斷開連接時,服務器端將關閉與該客戶端的連接,并在列表中顯示該客戶端已斷開連接,那么當前該winsock數組元素處于空閑狀態(tài),如果有新的客戶端連接請求到達,服務器端將加載新的winsock數組控件元素與之建立連接。這樣,基本上實現了動態(tài)添加客戶端以及斷開客戶端。但是這樣一來,一旦有客戶端與服務器端斷開連接,在服務器端的空閑下來的winsock控件數組元素會越來越多,造成系統(tǒng)資源的浪費;經過思考設計后,采取以下方案解決:在服務器端監(jiān)聽到客戶端的連接請求時,首先遍歷服務器端的winsock控件數組的連接狀態(tài),查看是否存在空閑的winsock元素,如果存在,則使用該空閑winsock控件元素與客戶端建立連接,否則直接新加載一個winsock數組控件與客戶端建立連接。這樣一來,可實現有多少個客戶端便使用多少個winsock控件數組元素,以致于使得這部分的設計更加合理和人性化。6.2 文件傳送和接收問題對于文件的傳輸,會涉及的問題更廣泛一些,比如小型文件的傳輸、大型文件的傳輸、各種格式的文件傳輸等等。在起初設計時,直接使用winsock傳輸,簡單字符串可以實現收發(fā),但是對于圖片、音頻和視頻文件無法實現。在查閱相關的資料后采用數據分割技術來實現對大型文件的傳輸。具體實現思路如下:以65535的數據大小為一個數據塊,如果當前要傳輸的文件的長度大小在65535以內,則可直接傳輸;如果大于65535,則以65535為一個傳輸單位,對該文件進行分割傳輸,同時不能遺漏所剩余的數據。那么接收方以8192個字節(jié)為單位接收二進制的數據塊,并存儲數據,以此來達到對文件的傳輸。在整個文件傳輸過程中,該模塊起到了十分重要的作用,無論是大型文件還是小文件的傳輸均可使用該模塊來實現傳輸。包括各種格式的文件如.doc .xml .wma .mp3等等,因為該模塊采用的是以二進制的模式對文件數據進行傳輸的。6.3 文件夾傳輸問題在文件夾傳輸實現中,曾使用過很多方法試圖來實現,但都很煩瑣,要考慮的方面實在太多,比如已知要抓取的客戶端機器上的某個文件夾,一種方法是在客戶端遍歷該文件夾,建立該文件夾當下的整個目錄結構,并回傳給服務器端,在服務器端建立好該文件夾的目錄結構,然后服務器端指定目錄下的文件要求客戶端回傳,直到該目錄中的所有文件傳輸完畢完畢為止。那么在這個方案中,實施起來真正困難的地方可能是如果該目錄下嵌套的子目錄非常多,而且包含的文件也很多,那么需要設計一個合理的遍歷算法,以便此后對具體文件的傳輸帶來方便。同時好必須十分明確各子目錄的等級,否則會造成文件的確傳輸到了服務器端,但是里面的文件所屬目錄與客戶端完全不一致,這樣也就造成了該文件夾的整個目錄結構的損壞??紤]以上方案實施起來具有一定的復雜性,我采用了另一種方案,也是本人在偶然的時間發(fā)現的一個解決途徑,平常我們在發(fā)送郵件或從網上下載的軟件都是已經經過壓縮操作,然后再經過解壓縮獲得該文件夾。既然如此,在此傳輸中,我們同樣可以利用此原理來實現對整個文件夾的傳輸。實現的原理如下:客戶端得到服務器給定的文件夾的絕對路徑后,調用rar.exe對該文件夾實行壓縮操作,操作完畢后,將該壓縮文件回傳到服務器端,服務器接收后,調用unrar.exe對該壓縮文件實行解壓縮操作,至此實現了對文件夾的傳輸。采用此方案的有利之處在于無須考慮該文件夾的目錄結構,不用考慮該文件到底有多少個嵌套的子目錄,以及簡化了巧妙的避開了復雜的遍歷算法,且與上一種方案相比,傳輸的準確率也大大提高。6.4 各種命令標志的接收處理問題在整個設計過程中,真正處理的關鍵還是各種命令標志的處理,無論是客戶端還是服務器端都會接收到各種已定義的通信協(xié)議(即命令標志),那么存在著一個問題就是如何合理的處理好文件傳輸和接收,比如服務器端需要抓取客戶端機器上的某個文件,那么服務器端發(fā)送文件抓取命令+該文件路徑,客戶端接收并分析命令后,接下去該如何處理,是直接向服務器端傳送二進制數據?;如果該文件很大,需要分成若干個數據塊來傳送,那么服務器端又以什么來判斷所接收的數據就是該文件的數據;又以什么來判斷該文件已經傳輸完畢。在此前我使用的方案是:對所有命令標志采用六位如“Fl_Len”

溫馨提示

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

評論

0/150

提交評論