VB中使用WinSock控件傳送文件

字號(hào):

傳送文件對(duì)于網(wǎng)絡(luò)編程來(lái)說(shuō)是基本的功能,比如遠(yuǎn)程控制軟件。這些程序提供的傳文件功能根本就不能用。傳文本還可以,傳二進(jìn)制文件根本就不行。因此,作為一個(gè)基本的功能模塊,有必要單獨(dú)介紹一下。
    在VB中要傳送字符串:
    Dim strData As String
    strData = \"Test\"
    Winsock1.SendData strData
    但是如果你傳送的二進(jìn)制文件,你還能用String變量來(lái)存放嗎?從理論上分析是不行的。文件雖然可以傳,但是接受的文件和發(fā)送的不一樣,原因可能是二進(jìn)制文件里可以有任何\"字符\",但是不是所有的字符都可以放在String變量里。
    除了String類(lèi)型的變量,VB中其他類(lèi)型的變量都只有幾個(gè)字節(jié)長(zhǎng),難道一次只能發(fā)幾個(gè)字節(jié)嗎?那樣豈不是要累死機(jī)器了!其實(shí),情況沒(méi)有那么悲觀,我們完全可以使用數(shù)組來(lái)解決這個(gè)問(wèn)題,就是使用byte數(shù)組。把要傳送的文件都讀到數(shù)組里,然后發(fā)送出去。程序如下:
    FileName 為要傳送的文件名,WinS為發(fā)送文件的WinSock控件。這是一個(gè)發(fā)送端的程序。
    Public Sub SendFile(FileName As String, WinS As Winsock)
    Dim FreeF As Integer \’空閑的文件號(hào)
    Dim LenFile As Long \’文件的長(zhǎng)度
    Dim bytData() As Byte \’存放數(shù)據(jù)的數(shù)組
    FreeF = FreeFile \’獲得空閑的文件號(hào)
    Open FileName For Binary As #FreeFile \’打開(kāi)文件
    DoEvents
    LenFile = LOF(FreeFile) \’獲得文件長(zhǎng)度
    ReDim bytData(1 To LenFile) \’根據(jù)文件長(zhǎng)度重新定義數(shù)組大小
    Get #FreeFile, , bytData \’把文件讀入到數(shù)組里
    Close #FreeFile \’關(guān)閉文件
    WinS.SendData bytData \’發(fā)送數(shù)據(jù)
    End Sub
    接受端的程序如下:
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim bytData() As Byte
    Dim f
    f = FreeFile
    Open strFileName For Binary As #f
    ReDim bytData(1 To bytesTotal)
    Winsock1.GetData bytData
    Put #f, i, bytData
    i = i + bytesTotal \’保證每次寫(xiě)都是在文件的末尾, i是個(gè)全局變量
    Close #f
    End Sub