成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

全面分析VB.NET文件傳送

開發 后端
文件雖然可以傳,但是接受的文件和發送的不一樣,原因可能是二進制文件里可以有任何\"字符\",但是不是所有的字符都可以放在String變量里。文章介紹VB.NET文件傳送的代碼。

郵遞員就是傳遞人員,那在網絡上怎么傳遞文件的呢?這里和大家介紹一下吧。VB.NET文件傳送對于網絡編程來說是基本的功能,比如遠程控制軟件。在編制一個軟件時,我從網上下了很多傳文件的程序,這些程序提供的傳文件功能根本就不能用。傳文本還可以,傳二進制文件根本就不行。因此,作為一個基本的功能模塊,有必要單獨介紹一下。首先,VB.NET文件傳送字符串,你可以這樣寫:

  1. Dim strData As String  
  2. strData = \"Test\"  
  3. Winsock1.SendData strData 

但是如果你傳送的二進制文件,你還能用String變量來存放嗎?從理論上分析是不行的,我也做了實驗,確實是不行的。文件雖然可以傳,但是接受的文件和發送的不一樣,原因可能是二進制文件里可以有任何\"字符\",但是不是所有的字符都可以放在String變量里。
除了String類型的變量,VB中其他類型的變量都只有幾個字節長,難道一次只能發幾個字節嗎?那樣豈不是要累死機器了!其實,情況沒有那么悲觀,我們完全可以使用數組來解決這個問題,就是使用byte數組。把要VB.NET文件傳送都讀到數組里,然后發送出去。程序如下:

FileName 為要傳送的文件名,WinS為發送文件的WinSock控件。這是一個發送端的程序。

  1. Public Sub SendFile(FileName As String, WinS As Winsock)  
  2. Dim FreeF As Integer \'空閑的文件號  
  3. Dim LenFile As Long \'文件的長度  
  4. Dim bytData() As Byte \'存放數據的數組  
  5. FreeF = FreeFile \'獲得空閑的文件號  
  6. Open FileName For Binary As #FreeFile \'打開文件   
  7. DoEvents   
  8.  
  9. LenFile = LOF(FreeFile) \'獲得文件長度  
  10. ReDim bytData(1 To LenFile) \'根據文件長度重新定義數組大小  
  11. Get #FreeFile, , bytData \'把文件讀入到數組里  
  12. Close #FreeFile \'關閉文件  
  13. WinS.SendData bytData \'發送數據  
  14. End Sub  

接受端的程序如下:

  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)  
  2. Dim bytData() As Byte  
  3. Dim f  
  4. f = FreeFile 
  5. Open strFileName For Binary As #f  
  6. ReDim bytData(1 To bytesTotal)  
  7. Winsock1.GetData bytData  
  8. Put #f, i, bytData  
  9. ii = i + bytesTotal \'保證每次寫都是在文件的末尾, i是個全局變量  
  10. Close #f  
  11. End Sub 

這里有兩個需要注意的地方,ReDim Preserve bytData(1 To LenFile),下標是從1開始的,如果你寫成ReDim bytData( LenFile),下標就是從0開始了,數組就有LenFile+1長了。LenFile = LOF(FreeFile)中的LOF是獲得文件長度的函數,是VB里帶的,我見過很多例子用API,或者循環的讀直到末尾來獲取文件長度,這樣都是很麻煩的,使用LOF函數就可以了。這樣的程序,即可以傳送文本文件,也可以傳送二進制文件。但是你有沒有發現這個程序的問題呢?如果我要傳送一個50M的文件呢?系統可以為bytData分配50M的內存空間嗎?于是筆者拿一個50M的文件做實驗吧,接收到的文件和原來的文件不一樣,比原來的大。問題出在那呢?

