版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
綜合課程設(shè)計(jì)報(bào)告鑒于TCP協(xié)議的文件傳輸系統(tǒng)學(xué)生姓名:指導(dǎo)教師:所在系:所學(xué)專(zhuān)業(yè):年級(jí):2011年6月目錄綱要21、實(shí)驗(yàn)的有關(guān)知識(shí)3、通信的模式3、傳輸?shù)目孔V性31.、TCP/IP的網(wǎng)絡(luò)系統(tǒng)構(gòu)造3、TCP/IP網(wǎng)絡(luò)協(xié)議4.3、TCP——傳輸控制協(xié)議42、winsock控件5、winsock的重要屬性、方法和事件5、winsock控件通信的工作原理73、程序設(shè)計(jì)與實(shí)現(xiàn)8、程序設(shè)計(jì)8、整體設(shè)計(jì)8、模塊設(shè)計(jì)9、程序?qū)崿F(xiàn)10、工作原理10、服務(wù)器端主程序11、客戶(hù)端主程序144、實(shí)驗(yàn)總結(jié)17參照文件17.成績(jī)?cè)u(píng)定18鑒于TCP協(xié)議的文件傳輸系統(tǒng)綱要跟著網(wǎng)絡(luò)的普及,網(wǎng)絡(luò)編程顯得特別重要。本實(shí)驗(yàn)使用Winsock控件實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)間的文件傳輸,描繪了Winsock控件的使用方法及有關(guān)文件傳輸?shù)乃惴ā8?jì)算機(jī)網(wǎng)絡(luò)的快速發(fā)展,人們的生活愈來(lái)愈離不開(kāi)網(wǎng)絡(luò),此刻網(wǎng)絡(luò)編程已成為計(jì)算機(jī)發(fā)展的熱門(mén),而在眾多的網(wǎng)絡(luò)通信中,又以TCP/IP協(xié)議最為流行。本文議論的Winsock控件,供給了接見(jiàn)TCP/IP網(wǎng)絡(luò)的捷徑,使用它能夠不用認(rèn)識(shí)TCP/IP的細(xì)節(jié)和調(diào)用WinsockAPI,只需設(shè)置好相應(yīng)的屬性和觸發(fā)事件后的辦理,就能夠?qū)崿F(xiàn)計(jì)算機(jī)之間的數(shù)據(jù)通信,進(jìn)行文件傳輸了。同時(shí)為了便于傳輸文件過(guò)程中的中止現(xiàn)象,在實(shí)驗(yàn)時(shí)應(yīng)當(dāng)充分考慮斷點(diǎn)續(xù)傳問(wèn)題,即中止文件傳輸后已經(jīng)傳輸?shù)奈募粊G掉,等到再傳時(shí),能連續(xù)接著傳遞。要點(diǎn)詞:TCP/IP協(xié)議,Winsock控件,網(wǎng)絡(luò)編程,文件傳輸,斷點(diǎn)續(xù)傳。1、實(shí)驗(yàn)的有關(guān)知識(shí)通信的模式因?yàn)槭菍?shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的文件傳輸,所以在程序中我們使用的是C/S的模式來(lái)實(shí)現(xiàn)通信。關(guān)于C/S的模式,即分為客戶(hù)端和服務(wù)端。服務(wù)端用來(lái)接收客戶(hù)端的連結(jié),實(shí)現(xiàn)兩頭之間相互傳輸文件。采納C/S的模式能夠更好的表現(xiàn)程序的功能設(shè)計(jì)思想,充分調(diào)用在LAN中的server和client雙方面的辦理能力,極大的減少網(wǎng)絡(luò)上的信息流通量。C/S系統(tǒng)構(gòu)造有可能供給一種開(kāi)放式的、易伸縮擴(kuò)展的散布式計(jì)算機(jī)環(huán)境,并保護(hù)硬件等投資。傳輸?shù)目孔V性要想實(shí)現(xiàn)文件的靠譜性傳輸,能夠使用流式套接字。因?yàn)榱魇教捉幼止┙o面向連結(jié)的、無(wú)差錯(cuò)的、發(fā)送次序一致的、包長(zhǎng)度不限和非重復(fù)的網(wǎng)絡(luò)信息的傳輸,能供給更好的靠譜性。而關(guān)于數(shù)據(jù)報(bào)套接字供給的是無(wú)連結(jié)的服務(wù),以獨(dú)立的數(shù)據(jù)報(bào)進(jìn)行傳輸,不保證次序性、靠譜性和無(wú)重復(fù)性,對(duì)比之下用流式套接字能供給更好的的靠譜性傳輸。1、2、1TCP/IP的網(wǎng)絡(luò)系統(tǒng)構(gòu)造TCP/IP協(xié)議采納層次系統(tǒng)構(gòu)造,如圖1所示,從圖中能夠看出,每一層在邏輯上都與通信端的對(duì)應(yīng)層相連結(jié)。圖中所示的服務(wù)器程序連續(xù)監(jiān)聽(tīng)通信客戶(hù)端;客戶(hù)端僅周期性地與服務(wù)器相連接以互換數(shù)據(jù),此中TCP協(xié)議層供給相當(dāng)于OSI參照模型中傳輸層的服務(wù),為收、發(fā)端應(yīng)用程序供給通信;IP協(xié)議層負(fù)責(zé)供給一致的數(shù)據(jù)報(bào);鏈路層主要功能是收、發(fā)IP層的IP數(shù)據(jù)報(bào);TCP/IP之上是該協(xié)議供給的各樣服務(wù),而基層網(wǎng)絡(luò)能夠是不一樣的物理網(wǎng)絡(luò),如Ethernet、TokenRing、公共分組互換網(wǎng)等。圖1TCP/IP協(xié)議層模型(LAN)1、2、2TCP/IP網(wǎng)絡(luò)協(xié)議協(xié)議是平等的網(wǎng)絡(luò)實(shí)體之間通信的規(guī)則,能夠簡(jiǎn)單地理解為網(wǎng)絡(luò)上各計(jì)算機(jī)相互溝通的一種“語(yǔ)言”。網(wǎng)絡(luò)通信協(xié)議設(shè)計(jì)的基來(lái)源則是層次化,層和協(xié)議的會(huì)合被稱(chēng)為網(wǎng)絡(luò)系統(tǒng)構(gòu)造。相鄰層之間的接口定義了基層向上層供給的基本操作和服務(wù),基層向上層供給的服務(wù)分兩種形式:面向連結(jié)的服務(wù)和無(wú)連結(jié)的服務(wù)。計(jì)算機(jī)網(wǎng)絡(luò)中已經(jīng)形成的網(wǎng)絡(luò)系統(tǒng)構(gòu)造主要有兩個(gè):OSI參照模型和TCP/IP參照模型。TCP/IP參照模型是因特網(wǎng)(Internet)的基礎(chǔ)。和OSI的7層協(xié)議對(duì)比,TCP/IP協(xié)議只有4個(gè)層次。往常說(shuō)的TCP/IP是一組協(xié)議的總稱(chēng),TCP/IP其實(shí)是一個(gè)協(xié)議族,包含100多個(gè)相互關(guān)系的協(xié)議,其中IP(InternetProtocol,網(wǎng)際協(xié)議)是網(wǎng)絡(luò)層最主要的協(xié)議;TCP(TransmissionControlProtocol,傳輸控制協(xié)議)和UDP(UserDatagramProtocol,用戶(hù)數(shù)據(jù)報(bào)協(xié)議是傳輸層中最主要的協(xié)議),一般以為IP、TCP、UDP是最根本的三種協(xié)議,是其余協(xié)議的基礎(chǔ)。——傳輸控制協(xié)議面向連結(jié)的通信能夠使用靠譜通信,在這時(shí)候,第四層協(xié)議發(fā)送數(shù)據(jù)接收方確實(shí)認(rèn),假如未收到數(shù)據(jù)或許數(shù)據(jù)被破壞,則懇求從頭傳輸。TCP協(xié)議就使用這種靠譜通信。使用TCP協(xié)議的應(yīng)用層協(xié)議包含HTTP、FTP、SMTP和Telnet等。TCP要求在發(fā)送數(shù)據(jù)以前一定翻開(kāi)連結(jié)。服務(wù)器應(yīng)用程序一定履行一個(gè)稱(chēng)作被動(dòng)翻開(kāi)(passiveopen)的操作,以利用一個(gè)已知的端口號(hào)創(chuàng)立一個(gè)鏈接,這是,服務(wù)器其實(shí)不是對(duì)網(wǎng)絡(luò)進(jìn)行呼喊,而是偵聽(tīng)并等候引入的懇求??蛻?hù)應(yīng)用程序一定履行一個(gè)主動(dòng)翻開(kāi)(activeopen),為此,它向服務(wù)器應(yīng)用程序發(fā)送一個(gè)同步序列號(hào)(SYN)以表記連結(jié)??蛻?hù)應(yīng)用程序能夠?qū)?dòng)向端口號(hào)作為當(dāng)?shù)囟丝谑褂?。服?wù)器一定向客戶(hù)發(fā)送一個(gè)確認(rèn)(ACK)以及服務(wù)器的序列號(hào)(SYN)。隨后,客戶(hù)答復(fù)一個(gè)ACK,這樣就成立了鏈接。此刻能夠發(fā)送和接收信息了。接收信息后,老是返回ACK信息。假如在收到ACK以前發(fā)送方已經(jīng)超時(shí),則信息將被放到重發(fā)行列中以再次發(fā)送。因?yàn)樗奈帐煮w制,所以TCP協(xié)議比較復(fù)雜而且費(fèi)時(shí),但此協(xié)議在辦理數(shù)據(jù)時(shí)對(duì)數(shù)據(jù)包的傳送有保障,進(jìn)而使得在應(yīng)用程序協(xié)議中不需要再包含該功能。2.Winsock控件Winsock即WindowsSockets規(guī)范的簡(jiǎn)稱(chēng),是目前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。所謂Socket,往常也稱(chēng)作"套接字",用于描繪IP地點(diǎn)和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序往常通過(guò)“套接字”向網(wǎng)絡(luò)發(fā)出懇求或許應(yīng)答網(wǎng)絡(luò)懇求。Socket是網(wǎng)絡(luò)上運(yùn)轉(zhuǎn)的兩個(gè)程序間雙向通信的一端,它既能夠接受懇求,也能夠發(fā)送懇求,利用它能夠較為方便的編寫(xiě)網(wǎng)絡(luò)上數(shù)據(jù)的傳達(dá)。Winsock控件工作在傳輸層上,在這一層上,目前主要流行的協(xié)議包含TCP和UDP兩種:TCP協(xié)議合用于那些關(guān)于數(shù)據(jù)的靠譜性要求比較高的狀況,目前大部分的網(wǎng)絡(luò)應(yīng)用層協(xié)議都是鑒于TCP協(xié)議的(例如常用的HTTP、FTP、SMTP、POP3等協(xié)議);UDP協(xié)議合用于對(duì)數(shù)據(jù)靠譜性要求不高而對(duì)速度要求較高的狀況,這里主要包含一些需要大流量的(比如Real企業(yè)的RTSP協(xié)議,騰訊企業(yè)的QQ協(xié)議等)??丶匾獙傩浴⒎椒ê褪录傩訮rotocol:經(jīng)過(guò)Protocol屬性能夠設(shè)置WinSock控件連結(jié)遠(yuǎn)程計(jì)算機(jī)使用的協(xié)議??蛇x的協(xié)議是TCP和UDP,對(duì)應(yīng)的VB中常量分別是sckTCPProtocol和sckUDPProtocol,Winsock控件默認(rèn)協(xié)議是TCP。注意:固然能夠在運(yùn)轉(zhuǎn)時(shí)設(shè)置協(xié)議,但一定在連結(jié)未成立或斷開(kāi)連結(jié)后。SocketHandle:SocketHandle返回目前socket連結(jié)的句柄,這是只讀屬性。RemoteHostIP:返回遠(yuǎn)程計(jì)算機(jī)的IP地點(diǎn)。在客戶(hù)端,當(dāng)使用了控件的Connect方法后,遠(yuǎn)程計(jì)算機(jī)的IP地點(diǎn)就賦給了RemoteHostIP屬性,而在服務(wù)器端,當(dāng)ConnectRequest事件后,遠(yuǎn)程計(jì)算機(jī)(客戶(hù)端)的IP地點(diǎn)就賦給了這個(gè)屬性。假如使用的是UDP協(xié)議那么當(dāng)DataArrival事件后,發(fā)送UDP報(bào)文的計(jì)算機(jī)的IP才賦給了這個(gè)屬性。ByteReceived:返回目前接收緩沖區(qū)中的字節(jié)數(shù)。State:用于返回目前WinSock控件的狀態(tài)。如表2-1所示。表1-1返回WinSock控件目前的狀態(tài)常數(shù)值描繪sckClosed0缺省值,封閉SckOpen1翻開(kāi)SckListening2偵聽(tīng)sckConnectionPe3連結(jié)掛起ndingsckResolvingHost4辨別主機(jī)sckHostResolved5已辨別主機(jī)sckConnecting6正在連結(jié)sckConnected7已連結(jié)sckClosing8同級(jí)人員正在封閉連結(jié)sckError9錯(cuò)誤方法Bind:用Bind方法能夠把一個(gè)端口號(hào)固定為本控件使用,使得其余應(yīng)用程序能再使用這個(gè)端口。Listen:只在使用TCP協(xié)議時(shí)實(shí)用。它將應(yīng)用程序置于監(jiān)聽(tīng)檢測(cè)狀態(tài)。Connect:當(dāng)當(dāng)?shù)赜?jì)算機(jī)希望和遠(yuǎn)程計(jì)算機(jī)成立連結(jié)時(shí),就能夠調(diào)用Connect方法。Accept:當(dāng)服務(wù)器接收到客戶(hù)端的連結(jié)懇求后,服務(wù)器有權(quán)決定能否接受客戶(hù)端的懇求。SendData:當(dāng)連結(jié)成立后,要發(fā)送數(shù)據(jù)就能夠調(diào)用SendData方法,該方法只有一個(gè)參數(shù),就是要發(fā)送的數(shù)據(jù)。GetData:當(dāng)當(dāng)?shù)赜?jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)的數(shù)據(jù)時(shí),數(shù)據(jù)寄存在緩沖區(qū)中,要從緩沖區(qū)中拿出數(shù)據(jù),能夠使用GetData方法。PeekData:和GetData方法近似,但PeekData在獲得數(shù)據(jù)后其實(shí)不把緩沖區(qū)清空。事件ConnectRequest:當(dāng)當(dāng)?shù)赜?jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)發(fā)送的連結(jié)懇求時(shí),控件的ConnectRequest事件將會(huì)被觸發(fā)。SendProgress:當(dāng)一端的計(jì)算機(jī)正在向另一端的計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),SendProgress事件將被觸發(fā)。SendProgress事件記錄了目前狀態(tài)下已發(fā)送的字節(jié)數(shù)和節(jié)余字節(jié)數(shù)。SendComplete:當(dāng)所有數(shù)據(jù)發(fā)送達(dá)成時(shí),被觸發(fā)。DataArrival:當(dāng)成立連結(jié)后,接遇到了新數(shù)據(jù)就會(huì)觸發(fā)這個(gè)事件。注意:假如在接遇到新數(shù)據(jù)前,緩沖區(qū)中非空,就不會(huì)觸發(fā)這個(gè)事件。Error:當(dāng)在工作中發(fā)生任何錯(cuò)誤都會(huì)觸發(fā)這個(gè)事件??丶ㄐ诺墓ぷ髟鞼insock控件是鑒于Socket規(guī)范創(chuàng)立的,所以其通信的實(shí)質(zhì)是對(duì)Socket接口進(jìn)行數(shù)據(jù)的讀寫(xiě)操作。假如兩個(gè)應(yīng)用程序需要通信,它們能夠經(jīng)過(guò)使用Socket類(lèi)來(lái)成立套接字連結(jié),能夠?qū)⑦@個(gè)過(guò)程想象為一次電話呼喊過(guò)程:呼喊者經(jīng)過(guò)撥號(hào)與被呼喊者連結(jié),當(dāng)電話接通時(shí),雙方都能夠自由通話了,只可是這里的呼喊者被稱(chēng)為“客戶(hù)”,被呼喊者則稱(chēng)為“服務(wù)器”,而號(hào)碼則為“IP地點(diǎn)+端口”,但在成立連結(jié)以前,一定由“客戶(hù)”發(fā)出呼喊,且此時(shí)的“服務(wù)器”正在監(jiān)聽(tīng)。所以,鑒于TCP/IP協(xié)議的通信,需要分別成立客戶(hù)端應(yīng)用程序和服務(wù)器端應(yīng)用程序。其大概流程如圖1所示:圖1Winsock工作原理端口號(hào)被規(guī)定在
0~65535范圍內(nèi)的某一個(gè)整數(shù),此中
0~1023被早先定義的服務(wù)器通信所占用(如
telnet
占用
23,http
占用端口
80),所以最好使用
1024~65535
這些端口中的某一個(gè),
免得發(fā)生端口矛盾。程序設(shè)計(jì)與實(shí)現(xiàn)程序設(shè)計(jì)整體設(shè)計(jì)本程序的文件傳輸系統(tǒng)的實(shí)現(xiàn)應(yīng)包含服務(wù)端模塊、客戶(hù)端模塊等幾個(gè)部分,整個(gè)程序采納VB達(dá)成。程序使用流式套接字,鑒于C/S模型。在設(shè)計(jì)時(shí)設(shè)計(jì)客戶(hù)端和服務(wù)端兩個(gè)界面中,服務(wù)器用于發(fā)送文件,客戶(hù)端用于接收文件。服務(wù)器和客戶(hù)機(jī)的基本流程如圖2所示。在通信的時(shí)候主要能夠分為兩個(gè)部分,一個(gè)部分是控制信息的傳輸部分,而另一個(gè)部分就是文件的傳輸部分。傳遞的控制信息能夠包含發(fā)送文件的懇求,文件的名稱(chēng)、大小等,因?yàn)檫@方面的數(shù)據(jù)量比較小,所以采納了VB所供給的WINSocket類(lèi)的串行化技術(shù)來(lái)實(shí)現(xiàn)。關(guān)于文件的傳輸,因?yàn)閿?shù)據(jù)量相對(duì)來(lái)說(shuō)比較大,所以用兩個(gè)線程來(lái)實(shí)現(xiàn)文件的傳輸,一個(gè)線程用于發(fā)送,一個(gè)線程用于接收。服務(wù)器客戶(hù)機(jī)創(chuàng)立服務(wù)器窗口創(chuàng)立客戶(hù)端窗口將sockets與當(dāng)?shù)豂P和相應(yīng)的端口綁定Connect( ),將套接字與服務(wù)器相連Listen( ),監(jiān)聽(tīng)來(lái)自客戶(hù)端的連結(jié)能否有連結(jié)否接收客戶(hù)端的連結(jié)懇求顯示錯(cuò)誤是能否有建不為客戶(hù)端成立連接,顯示錯(cuò)誤信息、在套接字上收發(fā)信息否為客戶(hù)端成立連結(jié),在套接字上收發(fā)信息圖2服務(wù)器和客戶(hù)機(jī)的基本流程模塊設(shè)計(jì)1)服務(wù)端模塊客戶(hù)端要能實(shí)現(xiàn)的都功能應(yīng)當(dāng)有:能查找要傳遞的文件;能夠偵聽(tīng)連結(jié);能夠與客戶(hù)端成立連接;能共發(fā)送數(shù)據(jù)。客戶(hù)端要與服務(wù)器端進(jìn)行通信,第一,一定知道服務(wù)器端的域名或IP地點(diǎn)(RemoteHost屬性),就像要和某人打電話前,一定知道對(duì)方的電話號(hào)碼;其次,還一定和服務(wù)器端商定同樣的端口(RemotePort屬性),用于數(shù)據(jù)的輸入和輸出;最后,調(diào)用Connect方法與服務(wù)器端成立連結(jié)。服務(wù)器端應(yīng)設(shè)置一個(gè)監(jiān)聽(tīng)端口(LocalPort屬性),端口應(yīng)與客戶(hù)端的端口同樣,同時(shí)調(diào)用Listen方法時(shí)刻監(jiān)聽(tīng)客戶(hù)端的連結(jié)懇求(ConnectionRequest事件);當(dāng)接收到客戶(hù)端的連結(jié)懇求時(shí),可調(diào)用ConnectionRequest事件的Accept方法,這樣與客戶(hù)端的連結(jié)就成立了。2)客戶(hù)端模塊客戶(hù)端能實(shí)現(xiàn)的功能有:能夠與服務(wù)器成立連結(jié),能夠接受服務(wù)器傳來(lái)的數(shù)據(jù);能夠保留所接受的數(shù)據(jù)等。
客戶(hù)端和服務(wù)器端成功成立連結(jié)后,
任何一方都能夠自由的發(fā)送數(shù)據(jù)
(SendData方法)和接收數(shù)據(jù)(
GetData
方法),這些方法都在
DataArrival
事件中。程序的實(shí)現(xiàn)工作原理本實(shí)驗(yàn)將實(shí)現(xiàn)的文件傳輸只有一個(gè)發(fā)送方和一個(gè)接收方,這是最基本的文件傳輸方式,運(yùn)用的原理也比較簡(jiǎn)單:發(fā)送方先獲得待傳輸文件的基本信息,主假如文件名及文件長(zhǎng)度(用于創(chuàng)立數(shù)據(jù)緩沖區(qū));而后,將其發(fā)送給接收方;接著,成立和文件同樣大小的數(shù)據(jù)緩沖區(qū),并將文件讀入;最后,將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)發(fā)送給接收方。與此同時(shí),當(dāng)接收方接收到文件名和文件長(zhǎng)度以后,就為其創(chuàng)立新的文件和數(shù)據(jù)緩沖區(qū);而后,接收傳輸?shù)奈募?shù)據(jù),并將其放在數(shù)據(jù)緩沖區(qū)中;最后,挨次將數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)寫(xiě)入新創(chuàng)立的文件中。這樣便達(dá)成了不一樣計(jì)算機(jī)之間的文件傳輸。但是,當(dāng)需要傳遞的數(shù)據(jù)比較大時(shí),就不可以像以上介紹的那樣,直接將整個(gè)文件放入數(shù)據(jù)緩沖區(qū)中了,我們的內(nèi)存是沒(méi)法忍耐用一個(gè)幾百M(fèi)B甚至上GB的空間去儲(chǔ)存那些暫時(shí)數(shù)據(jù)的。這時(shí)能夠?qū)⑽募罁?jù)必定的大小,分紅若干個(gè)數(shù)據(jù)包(遠(yuǎn)小于內(nèi)存的容量)。第一,設(shè)置數(shù)據(jù)包的大小(如64K),依據(jù)文件的基本信息(主要文件的長(zhǎng)度),計(jì)算出總合需要的數(shù)據(jù)包數(shù);而后,挨次讀取同數(shù)據(jù)包同樣大小的數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)中;接著,將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù),發(fā)送到指定的計(jì)算機(jī)上;同時(shí)在另一端,成立一個(gè)數(shù)據(jù)緩沖區(qū),緩沖區(qū)的大小要依據(jù)接收到的數(shù)據(jù)來(lái)確立,挨次接收客戶(hù)端傳輸過(guò)來(lái)的數(shù)據(jù)包,并將數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)寫(xiě)入相應(yīng)的文件中,這樣就很簡(jiǎn)單實(shí)現(xiàn)大文件的傳輸了。但還有些時(shí)候,當(dāng)我們?cè)趥鬏斘募倪^(guò)程中,忽然被不測(cè)中止,致使網(wǎng)絡(luò)連結(jié)中止。這時(shí),我們又不得不再次將文件從頭傳輸一次,明顯這浪費(fèi)了許多的時(shí)間,那如何解決這種問(wèn)題呢這就波及到"斷點(diǎn)續(xù)傳"了,即我們能夠接著上一次未傳輸完的地方,連續(xù)傳輸文件。"斷點(diǎn)續(xù)傳"的方法有多種,比較常有的一種是經(jīng)過(guò)設(shè)置一個(gè)暫時(shí)文件,記錄已經(jīng)傳輸?shù)奈募畔?,?dāng)傳輸文件中止時(shí),能夠經(jīng)過(guò)暫時(shí)文件的數(shù)據(jù)來(lái)計(jì)算出未傳輸?shù)臄?shù)據(jù);而后,在每次進(jìn)行文件傳輸前,都先查找文件能否有暫時(shí)文件,并將此信息傳輸給服務(wù)器端,于是服務(wù)器端可據(jù)此再接著進(jìn)行傳輸節(jié)余的數(shù)據(jù),當(dāng)文件所有傳輸完成時(shí),刪除暫時(shí)文件,這樣就實(shí)現(xiàn)了"斷點(diǎn)續(xù)傳"。服務(wù)器端主程序:“通用”中申明以下:OptionBase1ConstPACKSIZEAsLong=65536'每包大小為64KDimfilepathAsString,filenameAsString,filelengthAsLong'儲(chǔ)存文件信息Dimdata( )AsByte,packAsLong,sendAsLong數(shù)'據(jù)緩沖區(qū),文件包數(shù),已傳輸?shù)臄?shù)據(jù)“發(fā)送文件”按鈕事件代碼:PrivateSubsendfile_Click( )"向客戶(hù)端發(fā)送數(shù)據(jù)"'計(jì)算需要傳輸文件的包數(shù)pack=(filelength-send)\PACKSIZEIf((filelength-send)ModPACKSIZE)<>0Thenpack=pack+1Ifpack=0Thenpack=pack+1'傳輸文件OpenfilepathForBinaryAs#1Fori=1Topack'假如只有一包Ifpack=1ThenReDimdata(filelength-send)'讀取數(shù)據(jù)Forj=send+1TofilelengthGet#1,j,data(j-send)Next'更新已傳輸文件的數(shù)據(jù)send=filelength'發(fā)送文件數(shù)據(jù)data'假如是最后一包ElseIfi+1=packThen'讀取最后一包的數(shù)據(jù)ReDimdata(filelength-send)Forj=1Tofilelength-sendGet#1,send+j,data(j)Next'發(fā)送文件數(shù)據(jù)data'更新已傳輸文件的數(shù)據(jù)send=filelengthExitForElse'將文件數(shù)據(jù)放到數(shù)據(jù)緩沖區(qū)ReDimdata(PACKSIZE)Forj=1ToPACKSIZEGet#1,send+j,data(j)Next'發(fā)送文件數(shù)據(jù)data'更新已傳輸文件的數(shù)據(jù)send=send+PACKSIZEEndIfInt((send/filelength)*100)NextInt((send/filelength)*100)Close#1EndSub'返回客戶(hù)端已接收文件的數(shù)據(jù)PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)send,vbLongEndSub"開(kāi)啟"按鈕事件的代碼:PrivateSubstart_Click( )=sckTCPProtocol'以TCP方式進(jìn)行通信'設(shè)置服務(wù)器通信程序的端口號(hào),這里筆者使用的端口是8080=Val'等候客戶(hù)端連結(jié)懇求'狀態(tài)欄顯示提示文字"服務(wù)器已工作,準(zhǔn)備接受懇求"EndSub"客戶(hù)端懇求連結(jié)"事件代碼:PrivateSubWinsock1_ConnectionRequest(ByValrequestIDAsLong)'假如目前連結(jié)是翻開(kāi)的,則封閉If<>0ThenEndIfrequestID'接受客戶(hù)懇求"有客戶(hù)懇求,成立連結(jié)。"EndSubPrivateSubDir1_Change( )("*.*")EndSubPrivateSubDrive1_Change( )=EndSubPrivateSubfile1_Click( )"你選擇的是:"&(-1)&"\"&filepath=filelength=FileLen(-1)&"\"&EndSub運(yùn)轉(zhuǎn)成效如圖3所示:圖3服務(wù)器端斷點(diǎn)續(xù)傳的運(yùn)轉(zhuǎn)成效客戶(hù)端主程序OptionBase1DimflagAsBoolean'設(shè)置開(kāi)關(guān)DimfilenameAsString,filelengthAsLong'儲(chǔ)存文件信息Dimdata( )AsByte,receivedAsLong'申明數(shù)據(jù)緩沖區(qū)和已接收的數(shù)據(jù)'初始化開(kāi)關(guān)PrivateSubForm_Load( )flag=TrueEndSub連結(jié)"按鈕事件的代碼:PrivateSubconnect_Click( )=sckTCPProtocol'以TCP方式進(jìn)行通信'設(shè)置遠(yuǎn)程服務(wù)器IP地點(diǎn),為方便調(diào)試筆者使用的是自己的IP地點(diǎn)='設(shè)置遠(yuǎn)程服務(wù)器通信程序端口號(hào),與服務(wù)器端同樣=Val'與服務(wù)器端成立連結(jié)EndSub數(shù)據(jù)抵達(dá)"事件的代碼:PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)"正在接收伏務(wù)器的數(shù)據(jù)..."Ifflag=TrueThen'分別接收傳輸文件的文件名、文件長(zhǎng)度f(wàn)ilename,vbString,bytesTotal-4filelength,vbLong'為傳輸文件設(shè)置暫時(shí)文件tempfile=filename+".td"'返回已接收的數(shù)據(jù)Open“”+filenameForBinaryAs#1OpentempfileForBinaryAs#2IfLOF(2)>0ThenInput#2,receivedreceivedEndIfClose#2flag=FalseElseOpentempfileForOutputAs#2'成立數(shù)據(jù)緩沖區(qū)ReDimdata(bytesTotal)'接收伏務(wù)器端傳輸?shù)臄?shù)據(jù)data,vbArray+vbByte'將接收的數(shù)據(jù)寫(xiě)入文件Forj=received+1Toreceived+bytesTotalPut#1,j,data(j-received-1)Next'更新已接收的數(shù)據(jù)received=received+bytesTotal'更新暫時(shí)文件Write#2,receivedInt((received/filelength)*100)'傳輸完成If>=100Then"數(shù)據(jù)傳輸完成!"Close#2'刪除暫時(shí)文件Kill(tem
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級(jí) 下學(xué)期 地理 商務(wù)星球版《俄羅斯》合作探究學(xué)案(第1課時(shí))
- 2025年防城港普通貨運(yùn)從業(yè)資格證模擬考試
- 2025年西藏貨運(yùn)從業(yè)資格證考試模擬考試題庫(kù)
- 2025年黑龍江貨運(yùn)從業(yè)資格證模擬考試系統(tǒng)
- 企業(yè)級(jí)實(shí)驗(yàn)中的微生物泄露應(yīng)對(duì)措施研究
- 以目標(biāo)為導(dǎo)向的創(chuàng)新型人才培養(yǎng)激勵(lì)機(jī)制設(shè)計(jì)
- 創(chuàng)意設(shè)計(jì)的文字排版法則
- 從傳統(tǒng)制造到智能制造成功轉(zhuǎn)型的關(guān)鍵-工業(yè)互聯(lián)網(wǎng)的應(yīng)用與實(shí)踐
- 企業(yè)培訓(xùn)中的學(xué)習(xí)習(xí)慣培養(yǎng)策略
- 企業(yè)內(nèi)部實(shí)驗(yàn)室的廢物減量措施研究
- 商鋪交接清單
- 攤鋪機(jī)使用說(shuō)明rp953e-903e操作手冊(cè)
- 高邊坡監(jiān)控量測(cè)方案
- 編寫(xiě)童話故事三年級(jí)400字
- 呼吸科拍背排痰流程圖
- PEP英語(yǔ)四年級(jí)上冊(cè)Unit 4 My home 教學(xué)反思
- 首都博物館參觀匯報(bào)參考課件
- 《中級(jí)微觀經(jīng)濟(jì)學(xué)》考試復(fù)習(xí)題庫(kù)(附答案)
- 國(guó)家開(kāi)放大學(xué)《美學(xué)原理》形考作業(yè)1-5參考答案
- 混凝土強(qiáng)度檢驗(yàn)評(píng)定記錄
- 《生于華夏何其有幸》演講稿
評(píng)論
0/150
提交評(píng)論