【原創(chuàng)】詳解VB.net文件傳輸.(可傳輸任意文件)
目前關(guān)于局域網(wǎng)或者互聯(lián)網(wǎng)文件傳輸?shù)腣B.net方法,網(wǎng)上已有許多文章介紹,但都比較簡略,還有許多例子只能傳輸文本,String變量,而無法實(shí)現(xiàn)傳輸exe,jpeg,mp3等的二進(jìn)制文件,這就需要運(yùn)用
.net中的tcp/ip類或udp類來實(shí)現(xiàn)。正如如下文章文末所說:
http://num11.blog.163.com/blog/static/723079472008412114718485/
而具體怎么實(shí)現(xiàn)呢?網(wǎng)上恐怕難以找到答案,都是粗略講解。
我就在本文為大家展示詳細(xì)的如何vb.net利用Socket的UDP類解決一直以來困擾大家的任意文件傳輸問題。
-------------------------------------------------------------------------------------------
首先當(dāng)然是新建兩個工程(Server-發(fā)送端-和-Client-接收端)

設(shè)計(jì)好窗體如下:

'-------------------------------------Server發(fā)送端代碼如下,如果不明白可下載附件------------------------------------
Imports System.Threading.Thread
Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Public Class Form1
Dim s As New UdpClient '這里注意發(fā)送文件不再使用Socket,而是用UdpClient
'====================================
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
Private Sub txtFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFile.Click
Dim FD As New OpenFileDialog
Try
FD.ShowDialog()
txtFile.Text = FD.FileName '選擇文件
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
'發(fā)送文件
If txtIP.Text = "" Or txtPort.Text = "" Then Exit Sub
Try
Dim IPEndPoin As New IPEndPoint(Net.IPAddress.Parse(Trim(txtIP.Text)), CInt(txtPort.Text))
Sleep(1000)
MessageBox.Show("連接成功!")
Dim fs As New FileStream(txtFile.Text, FileMode.OpenOrCreate, FileAccess.Read) ''要傳輸?shù)奈募?
Dim File(fs.Length - 1) As Byte '定義File()數(shù)組
Dim strread As New BinaryReader(fs)
strread.Read(File, 0, File.Length) '讀取要傳輸?shù)奈募?shù)據(jù)
s.Send(File, File.Length, IPEndPoin) '發(fā)送文件
lblLen.Text = "已發(fā)送字節(jié)數(shù):" & fs.Length()
fs.Close()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
End Class
'-------------------------------End------------------------------------
'-------------------------------Client接收端代碼--------------------
Imports System.IO
Imports System.Net.Sockets
Imports System.Net
Imports System.Threading
Public Class Form1
Public listener As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) '初始化
Public T As Thread
Public IPEndPoin As IPEndPoint
Private Sub Listen()
Try
Dim bytes(MB_to_Bytes(NumericUpDown1.Value)) As Byte
'這里解釋一下,bytes()是一個Byte型數(shù)組,括號里的數(shù)字表示該數(shù)組的上限(最大值),如果定義太小了,比如bytes(1024)不管遠(yuǎn)程發(fā)來多少數(shù)據(jù),只能接受1kb
Dim NumGet As Integer '用于存放接受字節(jié)數(shù)
While True '當(dāng)其有數(shù)據(jù)到達(dá)時觸發(fā)
NumGet = listener.Receive(bytes) '接收,返回長度
Dim recfs As New FileStream(txtSavePath.Text, FileMode.OpenOrCreate)
'接收數(shù)據(jù)并將其保存到一個新的文件中
Dim newfilestr As New BinaryWriter(recfs)
'這里很關(guān)鍵,下面的意思是:把接受的bytes中的數(shù)據(jù),按照NumGet的固定長度寫入到:recfs指向的文件中
' NumGet才是文件真正大小,若改為 1024,則將收到數(shù)據(jù)中前1024字節(jié)寫入文件
newfilestr.Write(bytes, 0, NumGet)
recfs.Close()
'listener.Shutdown(SocketShutdown.Receive)
'listener.Close()
'如果關(guān)閉將不能再次接收文件
MessageBox.Show("接收數(shù)據(jù)成功.共計(jì):" & NumGet)
End While
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
''' <summary>
''' 將MB轉(zhuǎn)換為字節(jié)
''' </summary>
''' <param name="MB">MB的值</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function MB_to_Bytes(ByVal MB As Integer) As Integer
Dim intBytes As Integer
intBytes = MB * 1024 * 1024
Return intBytes
End Function
Private Sub btnListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListen.Click
If txtIP.Text = "" Or txtPort.Text = "" Or txtSavePath.Text = "" Then Exit Sub
Try
IPEndPoin = New Net.IPEndPoint(Net.IPAddress.Parse(Trim(txtIP.Text)), CInt(txtPort.Text))
listener.Bind(IPEndPoin)
T = New Thread(AddressOf Listen)
T.Start()
MessageBox.Show("已成功啟動監(jiān)聽。")
Catch ex As Exception
End Try
End Sub
End Class
'--------------------------------------End---------------------------------
運(yùn)行一下看看怎么樣呢?
輸入IP和端口后,點(diǎn)擊“開始監(jiān)聽”

之后在發(fā)送端同樣輸入IP和端口,選擇一個文件,之后發(fā)送


這時接收端將收到數(shù)據(jù)并保存在D:\1.exe
如果傳送文件超過10MB范圍,將不能完全接收.所以事先要定義好

我們在打開“D:\1.exe”,看看是否正常運(yùn)行?

恩,不錯。一切正常。
好了,成功實(shí)現(xiàn)VB.net UDP傳輸文件
,源碼在下面:
若有什么不足之處,請?jiān)谙旅媪粞?謝謝支持!
PS:沒事的話上首頁看看,順便喂喂我的寵物,謝了.
Join us QQ Group:93017435
http://down./space/file/qiannao/share/2010/4/10/VB.net-6587-4ef6-4f20-8f93-5b9e-4f8b.rar/.page