首先,根據文件大小重新定義bytData數組的大小本身就有問題,系統是不可能無限制的給數組分配空間的,即使可以,也會造成系統響應變慢。在傳50M文件的時候,系統就跟死機了一樣。那么怎么解決這個問題呢,一個自然的想法就是把數據分段傳送。程序如下:發送程序, iPos是個全局變量,初始值為0。這個變量保存著當前數據的位置。Const iMax = 65535是每個數據塊的大小。

  1. Dim FreeF As Integer \'空閑的文件號  
  2. Dim LenFile As Long \'文件的長度  
  3. Dim bytData() As Byte \'存放數據的數組  
  4. FreeF = FreeFile \'獲得空閑的文件號  
  5. Open FileName For Binary As #FreeF \'打開文件  
  6. DoEvents  
  7. LenFile = LOF(FreeF) \'獲得文件長度  
  8. If LenFile <= iMax Then \'如果要發送的文件小于數據塊大小,直接發送  
  9. ReDim bytData(1 To LenFile) \'根據文件長度重新定義數組大小  
  10. Get #FreeF, , bytData \'把文件讀入到數組里  
  11. Close #FreeF \'關閉文件  
  12. WinS.SendData bytData \'發送數據  
  13. Exit Sub  
  14. End If  
  15. \'文件大于數據塊大小,進行分塊發送  
  16. Do Until (iPos >= (LenFile - iMax)) \'發送整塊數據的循環  
  17. ReDim bytData(1 To iMax)  
  18. Get #FreeF, iPos + 1, bytData  
  19. WinS.SendData bytData  
  20. iPosiPos = iPos + iMax \'移動iPos,使它指向下來要讀的數據  
  21. Loop  
  22. \'這里要注意的是,必須檢查文件有沒有剩下的數據,如果文件大小正好等于數據塊大小的  
  23. \' 整數倍,那么就沒有剩下的數據了  
  24. ReDim bytData(1 To LenFile - iPos) \'發送剩下的不夠一個數據塊的數據  
  25. Get #FreeF, iPos + 1, bytData  
  26. WinS.SendData bytData  
  27. Close #FreeF 

下面是接收端的程序:

  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)  
  2. Dim bytData() As Byte[Page]  
  3. Dim lLenFile As Long  
  4. Dim f  
  5. f = FreeFile 
  6. Open strFileName For Binary As #f \'strFileName是文件名  
  7. lLenFile = LOF(f)  
  8. ReDim bytData(1 To bytesTotal)  
  9. Winsock1.GetData bytData  
  10. If lLenFile = 0 Then \'lLenFile=0表示是第一次打開文件,這里有個問題,就是\'如果如果該文件存在的話,就會出錯,應該在打開前檢查文件是否存在。(這里我省略了)  
  11. Put #f, 1, bytData  
  12. Else  
  13. Put #f, lLenFile + 1, bytData  
  14. End If  
  15. Close #f  
  16. End Sub 

【編輯推薦】

  1. 代碼講述VB.NET實現數據綁定
  2. VB.NET TextBox組件高手經驗談
  3. 瞬間掌握VB.NET Web Service
  4. 實例分析VB.NET Treeview結構
  5. 百寶箱之VB.NET設計制作窗體
責任編輯:田樹 來源: 博客
相關推薦

2009-10-28 10:04:53

VB.NET XmlW

2009-11-04 10:54:53

VB.NET MOVE

2009-10-14 15:20:21

VB.NET窗體指針

2009-10-15 10:57:16

VB.NET Text

2009-11-02 15:57:36

VB.NET WEB

2009-10-27 09:45:03

VB.NET數組

2009-10-16 13:04:57

VB.NET字符串數組

2009-10-28 17:44:31

VB.NET語言

2009-11-02 10:53:34

VB.NET INI文

2009-11-02 14:48:45

VB.NET HOOK

2009-11-10 16:46:52

VB.NET指針應用

2009-10-15 11:42:05

VB.Net賦值語句

2009-11-02 11:13:06

VB.NET讀寫文件

2009-10-28 14:00:02

VB.NET文件處理

2009-10-15 17:50:48

VB.NET調用API

2009-11-02 17:12:01

VB和VB.NET

2009-10-21 09:10:52

VB.NET壓縮

2009-10-20 17:38:20

VB.NET exce

2009-11-10 16:20:25

VB.NET全局熱鍵

2009-10-29 11:26:28

VB.NET調用Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人免费视频二 | 国产精品99久久久久久久久久久久 | 福利精品在线观看 | 日本视频免费 | 国产精品国产a | 日韩欧美三级 | 亚洲精品一区在线观看 | 精品网站999| 一级a性色生活片久久毛片波多野 | 综合久久久| 中文字幕av网站 | 成人片免费看 | 成人av一区 | 成人视屏在线观看 | 日韩免费视频一区二区 | 精品国产一区二区国模嫣然 | 超碰男人天堂 | 久久er精品 | 国产精品国产三级国产aⅴ原创 | 日韩视频一区二区三区 | 久久er精品| 天天干天天干 | 久久久久国产 | 欧美一级二级视频 | 中文字幕97 | 精品久久电影 | 国产亚洲一区二区精品 | 日韩欧美三级电影 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 国产精品亚洲综合 | 日日日日操| 日韩精品一区二区三区视频播放 | 一区二区高清在线观看 | 久久av一区二区三区 | 亚洲国产欧美在线 | 久热久热 | 欧美日韩视频一区二区 | 91精品在线播放 | 国产在线播| 精品美女视频在免费观看 | 久久天天综合 |