【正文】
ry Then 39。 跳過當(dāng)前的目錄及上層目錄。 開始循環(huán)。 找尋第一項(xiàng)。查找文件夾 If DirFlag = 0 Then If dir(D:\) Then Kill D:\ End If Open D:\ For Output As 11 Else Open D:\ For Append As 11 End If If Right(MyPath, 1) \ Then MyPath = MyPath amp。表示無(wú)子目錄 。p1 p2 = 0 為同級(jí)目錄的空格數(shù)的情況 If p2 p1 = 1 Then 39。表示無(wú)子目錄 judge = 0 39。當(dāng)前項(xiàng)的空格數(shù) p2 = Len((x + 1)) Len(Trim((x + 1))) 39。 str(spa) spa = 0 ‘發(fā)送該目錄的完整路徑和空格數(shù)到客戶端讀取 Call modify(p, ) ‘修改該目錄的“ +”號(hào)為“ ” = filepath End If Exit For End If Next p End Sub Public Function judge(x As Integer) As Integer 39。 filepath amp。 3. 服務(wù)器端目錄展開和收起 Private Sub List1_Click() Dim p As Integer For p = 0 To – 1 If (p) = True Then If judge(p) 0 Then 39。移動(dòng) iPos,使它指向下來要讀的數(shù)據(jù) Loop ReDim bytData(1 To LenFile ipos) 39。發(fā)送數(shù)據(jù) Exit Sub End If Do Until (ipos = (LenFile imax)) 39。把文件讀入到數(shù)組里 Close FreeF 39。獲得文件長(zhǎng)度 If LenFile = imax Then ReDim bytData(0 To LenFile) 39。獲得空閑的文件號(hào) Open filename For Binary As FreeF 39。文件的長(zhǎng)度 Dim bytData() As Byte 39。 Trim(str(intMax)) Call RefreshCombox ‘刷新 box列表 End If End Sub Public Function FindOpenWinsock() As Integer Static LocalPorts As Integer For x = 0 To If Winsock1(x).State = 0 Then ‘?dāng)?shù)組中在空閑的 winsock 元素 FindOpenWinsock = x FindOpenWinsockFlag = 1 Exit Function End If Next x Load Winsock1( + 1) ‘不存在直接加載控件元素 LocalPorts = LocalPorts + 1 Winsock1().LocalPort = Winsock1( 1).LocalPort + LocalPorts FindOpenWinsock = End Function 2. 文件傳輸模塊代碼: Public Sub transfer() 39。有空閑控件 intMax 1 intMax amp。無(wú)空閑的 winsock 控件 intMax amp。 主要功能實(shí)現(xiàn)代碼分析 1. 服務(wù)器端動(dòng)態(tài)添加客戶端實(shí)現(xiàn)代碼: Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) If Index = 0 Then intMax = FindOpenWinsock 39。起原理是客戶端分離文件夾路徑后,調(diào)用 對(duì)該文件夾進(jìn)行壓縮處理,這樣一來無(wú)論文件夾下嵌套有多深,包含了多少個(gè)文件,一并作打包處理,然后傳輸給服務(wù)器端;服務(wù)器端完全接收該壓縮文件到指定路徑下,對(duì)該壓縮文件進(jìn)行解壓縮處理,以此來實(shí)現(xiàn)對(duì)整個(gè)文件夾的傳輸。 上述中理論上可以實(shí)現(xiàn)整個(gè)文件夾的傳輸,但是明顯實(shí)現(xiàn)起來比較復(fù)雜,比如該文件夾下所嵌套的子文件夾比較深,所包含的文件也比較多,那么在傳輸過程中所要考慮的問題也就非常的復(fù)雜,要考慮同級(jí)目錄中的文件傳輸和下級(jí)文件的傳輸。 2. 整個(gè)文件夾的傳輸 按照常理來說,對(duì)于文件夾的傳輸其實(shí)就是對(duì)文件的循環(huán)傳輸,原理是:根據(jù)服務(wù)器端給定的文件夾路徑 Winsock1(ClientIndex).SendData Opt~pa amp。 服務(wù)器端回送一個(gè) Ins_Tr的確認(rèn)標(biāo)志后,客戶端開始對(duì)該文件進(jìn)行傳輸??蛻舳朔蛛x信息后,根據(jù)文件路徑取得該文件的長(zhǎng)度,先向服務(wù)器端發(fā)送該文件的長(zhǎng)度 Fl_Len amp。文件傳輸主要分兩種情況來處理: 1. 單個(gè)文件傳輸 理論上單個(gè)文件傳輸相對(duì)于整個(gè)文件夾的傳輸要簡(jiǎn)單的多,服務(wù)器端發(fā)送指令: Winsock1(ClientIndex).SendData Opt_pa amp。 s p a c e _ n u m amp。 開 始p = L i s t 1 . L i st C o u n t 1NYL i s t 1 . S e l e c te d ( p ) = T r u eYj u d g e ( p ) 0NY結(jié) 束 C a l l d e l e t e ( p )W i n s o c k 1 ( C l i e n t I n d e x ) . S e n dD a t a F l _ P a _ amp。 開 始是 否 F l _ P a _ Y分 離 完 整 路 徑服 務(wù) 器 端 指 令 到 達(dá)c a l lF i l e D i r ( p a t h , s p a c e ) 查 找文 件 夾c a l l t r a n s f e r ( ) 傳輸 信 息c a l l F i l e D i r 1 ( p a t h )查 找 文 件N其 他 指 令 的 判 斷 圖 52 客戶端根據(jù)指定目錄查找子目錄和文件主流程 服務(wù)器端查看客戶端的樹形目錄,模擬實(shí)現(xiàn)本機(jī)上的資源管理器來抓取客戶端上的某些文件。對(duì)于具體實(shí)現(xiàn),如圖 52 所示。一旦與客戶端建立連接成功后,服務(wù)器將把該 winsock 的數(shù)組下標(biāo)發(fā)送給該客戶端,如服務(wù)器端是 使用 winsock(2)與客戶端建立連接,則將索引 2 發(fā)送給客戶端,此時(shí)該客戶端就作為“ 2 號(hào)客戶端”,同時(shí)在服務(wù)器端的 listbox 客戶端狀態(tài)列表中作為 2號(hào)客戶端顯示 樹型目錄結(jié)構(gòu)的實(shí)現(xiàn) 樹型目錄結(jié)構(gòu)的顯示是這個(gè)設(shè)計(jì)中的一個(gè) 特點(diǎn),總體是模仿微軟的資源管理器,當(dāng)然外觀效果還不是很完善,其中目錄中“ +”符號(hào)以及空格是目錄之間區(qū)分上下級(jí)的一個(gè)關(guān)鍵標(biāo)志,如上級(jí)目錄和當(dāng)下的文件夾子目錄之間相差一個(gè)空格,而“ +”“ ”符號(hào)主要是對(duì)目錄展開和收起起到一個(gè)指示作用。 51所示 : 表 51 服務(wù)器端標(biāo)志命令 標(biāo)志命令 標(biāo)志解釋 ~Read~ 讀取驅(qū)動(dòng)盤符標(biāo)志信息 Fl_Pa_ 為讀取當(dāng)前選中目錄的當(dāng)下的所有子目錄 ,即展開選中目錄 Opt_pa 傳輸單個(gè)文件標(biāo)志信息 Ins_Tr 確認(rèn)傳輸標(biāo)志 Accept 接收數(shù)據(jù)完畢標(biāo)志 ~MESG~ 消息傳輸標(biāo)志 ~Stop~ 斷開連接標(biāo)志 Opt~pa 傳輸文件夾標(biāo)志信息 2. 客戶端通信協(xié)議定義如下: 表 52 服務(wù)器端標(biāo)志命令 標(biāo)志命令 標(biāo)志解釋 Fl_Dir 壓縮文件夾的長(zhǎng)度標(biāo)志,后跟某壓縮文件夾的長(zhǎng)度,同時(shí)初始化作好接收準(zhǔn)備 ~MESG~ 客戶端信息標(biāo)志 Fl_Len 單個(gè)文件長(zhǎng)度標(biāo)志 ,同時(shí)初始化文件名,用以接收 ~Pause 與客戶端斷開連接標(biāo)志 RE_DIR、 RE_FLE 在顯示數(shù)形目錄結(jié)構(gòu)時(shí)目錄中的文件夾和文件標(biāo)志 動(dòng)態(tài)添加客戶端 單個(gè)客戶端與服務(wù)器通過 winsock 控件實(shí)現(xiàn)通信以后,必須結(jié)合實(shí)際情況 實(shí)現(xiàn)多個(gè)客戶 端與服務(wù)器之間的數(shù)據(jù)通信,這就涉及到服務(wù)器需要有動(dòng)態(tài)添加客戶端的能力,與請(qǐng)求連接的客戶端建立彼此間連接。相關(guān)命令標(biāo)志處理和臨時(shí) 處理均使用文件,操作起來比較簡(jiǎn)便。那么在設(shè)計(jì)對(duì)于一些不常規(guī)的輸入和操作均作了相應(yīng)的限制,從某種程度上提升了軟件的穩(wěn)定性。 性能需求 1. 穩(wěn)定性 在程序設(shè)計(jì)中應(yīng)當(dāng)考慮到各種可能發(fā)生的情況,進(jìn)而避免常規(guī)或者一些低級(jí)錯(cuò)誤。 5. 文件夾的傳輸 :除了單個(gè)文件實(shí)現(xiàn)傳輸以外,還需要實(shí)現(xiàn)對(duì)整個(gè)文件夾的傳輸。 3. 字符和字符串的傳輸 :可以與客戶端之間進(jìn)行簡(jiǎn)單的消息通信,雙方可以交互信息。也可以打開和關(guān)閉端口 Input 從接 收緩沖區(qū)返回和刪除字符 Output 向傳輸緩沖區(qū)寫一個(gè)字符串 IuBufferCount 用于返回在接收緩沖區(qū)中的字符數(shù) InputMode 設(shè)置或返回 Input 屬性取回的數(shù)據(jù)類型 表 22 MSComm控件事件 事件 描述 EventBreak 收到中斷信號(hào) EventCDTO 載波檢測(cè)超時(shí) EventCTSTO CTS 信號(hào)超時(shí) EventDSRTO DSR 信號(hào)超時(shí) EventFrame 發(fā)送框架發(fā)生錯(cuò)誤 EventOverrun 數(shù)據(jù)遺 失 EventRxOver 接收緩沖區(qū)滿溢 EventRxParity 極性錯(cuò)誤 EventTxFull 發(fā)送緩沖區(qū)已滿 EventDCB 連接時(shí)發(fā)生非預(yù)期錯(cuò)誤 EvCD CD線的狀態(tài)發(fā)生變化 EvCTS CTS 線的狀態(tài)發(fā)生變化 EvDSR DSR 線的狀態(tài)發(fā)生變化 EvRing Ring Indicator 變化 EvReceive RThresholdof chars 第三章 需求分析 功能需求 1. 動(dòng)態(tài)添加客戶端: 服務(wù)器端能夠?qū)崿F(xiàn)與多個(gè)客戶端之間建立連接并進(jìn)行通信。新一代的計(jì)算機(jī)均以 9引腳接頭接出所有的 RS232通信端口。 RS232 串行通信端口是每臺(tái)計(jì)算機(jī)上的必要 配備,通常有 COM1 和 COM2 兩個(gè)端口?,F(xiàn)在,串行通信端口( RS232)是計(jì)算機(jī)上的標(biāo)準(zhǔn)配置,用途上則以連接調(diào)制解調(diào)器來傳輸數(shù)據(jù)最為常見 ,如圖 21所示為串口外觀 。 Error: 當(dāng)在工作中發(fā)生任何錯(cuò)誤都會(huì)觸發(fā)這個(gè)事件。 DataArrival: 當(dāng)建立連接后,接受到了新數(shù)據(jù)就會(huì)觸發(fā)這個(gè)事件。 SendProgress 事件記錄了當(dāng)前狀態(tài)下已發(fā)送的字節(jié)數(shù)和剩余字節(jié)數(shù)。 (3) 事件 ConnectRequest: 當(dāng) 本 地 計(jì) 算 機(jī) 接 收 到