版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、畢業(yè)設(shè)計(jì)說(shuō)明書(200 8屆)基于vb的網(wǎng)絡(luò)數(shù)據(jù)傳輸學(xué)生姓名 學(xué) 號(hào) 系 別 信息與電子系 專業(yè)班級(jí) 計(jì)算機(jī)0402 指導(dǎo)教師 完成日期 2008年5月20日 基于vb的網(wǎng)絡(luò)數(shù)據(jù)傳輸摘要 隨著internet的普及和工業(yè)自動(dòng)化的迅速發(fā)展,網(wǎng)絡(luò)已深入家庭、辦公室、工廠、自動(dòng)化控制領(lǐng)域。人們?cè)诟鱾€(gè)地方都可通過(guò)互聯(lián)網(wǎng)來(lái)交換信息,因而網(wǎng)絡(luò)數(shù)據(jù)傳輸就顯得尤為的重要。在vb中就提供了支持?jǐn)?shù)據(jù)傳輸?shù)目丶?,如:winsock控件和mscomm控件等。通過(guò)程序開發(fā)和控件的使用, 可實(shí)現(xiàn)網(wǎng)絡(luò)的數(shù)據(jù)通信,滿足網(wǎng)絡(luò)用戶對(duì)數(shù)據(jù)通信和數(shù)據(jù)交換的需求。在本文中介紹了利用winsock控件編程實(shí)現(xiàn)c/s模式的數(shù)據(jù)傳輸;同時(shí)在
2、rs-232串口通信中使用mscomm控件編程來(lái)模擬實(shí)現(xiàn)對(duì)受控方的相關(guān)操作。關(guān)鍵詞 winsock控件;客戶端/服務(wù)器模式;網(wǎng)絡(luò)數(shù)據(jù)傳輸;串口通信;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. peo
3、ple 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
4、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
5、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 數(shù)據(jù)傳輸及通信概述51.2 課題選擇71.3 論文結(jié)構(gòu)7第二章 概述82.1 winsock控件簡(jiǎn)述92.1.1 winso
6、ck控件介紹92.1.2 winsock控件重要屬性、方法、和事件92.2 rs-232串口通信概述122.2.1 rs-232串口通信簡(jiǎn)述122.2.2 mscomm控件重要屬性、方法和事件12第三章 需求分析143.1 功能需求153.2 性能需求15第四章 總體設(shè)計(jì)154.1 功能模塊圖154.2 c/s模型時(shí)序圖164.3 客戶端、服務(wù)器界面設(shè)計(jì)17第五章 詳細(xì)設(shè)計(jì)215.1 構(gòu)架模型215.2 通信協(xié)議215.3 動(dòng)態(tài)添加客戶端225.4 樹型目錄結(jié)構(gòu)的實(shí)現(xiàn)235.5 文件傳輸模塊33第六章 典型問題分析386.1 動(dòng)態(tài)添加、刪除客戶端問題386.2 文件傳送和接收問題386.3 文
7、件夾傳輸問題386.4 各種命令標(biāo)志的接收處理問題39第七章 網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)膽?yīng)用417.1 網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)膽?yīng)用417.2 網(wǎng)絡(luò)數(shù)據(jù)傳輸與rs-232串口通信結(jié)合應(yīng)用41第八章 設(shè)計(jì)心得及軟件不足438.1 設(shè)計(jì)心得438.2 軟件不足43致 謝44參考文獻(xiàn)45附 錄46第一章 緒論1.1數(shù)據(jù)傳輸及通信概述1. 數(shù)據(jù)通信方式按傳輸方向分有:(1) 單工通信:在單工信道上信息只能在一個(gè)方向傳送。(2) 半雙工通信:在半雙工信道上,通信的雙方可交替發(fā)送和接收信息。(3) 全雙工通信:一種可以同時(shí)進(jìn)行雙向信息傳送的通信方式。按同步方式分:(1) 異步傳輸:把各個(gè)字符分開傳輸,字符之間插入同步信息。其優(yōu)
8、點(diǎn)是簡(jiǎn)單,但由于起止位和檢驗(yàn)位的加入會(huì)引入20%30%的開銷,傳輸?shù)乃俾室膊桓?。?) 同步傳輸:發(fā)送方在發(fā)送數(shù)據(jù)之前先發(fā)送一串同步字符sync。2交換方式:(1) 線路交換:交換的特點(diǎn)是建立連接需要等待較長(zhǎng)的時(shí)間。特點(diǎn):連接建立后通路是專用的。不再有傳輸延遲,這種交換方式適合于傳輸大量的數(shù)據(jù)。在傳輸少量信息時(shí)效率不高。(2) 報(bào)文交換:特點(diǎn):不建立專用鏈路。線路利用率較高。電子郵件系統(tǒng)(例如e-mail)適合采用報(bào)文交換方式。(3) 分組交換:有兩種方式:數(shù)據(jù)報(bào):類似于報(bào)文交換。引入分組拆裝設(shè)備pad(packet assembly and disassembly device)。虛電路:類
9、似于電路交換。 虛電路與線路交換的區(qū)別:邏輯連接并不意味著別的通信不能使用這條線路。它仍然具有線路共享的優(yōu)點(diǎn)。虛電路與數(shù)據(jù)報(bào)的區(qū)別:虛電路意味著可靠的通信,它涉及更多的技術(shù),需要更在的開銷。沒有數(shù)據(jù)報(bào)方式靈活,效率不如數(shù)據(jù)報(bào)方式高。虛電路適合于交互式通信,數(shù)據(jù)報(bào)方式更適合于單向地傳送短信息。虛電路可以是暫時(shí)的,即會(huì)話開始建立,會(huì)話結(jié)束拆除,這叫虛呼叫;也可以是永久的,即通信雙方一開機(jī)就自動(dòng)建立,直到一方(或同時(shí))關(guān)機(jī)才拆除。這叫永久虛電路。 分組交換的特點(diǎn):數(shù)據(jù)包有固定的長(zhǎng)度。采用固定的、短的分組相對(duì)于報(bào)文交換是一個(gè)重要的優(yōu)點(diǎn)。除了交換結(jié)點(diǎn)的存儲(chǔ)緩沖區(qū)可以不些外,也帶來(lái)了傳播時(shí)延的減少,分組交
10、換也意味著按分組糾錯(cuò):發(fā)現(xiàn)錯(cuò)誤只需重發(fā)出錯(cuò)的分組,使通信效率提高。1.2 課題選擇隨著internet的普及和工業(yè)自動(dòng)化的迅速發(fā)展,網(wǎng)絡(luò)已深入家庭、辦公室、工廠、自動(dòng)化控制領(lǐng)域。人們?cè)诟鱾€(gè)地點(diǎn)都可通過(guò)互聯(lián)網(wǎng)來(lái)交換信息。因而網(wǎng)絡(luò)數(shù)據(jù)傳輸就顯得尤為的重要。鑒于對(duì)網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)谋匾院椭匾缘目紤],我選擇了基于vb的網(wǎng)絡(luò)數(shù)據(jù)傳輸來(lái)作為畢業(yè)設(shè)計(jì)的課題。其意義在于網(wǎng)絡(luò)數(shù)據(jù)傳輸相對(duì)與整個(gè)互聯(lián)網(wǎng)絡(luò)來(lái)說(shuō)有著至關(guān)重要的作用,缺失數(shù)據(jù)傳輸、數(shù)據(jù)交換,那每一臺(tái)計(jì)算機(jī)只能是孤立的存在,因而這一領(lǐng)域有待我們?nèi)ラ_拓、研究,其中有許多求知部分有待去填補(bǔ)。1.3 論文結(jié)構(gòu)本論文介紹了網(wǎng)絡(luò)數(shù)據(jù)的必要性與實(shí)際應(yīng)用,重點(diǎn)從wins
11、ock控件進(jìn)行分析設(shè)計(jì),詳細(xì)介紹了基于vb語(yǔ)言進(jìn)行c/s模式的設(shè)計(jì)。全文分為九個(gè)章節(jié)。第一章 緒論。主要闡述了網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)臅r(shí)代背景和現(xiàn)實(shí)需求。第二章 概述。從大體上闡述了基于vb語(yǔ)言來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的傳輸方式方法和可用的途徑。第三章 需求分析。敘述了設(shè)計(jì)的功能需求和性能需求,明確了軟件的主題方向。第四章 總體設(shè)計(jì)。本章主要介紹軟件設(shè)計(jì)的總體功能模塊圖,c/s模式的時(shí)序圖以及軟件設(shè)計(jì)的服務(wù)器端和客戶端的相關(guān)界面的簡(jiǎn)介。第五章 詳細(xì)設(shè)計(jì)。本章分六個(gè)小節(jié),分別從構(gòu)架模型、通信協(xié)議、動(dòng)態(tài)添加客戶端、樹型目錄結(jié)構(gòu)的顯示、文件傳輸以及主要功能模塊的代碼分析來(lái)闡述整個(gè)設(shè)計(jì)的詳細(xì)情況。第六章 典型問題分析。本
12、章主要針對(duì)在設(shè)計(jì)過(guò)程中所涉及到的一些難點(diǎn)問題的分析,分四個(gè)小節(jié)闡述了四個(gè)方面值得研究討論的問題。第七章 網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)膽?yīng)用。本章主要是敘述了網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)南鄳?yīng)的實(shí)際應(yīng)用,并將本設(shè)計(jì)與實(shí)際應(yīng)用相結(jié)合。在本章第二小節(jié)中具體結(jié)合rs-232串口通信實(shí)現(xiàn)對(duì)模擬設(shè)備的相關(guān)狀態(tài)數(shù)據(jù)的接收,以達(dá)到遠(yuǎn)程對(duì)設(shè)備的控制的目的。第八章 設(shè)計(jì)心得及軟件不足。本章主要論述了在完成整個(gè)軟件過(guò)程中的一些心得體會(huì)以及本軟件尚存的不足之處。第九章 致謝。第二章 概 述visual basic 是microsoft 公司開發(fā)的windows 應(yīng)用程序開發(fā)工具,visual 可視化的,是一種開發(fā)圖形戶界面(gui)的方法.使得非計(jì)
13、算機(jī)專業(yè)的人也可以開發(fā)出專業(yè)的windows軟件. visual basic繼承了basic語(yǔ)言簡(jiǎn)單易學(xué)的優(yōu)點(diǎn),又增加了許多新的功能,它采用面向?qū)ο笈c事件驅(qū)動(dòng)的程序設(shè)計(jì)思想,使編程變得更加方便,快捷.使用visual basic既可以開發(fā)個(gè)人或小組使用的小型工具,又可以開發(fā)多媒體軟件,數(shù)據(jù)庫(kù)應(yīng)用程序,網(wǎng)絡(luò)應(yīng)用程序等大型軟件.是國(guó)內(nèi)外最流行的程序設(shè)計(jì)語(yǔ)言之一.基于visual basic這種操作簡(jiǎn)便、功能強(qiáng)大的優(yōu)點(diǎn),結(jié)合網(wǎng)絡(luò)實(shí)際情況和需要,研究開發(fā)基于visual basic的網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)能浖?。在本文中?jiǎn)單介紹了網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)南嚓P(guān)協(xié)議,如tcp/ip協(xié)議和udp協(xié)議;在實(shí)現(xiàn)過(guò)程中用到的核心控件
14、,如winsock控件和mscomm控件;介紹了利用winsock控件實(shí)現(xiàn)客戶端和服務(wù)器之間的通信原理;利用mscomm控件來(lái)模擬對(duì)設(shè)備的監(jiān)控,通過(guò)兩臺(tái)模擬機(jī)實(shí)現(xiàn)各個(gè)狀態(tài)信息讀取及相關(guān)操作,從另一方面(即rs-232串口通信)來(lái)體現(xiàn)數(shù)據(jù)傳輸。2.1 winsock控件簡(jiǎn)述2.1.1 winsock控件介紹 winsock即windows socket,是微軟公司對(duì)socket編程接口的集成。winsock控件用于windows socket接口簡(jiǎn)化成易于使用的visual basic內(nèi)部接口,從而避免通過(guò)訪問dll來(lái)到如windows socket函數(shù),和其他控件一樣,有著使用方便的特點(diǎn)。但是
15、winsock控件并不能完全取代socket函數(shù),它使用ip協(xié)議,并支持tcp和udp協(xié)議,但是支持程度偏低,像多播和廣播等特性無(wú)法支持,不過(guò)在僅僅需要基本的網(wǎng)絡(luò)數(shù)據(jù)通信的前提下,windows控件仍然是最好的選擇。2.1.2 winsock控件重要屬性、方法、和事件(1) 屬性protocol:通過(guò)protocol屬性可以設(shè)置winsock控件連接遠(yuǎn)程計(jì)算機(jī)使用的協(xié)議??蛇x的協(xié)議是tcp和udp,對(duì)應(yīng)的vb中常量分別是scktcpprotocol和sckudpprotocol,winsock控件默認(rèn)協(xié)議是tcp。注意:雖然可以在運(yùn)行時(shí)設(shè)置協(xié)議,但必須在連接未建立或斷開連接后。socketha
16、ndle:sockethandle返回當(dāng)前socket連接的句柄,這是只讀屬性。remotehostip:返回遠(yuǎn)程計(jì)算機(jī)的ip地址。在客戶端,當(dāng)使用了控件的connect方法后,遠(yuǎn)程計(jì)算機(jī)的ip地址就賦給了remotehostip屬性,而在服務(wù)器端,當(dāng)connectrequest事件后,遠(yuǎn)程計(jì)算機(jī)(客戶端)的ip地址就賦給了這個(gè)屬性。如果使用的是udp協(xié)議那么當(dāng)dataarrival事件后,發(fā)送udp報(bào)文的計(jì)算機(jī)的ip才賦給了這個(gè)屬性。bytereceived:返回當(dāng)前接收緩沖區(qū)中的字節(jié)數(shù)。state:用于返回當(dāng)前winsock控件的狀態(tài)。如表2-1所示。表2-1 返回winsock控件當(dāng)前的
17、狀態(tài)常數(shù)值描述sckclosed0缺省值,關(guān)閉sckopen1打開scklistening2偵聽sckconnectionpending3連接掛起sckresolvinghost4識(shí)別主機(jī)sckhostresolved5已識(shí)別主機(jī)sckconnecting6正在連接sckconnected7已連接sckclosing8同級(jí)人員正在關(guān)閉連接sckerror9錯(cuò)誤(2) 方法bind:用bind方法可以把一個(gè)端口號(hào)固定為本控件使用,使得別的應(yīng)用程序能再使用這個(gè)端口。listen:只在使用tcp協(xié)議時(shí)有用。它將應(yīng)用程序置于監(jiān)聽檢測(cè)狀態(tài)。connect:當(dāng)本地計(jì)算機(jī)希望和遠(yuǎn)程計(jì)算機(jī)建立連接時(shí),就可以調(diào)
18、用connect方法。accept:當(dāng)服務(wù)器接收到客戶端的連接請(qǐng)求后,服務(wù)器有權(quán)決定是否接受客戶端的請(qǐng)求。senddata:當(dāng)連接建立后,要發(fā)送數(shù)據(jù)就可以調(diào)用senddata方法,該方法只有一個(gè)參數(shù),就是要發(fā)送的數(shù)據(jù)。getdata:當(dāng)本地計(jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)的數(shù)據(jù)時(shí),數(shù)據(jù)存放在緩沖區(qū)中,要從緩沖區(qū)中取出數(shù)據(jù),可以使用getdata方法。peekdata:和getdata方法類似,但peekdata在取得數(shù)據(jù)后并不把緩沖區(qū)清空。(3) 事件connectrequest:當(dāng)本地計(jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)發(fā)送的連接請(qǐng)求時(shí),控件的connectrequest事件將會(huì)被觸發(fā)。sendprogress:當(dāng)
19、一端的計(jì)算機(jī)正在向另一端的計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),sendprogress事件將被觸發(fā)。sendprogress事件記錄了當(dāng)前狀態(tài)下已發(fā)送的字節(jié)數(shù)和剩余字節(jié)數(shù)。sendcomplete:當(dāng)所有數(shù)據(jù)發(fā)送完成時(shí),被觸發(fā)。dataarrival:當(dāng)建立連接后,接受到了新數(shù)據(jù)就會(huì)觸發(fā)這個(gè)事件。注意:如果在接受到新數(shù)據(jù)前,緩沖區(qū)中非空,就不會(huì)觸發(fā)這個(gè)事件。error:當(dāng)在工作中發(fā)生任何錯(cuò)誤都會(huì)觸發(fā)這個(gè)事件。2.2 rs-232串口通信概述2.2.1 rs-232串口通信簡(jiǎn)述串行通信端口(serial communication port)在系統(tǒng)控制的范圍中一直占據(jù)著及其重要的地位,它不僅沒有因?yàn)闀r(shí)代的進(jìn)步而遭
20、淘汰,反而在規(guī)格上越來(lái)越完善,應(yīng)用也越來(lái)越廣泛?,F(xiàn)在,串行通信端口(rs-232)是計(jì)算機(jī)上的標(biāo)準(zhǔn)配置,用途上則以連接調(diào)制解調(diào)器來(lái)傳輸數(shù)據(jù)最為常見,如圖2-1所示為串口外觀。當(dāng)然,它的重要性還不只如此。rs-232串行通信端口是每臺(tái)計(jì)算機(jī)上的必要-配備,通常有com1和com2兩個(gè)端口。一般計(jì)算機(jī)將com1端口以9引腳的接頭接出,而以25腳的接頭將com2端口接出。新一代的計(jì)算機(jī)均以9引腳接頭接出所有的rs-232通信端口。圖2-1 串口外觀圖2.2.2 mscomm控件重要屬性、方法和事件不同于其他控件,mscomm只有一個(gè)事件即oncomm事件,所有可能發(fā)生的狀況(錯(cuò)誤或引發(fā)通信事件)都集
21、中在這個(gè)事件中處理,通過(guò)對(duì)這些狀況的處理來(lái)實(shí)現(xiàn)各種控制和傳輸,如下表列的即為mscomm控件的oncomm事件中所含的各種可能出現(xiàn)的事件狀況:表2-1 mscomm控件屬性屬性描述commport設(shè)置并返回通訊端口號(hào)settings字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止portopen設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口input從接收緩沖區(qū)返回和刪除字符output向傳輸緩沖區(qū)寫一個(gè)字符串iubuffercount用于返回在接收緩沖區(qū)中的字符數(shù)inputmode設(shè)置或返回input屬性取回的數(shù)據(jù)類型表2-2 mscomm控件事件事件描述comeventbreak收到中
22、斷信號(hào)comeventcdto載波檢測(cè)超時(shí)comeventctstocts信號(hào)超時(shí)comeventdsrtodsr信號(hào)超時(shí)comeventframe發(fā)送框架發(fā)生錯(cuò)誤comeventoverrun數(shù)據(jù)遺失comeventrxover接收緩沖區(qū)滿溢comeventrxparity極性錯(cuò)誤comeventtxfull發(fā)送緩沖區(qū)已滿comeventdcb連接時(shí)發(fā)生非預(yù)期錯(cuò)誤comevcdcd線的狀態(tài)發(fā)生變化comevctscts線的狀態(tài)發(fā)生變化comevdsrdsr線的狀態(tài)發(fā)生變化comevringring indicator 變化comevreceiverthreshold#of chars第三章
23、需求分析3.1 功能需求1. 動(dòng)態(tài)添加客戶端:服務(wù)器端能夠?qū)崿F(xiàn)與多個(gè)客戶端之間建立連接并進(jìn)行通信。2. 客戶端樹型目錄結(jié)構(gòu)顯示:服務(wù)器可以顯示客戶端的樹型目錄結(jié)構(gòu),能夠方面的抓取客戶端機(jī)器上的任何文件。3. 字符和字符串的傳輸:可以與客戶端之間進(jìn)行簡(jiǎn)單的消息通信,雙方可以交互信息。4. 各種格式的文件傳輸:對(duì)于不同格式的文件如視頻、音頻、常用文件word,excel,txt等等,可以實(shí)現(xiàn)傳輸操作。5. 文件夾的傳輸:除了單個(gè)文件實(shí)現(xiàn)傳輸以外,還需要實(shí)現(xiàn)對(duì)整個(gè)文件夾的傳輸。6. 單個(gè)發(fā)送和群發(fā):對(duì)于消息可以指定發(fā)送也可以群發(fā)消息,同時(shí)也可以實(shí)現(xiàn)對(duì)服務(wù)器端某個(gè)文件指定客戶端發(fā)送也可以群發(fā)給所有連接
24、成功發(fā)客戶端。3.2 性能需求1. 穩(wěn)定性在程序設(shè)計(jì)中應(yīng)當(dāng)考慮到各種可能發(fā)生的情況,進(jìn)而避免常規(guī)或者一些低級(jí)錯(cuò)誤。一旦發(fā)生任何錯(cuò)誤或突發(fā)事件,系統(tǒng)要能夠正常運(yùn)行甚至及時(shí)糾錯(cuò),不至于癱瘓而使得軟件無(wú)法運(yùn)行下去。那么在設(shè)計(jì)對(duì)于一些不常規(guī)的輸入和操作均作了相應(yīng)的限制,從某種程度上提升了軟件的穩(wěn)定性。2. 易用性本程序僅僅是一個(gè)雛形,容易上手,操作簡(jiǎn)單,使用過(guò)程一目了然。相關(guān)命令標(biāo)志處理和臨時(shí)處理均使用文件,操作起來(lái)比較簡(jiǎn)便。 第四章 總體設(shè)計(jì)4.1 功能模塊圖圖4-1 c/s模式總體功能模塊4.2 c/s模型時(shí)序圖圖4-2面向連接的c/s模型時(shí)序圖4.3 客戶端、服務(wù)器界面設(shè)計(jì)圖4-3 服務(wù)器主界面
25、圖4-4 服務(wù)器端帶消息窗口界面圖4-5 客戶端主界面第五章 詳細(xì)設(shè)計(jì)5.1 構(gòu)架模型圖5-1 c/s 模型構(gòu)架圖5.2 通信協(xié)議在開始編程之前首先應(yīng)當(dāng)對(duì)客戶端和服務(wù)器之間的通信協(xié)議進(jìn)行定義,以便雙方在通信過(guò)程中可以方便的識(shí)別彼此的通信指令和標(biāo)志。1.服務(wù)器端通信協(xié)議定義如表5-1所示:表5-1 服務(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)志optpa傳輸文件夾標(biāo)志信息2. 客戶端通信協(xié)議定義如
26、下:表5-2 服務(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)志5.3 動(dòng)態(tài)添加客戶端單個(gè)客戶端與服務(wù)器通過(guò)winsock控件實(shí)現(xiàn)通信以后,必須結(jié)合實(shí)際情況實(shí)現(xiàn)多個(gè)客戶端與服務(wù)器之間的數(shù)據(jù)通信,這就涉及到服務(wù)器需要有動(dòng)態(tài)添加客戶端的能力,與請(qǐng)求連接的客戶端建立彼此間連接。在設(shè)計(jì)中我采用winsock數(shù)組來(lái)實(shí)現(xiàn)服務(wù)器端的動(dòng)態(tài)添加功能,winsock(0)設(shè)計(jì)為
27、服務(wù)器端一直保持監(jiān)聽客戶端連接請(qǐng)求的控件,如果監(jiān)聽到有客戶端的連接請(qǐng)求,首先查找數(shù)組中是否存在空閑的winsock(x),如果存在,則使用該winsock(x)與之建立連接,反之加載一個(gè)新的winsock數(shù)組控件與之建立連接。一旦與客戶端建立連接成功后,服務(wù)器將把該winsock的數(shù)組下標(biāo)發(fā)送給該客戶端,如服務(wù)器端是使用winsock(2)與客戶端建立連接,則將索引2發(fā)送給客戶端,此時(shí)該客戶端就作為“2號(hào)客戶端”,同時(shí)在服務(wù)器端的listbox客戶端狀態(tài)列表中作為2號(hào)客戶端顯示5.4 樹型目錄結(jié)構(gòu)的實(shí)現(xiàn)樹型目錄結(jié)構(gòu)的顯示是這個(gè)設(shè)計(jì)中的一個(gè)特點(diǎn),總體是模仿微軟的資源管理器,當(dāng)然外觀效果還不是很完
28、善,其中目錄中“+”符號(hào)以及空格是目錄之間區(qū)分上下級(jí)的一個(gè)關(guān)鍵標(biāo)志,如上級(jí)目錄和當(dāng)下的文件夾子目錄之間相差一個(gè)空格,而“+”“-”符號(hào)主要是對(duì)目錄展開和收起起到一個(gè)指示作用。該功能設(shè)計(jì)的總體思路如下:當(dāng)服務(wù)器端選種“客戶端狀態(tài)”列表中連接成功的客戶端時(shí),向該客戶端發(fā)送命令標(biāo)志,要求回傳其磁盤驅(qū)動(dòng)列表信息如c盤,d盤等;如果服務(wù)器端繼續(xù)點(diǎn)選某磁盤驅(qū)動(dòng),則向客戶端發(fā)送該磁盤路徑,要求返回該磁盤當(dāng)下所有的文件夾和文件信息,返回后,在該磁盤當(dāng)下顯示文件夾目錄,并在“文檔”列表中顯示該磁盤驅(qū)動(dòng)下的文件名,依次類推,可逐級(jí)顯示目錄信息;如果某級(jí)目錄已經(jīng)展開,那么起前將顯示“-”符號(hào),再次點(diǎn)擊該目錄時(shí),將收
29、起該目錄(即刪除該目錄下的所有信息),此時(shí)其前面將顯示“+”符號(hào)。對(duì)于具體實(shí)現(xiàn),如圖5-2所示。以下是客戶端根據(jù)服務(wù)器端指定的目錄路徑進(jìn)行相應(yīng)的查找,并返回該目錄下的子目錄和文件名稱。圖 5-2 客戶端根據(jù)指定目錄查找子目錄和文件主流程服務(wù)器端查看客戶端的樹形目錄,模擬實(shí)現(xiàn)本機(jī)上的資源管理器來(lái)抓取客戶端上的某些文件。在實(shí)現(xiàn)過(guò)程中考慮到目錄的深淺,如果初始化就將客戶端的所有目錄全部顯示在列表中,會(huì)帶來(lái)不必要的麻煩,所以采取的方法是服務(wù)器端點(diǎn)選某級(jí)目錄就向客戶端發(fā)送讀區(qū)該級(jí)目錄的命令,以達(dá)到減少時(shí)間復(fù)雜度和空間復(fù)雜度的目的,具體實(shí)現(xiàn)流程如圖5-3所示。圖5-3 服務(wù)器端查看樹形目錄主流程5.5 文
30、件傳輸模塊文件傳輸?shù)膶?shí)現(xiàn)主要是在客戶端處理,客戶端接收到服務(wù)器端的文件傳輸?shù)闹噶詈?,采取相?yīng)的處理。文件傳輸主要分兩種情況來(lái)處理: 1. 單個(gè)文件傳輸理論上單個(gè)文件傳輸相對(duì)于整個(gè)文件夾的傳輸要簡(jiǎn)單的多,服務(wù)器端發(fā)送指令:winsock1(clientindex).senddata opt_pa & label2.caption,其中opt_pa為單個(gè)文件傳輸?shù)臉?biāo)志,label2.caption為該文件在客戶端的絕對(duì)路徑??蛻舳朔蛛x信息后,根據(jù)文件路徑取得該文件的長(zhǎng)度,先向服務(wù)器端發(fā)送該文件的長(zhǎng)度winsock1.senddata fl_len & lenfile1,目的是為了在文件傳輸過(guò)程中能
31、夠判斷該文件是否傳輸完畢。服務(wù)器端回送一個(gè)ins_tr的確認(rèn)標(biāo)志后,客戶端開始對(duì)該文件進(jìn)行傳輸。對(duì)文件的傳輸?shù)木唧w實(shí)現(xiàn),需要考慮幾種情況,對(duì)于小型文件可以直接利用winsock傳輸,但是對(duì)于大型文件或視頻文件的傳輸必須采用分割技術(shù)來(lái)實(shí)現(xiàn),基于以上的考慮,無(wú)論是大型文件還是小型的文件的傳輸首先判斷其長(zhǎng)度是否大于65535,如果小于則直接傳輸,否則對(duì)該文件進(jìn)行分塊傳輸(以8k為一個(gè)傳輸塊),數(shù)據(jù)塊傳輸完畢后,還必須考慮所剩下的數(shù)據(jù),如果存在剩余的數(shù)據(jù)也要進(jìn)行傳輸。2. 整個(gè)文件夾的傳輸按照常理來(lái)說(shuō),對(duì)于文件夾的傳輸其實(shí)就是對(duì)文件的循環(huán)傳輸,原理是:根據(jù)服務(wù)器端給定的文件夾路徑winsock1(cl
32、ientindex).senddata optpa & label2.caption,其中optpa為文件夾傳輸標(biāo)志,label2.caption為文件夾的絕對(duì)路徑,客戶端分離路徑后首先查找該文件夾下的所有子文件夾和文件的名稱,保存在文件中傳輸?shù)椒?wù)器端,在服務(wù)器端建立該文件夾及其包含的所有子目錄和文件名稱,然后客戶端循環(huán)傳輸文件。上述中理論上可以實(shí)現(xiàn)整個(gè)文件夾的傳輸,但是明顯實(shí)現(xiàn)起來(lái)比較復(fù)雜,比如該文件夾下所嵌套的子文件夾比較深,所包含的文件也比較多,那么在傳輸過(guò)程中所要考慮的問題也就非常的復(fù)雜,要考慮同級(jí)目錄中的文件傳輸和下級(jí)文件的傳輸。經(jīng)過(guò)多次試驗(yàn)后,找到一種替代方法,同樣可以是實(shí)現(xiàn)整個(gè)
33、文件夾的傳輸,但在原理上有區(qū)別于上面的傳輸途徑:主要是利用微軟rar.exe和unrar.exe可以簡(jiǎn)單的實(shí)現(xiàn)文件夾的傳輸。起原理是客戶端分離文件夾路徑后,調(diào)用rar.exe對(duì)該文件夾進(jìn)行壓縮處理,這樣一來(lái)無(wú)論文件夾下嵌套有多深,包含了多少個(gè)文件,一并作打包處理,然后傳輸給服務(wù)器端;服務(wù)器端完全接收該壓縮文件到指定路徑下,對(duì)該壓縮文件進(jìn)行解壓縮處理,以此來(lái)實(shí)現(xiàn)對(duì)整個(gè)文件夾的傳輸。無(wú)論是單個(gè)文件還是整個(gè)文件夾的傳輸,都使用了如圖5.4.1-3 所示的流程來(lái)傳輸。5.6 主要功能實(shí)現(xiàn)代碼分析 1. 服務(wù)器端動(dòng)態(tài)添加客戶端實(shí)現(xiàn)代碼:private sub winsock1_connectionreq
34、uest(index as integer, byval requestid as long) if index = 0 then intmax = findopenwinsock 判斷列表中是否有存在已斷開的winsock控件 winsock1(intmax).accept requestid if findopenwinsockflag = 0 then 無(wú)空閑的winsock控件 list3.additem intmax & 號(hào)客戶端連接成功 else 有空閑控件 list3.removeitem intmax - 1 list3.additem intmax & 號(hào)客戶端連接成功, i
35、ntmax - 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 數(shù)組中在空閑的winsock元素 findopenwinsoc
36、k = 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 transfe
37、r() 核心模塊,用以傳輸 dim freef as integer dim lenfile as long 文件的長(zhǎng)度 dim bytdata() as byte 存放數(shù)據(jù)的數(shù)組 dim ipos as long const imax = 65535 freef = freefile 獲得空閑的文件號(hào) open filename for binary as #freef 打開文件 doevents lenfile = lof(freef) 獲得文件長(zhǎng)度if lenfile = (lenfile - imax) 發(fā)送整塊數(shù)據(jù)的循環(huán) redim bytdata(1 to imax) get #f
38、reef, ipos + 1, bytdata winsock1.senddata bytdataipos = ipos + imax 移動(dòng)ipos,使它指向下來(lái)要讀的數(shù)據(jù) loopredim bytdata(1 to lenfile - ipos) 發(fā)送剩下的不夠一個(gè)數(shù)據(jù)塊的數(shù)據(jù) get #freef, ipos + 1, bytdata winsock1.senddata bytdata close #freefend sub 這里要注意的是,必須檢查文件有沒有剩下的數(shù)據(jù),如果文件大小正好等于數(shù)據(jù)塊大小的整數(shù)倍,那么就沒有剩下的數(shù)據(jù)了。3. 服務(wù)器端目錄展開和收起 private sub
39、list1_click()dim p as integerfor p = 0 to list1.listcount 1 if list1.selected(p) = true then if judge(p) 0 then 判斷有無(wú)子目錄 ,不等于 0為有子目錄 call delete(p) 刪除該目錄下的所有子目錄,達(dá)到收起的效果 label2.caption = else 等于 0為無(wú)子目錄 indexvalue = p winsock1(clientindex).senddata fl_pa_ & filepath & space_num & str(spa) spa = 0 發(fā)送該目錄
40、的完整路徑和空格數(shù)到客戶端讀取 call modify(p, -) 修改該目錄的“+”號(hào)為“-” label2.caption = filepath end if exit for end ifnext pend subpublic function judge(x as integer) as integer 判斷當(dāng)前選中項(xiàng)是否含有子目錄 dim p1 as integer, p2 as integer p1 = len(list1.list(x) - len(trim(list1.list(x) 當(dāng)前項(xiàng)的空格數(shù) p2 = len(list1.list(x + 1) - len(trim(l
41、ist1.list(x + 1) 當(dāng)前項(xiàng)的下一項(xiàng)的空格數(shù) if p1 - p2 = 0 or p1 - p2 = 1 then 表示無(wú)子目錄 judge = 0 p1 - p2 = 1為目錄最后一項(xiàng)與其下一項(xiàng)的空格數(shù)的情況 end if p1 - p2 = 0為同級(jí)目錄的空格數(shù)的情況 if p2 - p1 = 1 then p2 - p1 = 1為當(dāng)前目錄含有下級(jí)目錄的空格數(shù)的情況 judge = -1 end if if p1 0 and p2 = 0 then judge = 0 表示無(wú)子目錄 ; end ifend function 4. 客戶端對(duì)目錄的查找 public sub fil
42、edir(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) 找尋第一項(xiàng)。 do while myname 開始循
43、環(huán)。 if myname . and myname . then 跳過(guò)當(dāng)前的目錄及上層目錄。 if (getattr(mypath & myname) and vbdirectory) = vbdirectory then 使用位比較來(lái)確定 myname 代表一目錄。 if flagg = 1 then print #11, re_dir & space(spnum) & + & myname end if 如果它是一個(gè)目錄,將其名稱寫入文件。 end if end ifmyname = dir 查找下一個(gè)目錄。 loopclose #11end subpublic sub filedir1(
44、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 . th
45、en 跳過(guò)當(dāng)前的目錄及上層目錄 if dirflag = 0 then print #110, re_fle & - & myname else print #110, re_fle & space(filespace) & - & myname end if 如果它是文件格式,將其名稱寫入文件。 end if myname = dir 查找下一個(gè)目錄 loopclose #110end sub第六章 典型問題分析6.1 動(dòng)態(tài)添加、刪除客戶端問題服務(wù)器端要想實(shí)現(xiàn)點(diǎn)對(duì)面的數(shù)據(jù)通信,必須要解決與客戶端之間動(dòng)態(tài)建立連接和斷開連接的實(shí)際問題。在設(shè)計(jì)起初我采用的方案是服務(wù)器端只要接收到客戶端的連接請(qǐng)求,
46、便動(dòng)態(tài)加載一個(gè)winsock數(shù)組元素,這樣可以實(shí)現(xiàn)動(dòng)態(tài)與客戶端建立連接,當(dāng)數(shù)組中某一個(gè)客戶端與服務(wù)器端斷開連接時(shí),服務(wù)器端將關(guān)閉與該客戶端的連接,并在列表中顯示該客戶端已斷開連接,那么當(dāng)前該winsock數(shù)組元素處于空閑狀態(tài),如果有新的客戶端連接請(qǐng)求到達(dá),服務(wù)器端將加載新的winsock數(shù)組控件元素與之建立連接。這樣,基本上實(shí)現(xiàn)了動(dòng)態(tài)添加客戶端以及斷開客戶端。但是這樣一來(lái),一旦有客戶端與服務(wù)器端斷開連接,在服務(wù)器端的空閑下來(lái)的winsock控件數(shù)組元素會(huì)越來(lái)越多,造成系統(tǒng)資源的浪費(fèi);經(jīng)過(guò)思考設(shè)計(jì)后,采取以下方案解決:在服務(wù)器端監(jiān)聽到客戶端的連接請(qǐng)求時(shí),首先遍歷服務(wù)器端的winsock控件數(shù)組的
47、連接狀態(tài),查看是否存在空閑的winsock元素,如果存在,則使用該空閑winsock控件元素與客戶端建立連接,否則直接新加載一個(gè)winsock數(shù)組控件與客戶端建立連接。這樣一來(lái),可實(shí)現(xiàn)有多少個(gè)客戶端便使用多少個(gè)winsock控件數(shù)組元素,以致于使得這部分的設(shè)計(jì)更加合理和人性化。6.2 文件傳送和接收問題對(duì)于文件的傳輸,會(huì)涉及的問題更廣泛一些,比如小型文件的傳輸、大型文件的傳輸、各種格式的文件傳輸?shù)鹊取T谄鸪踉O(shè)計(jì)時(shí),直接使用winsock傳輸,簡(jiǎn)單字符串可以實(shí)現(xiàn)收發(fā),但是對(duì)于圖片、音頻和視頻文件無(wú)法實(shí)現(xiàn)。在查閱相關(guān)的資料后采用數(shù)據(jù)分割技術(shù)來(lái)實(shí)現(xiàn)對(duì)大型文件的傳輸。具體實(shí)現(xiàn)思路如下:以65535的數(shù)
48、據(jù)大小為一個(gè)數(shù)據(jù)塊,如果當(dāng)前要傳輸?shù)奈募拈L(zhǎng)度大小在65535以內(nèi),則可直接傳輸;如果大于65535,則以65535為一個(gè)傳輸單位,對(duì)該文件進(jìn)行分割傳輸,同時(shí)不能遺漏所剩余的數(shù)據(jù)。那么接收方以8192個(gè)字節(jié)為單位接收二進(jìn)制的數(shù)據(jù)塊,并存儲(chǔ)數(shù)據(jù),以此來(lái)達(dá)到對(duì)文件的傳輸。在整個(gè)文件傳輸過(guò)程中,該模塊起到了十分重要的作用,無(wú)論是大型文件還是小文件的傳輸均可使用該模塊來(lái)實(shí)現(xiàn)傳輸。包括各種格式的文件如.doc .xml .wma .mp3等等,因?yàn)樵撃K采用的是以二進(jìn)制的模式對(duì)文件數(shù)據(jù)進(jìn)行傳輸?shù)摹?.3 文件夾傳輸問題在文件夾傳輸實(shí)現(xiàn)中,曾使用過(guò)很多方法試圖來(lái)實(shí)現(xiàn),但都很煩瑣,要考慮的方面實(shí)在太多,比如
49、已知要抓取的客戶端機(jī)器上的某個(gè)文件夾,一種方法是在客戶端遍歷該文件夾,建立該文件夾當(dāng)下的整個(gè)目錄結(jié)構(gòu),并回傳給服務(wù)器端,在服務(wù)器端建立好該文件夾的目錄結(jié)構(gòu),然后服務(wù)器端指定目錄下的文件要求客戶端回傳,直到該目錄中的所有文件傳輸完畢完畢為止。那么在這個(gè)方案中,實(shí)施起來(lái)真正困難的地方可能是如果該目錄下嵌套的子目錄非常多,而且包含的文件也很多,那么需要設(shè)計(jì)一個(gè)合理的遍歷算法,以便此后對(duì)具體文件的傳輸帶來(lái)方便。同時(shí)好必須十分明確各子目錄的等級(jí),否則會(huì)造成文件的確傳輸?shù)搅朔?wù)器端,但是里面的文件所屬目錄與客戶端完全不一致,這樣也就造成了該文件夾的整個(gè)目錄結(jié)構(gòu)的損壞??紤]以上方案實(shí)施起來(lái)具有一定的復(fù)雜性,
50、我采用了另一種方案,也是本人在偶然的時(shí)間發(fā)現(xiàn)的一個(gè)解決途徑,平常我們?cè)诎l(fā)送郵件或從網(wǎng)上下載的軟件都是已經(jīng)經(jīng)過(guò)壓縮操作,然后再經(jīng)過(guò)解壓縮獲得該文件夾。既然如此,在此傳輸中,我們同樣可以利用此原理來(lái)實(shí)現(xiàn)對(duì)整個(gè)文件夾的傳輸。實(shí)現(xiàn)的原理如下:客戶端得到服務(wù)器給定的文件夾的絕對(duì)路徑后,調(diào)用rar.exe對(duì)該文件夾實(shí)行壓縮操作,操作完畢后,將該壓縮文件回傳到服務(wù)器端,服務(wù)器接收后,調(diào)用unrar.exe對(duì)該壓縮文件實(shí)行解壓縮操作,至此實(shí)現(xiàn)了對(duì)文件夾的傳輸。采用此方案的有利之處在于無(wú)須考慮該文件夾的目錄結(jié)構(gòu),不用考慮該文件到底有多少個(gè)嵌套的子目錄,以及簡(jiǎn)化了巧妙的避開了復(fù)雜的遍歷算法,且與上一種方案相比,傳輸?shù)臏?zhǔn)確率也大大提高。6.4 各種命令標(biāo)志的接收處理問題在整個(gè)設(shè)計(jì)過(guò)程中,真正處理的關(guān)鍵還是各種命令標(biāo)志的處理,無(wú)論是客戶端還是服務(wù)器端都會(huì)接收到各種已定義的通信協(xié)議(即命令標(biāo)志),那么存在著一個(gè)問題就是如何合理的處理好文件傳輸和接收,比如服務(wù)器端需要抓取客戶端機(jī)器上的某個(gè)文件,那么服務(wù)器端發(fā)送文件抓取命令+該文件路徑,客戶端接收并分析命令后,接下
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年化妝品行業(yè)全球分銷合同3篇
- 北京中醫(yī)藥大學(xué)《無(wú)線通信系統(tǒng)建?!?023-2024學(xué)年第一學(xué)期期末試卷
- 北京中醫(yī)藥大學(xué)《兒科學(xué)A》2023-2024學(xué)年第一學(xué)期期末試卷
- 競(jìng)聘校長(zhǎng)演講稿3篇
- 二零二五年地下停車場(chǎng)建設(shè)與配套設(shè)施合同2篇
- 車位銷售代理合同
- 律師委托代理合同范本正式
- 蘇州2024年江蘇蘇州昆山市發(fā)展和改革委員會(huì)招聘編外工作人員2人筆試歷年典型考點(diǎn)(頻考版試卷)附帶答案詳解版
- 人壽保險(xiǎn)合同范本
- 2025年度智慧水務(wù)PPP項(xiàng)目合同關(guān)鍵條款全解析3篇
- 小學(xué)數(shù)學(xué)名師工作室培養(yǎng)方案
- 初中科學(xué)公式大全
- 學(xué)校矛盾糾紛化解工作方案
- 展廳展板安裝方案范本
- 觀賞魚產(chǎn)業(yè)實(shí)施方案
- 有關(guān)新加坡公司治理的思考
- 大概念教學(xué)讀書分享
- 駕駛員資格申請(qǐng)表
- Module 6 Unit1 Can I have some sweets (說(shuō)課稿)外研版(三起)英語(yǔ)四年級(jí)上冊(cè)
- 主要負(fù)責(zé)人重大隱患帶隊(duì)檢查表
- 《建筑施工模板安全技術(shù)規(guī)范》(JGJ 162-2008)
評(píng)論
0/150
提交評(píng)論