电竞比分网-中国电竞赛事及体育赛事平台

分享

詳解VB.net文件傳輸.(可傳輸任意文件)

 franklinfj 2013-04-11
2010-04-10 16:48

【原創(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

http://hi.baidu.com/lipeiyi2006

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多