精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..网络程序开发..〓〓>>传送二进制文件包括执行程序的详细例子

主题:传送二进制文件包括执行程序的详细例子
发信人: hahahawk(哈哈天使)
整理人: gzwsh(2002-11-05 22:54:06), 站内信件
今天下午做了一个从客户端向服务端传送二进制文件包括执行程序的详细例子:


客户端程序:

'客户端程序,by hahahawk
Option Explicit
Dim buffer(8191) As Byte
Dim flen As Long '文件长度
Dim flag As String  '标志:要传输的是文件的长度还是文件本身
Dim trans_num As Integer
Dim fileNum As Integer

Private Sub cmdstart_Click()

    Winsock1.Connect
End Sub

Private Sub Form_Load()
    Dim i As Integer
    Dim xFileName As String
    xFileName = App.Path & "\..\filecopy\a1.exe"
    fileNum = FreeFile
    Open xFileName For Binary As #fileNum
    flen = LOF(fileNum)
    
    Label1.Caption = Label1.Caption & vbCrLf & "要传输的文件长度为" & Str(flen)
    Winsock1.RemoteHost = "wqnotebook"
    Winsock1.RemotePort = 2002
    flag = "head"
    trans_num = 0
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Close #fileNum
End Sub

Private Sub Winsock1_Connect()
    cmdstart.Enabled = False
    Label1.Caption = Label1.Caption & vbCrLf & "已经连接上,开始发送"
    If flag = "head" Then
        trans_num = readblock(fileNum)
        Winsock1.SendData Str(trans_num)
        
    End If
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim s1 As String
    Winsock1.GetData s1, vbString
    Debug.Print s1
    If s1 = "ok" Then
        If flag = "file" Then
            If trans_num > 0 Then Winsock1.SendData buffer
            
        Else
            
            If trans_num = 1024 * 8 Then
                trans_num = readblock(fileNum)
                If trans_num > 0 Then
                    Winsock1.SendData Str(trans_num)
                Else
                    Label1.Caption = Label1.Caption & vbCrLf & "整个文件传送完毕"
                End If
            Else
                Label1.Caption = Label1.Caption & vbCrLf & "整个文件传送完毕"
            End If
        End If
    Else
        If Winsock1.State <> sckClosed Then Winsock1.Close
        Label1.Caption = Label1.Caption & vbCrLf & "服务器无法接受"
        cmdstart.Enabled = True
    End If
    
End Sub

Private Sub Winsock1_SendComplete()
    If flag = "file" Then
        Label1.Caption = Label1.Caption & vbCrLf & "发送块完毕"
        flag = "head"
    Else
        Label1.Caption = Label1.Caption & vbCrLf & "交换块大小" & trans_num
        flag = "file"
    End If
End Sub
Public Function readblock(fileid As Integer)
    Dim i As Integer
    i = 0
    Do While Not EOF(fileid)
            If i = 0 Then Debug.Print i
            If i = 4095 Then Debug.Print i
            If i = 4096 Then Debug.Print i
            If i = 4097 Then Debug.Print i
            Get #fileid, , buffer(i)
            i = i + 1
            If i = 1024 * 8 Then Exit Do
    Loop
    readblock = i
End Function


服务端程序:

'服务端程序,by hahahawk
Option Explicit
Dim flag As String
Dim flen As Long
Dim trans_num As Integer
Dim fileNum As Integer

Private Sub Form_Load()
    Winsock1.LocalPort = 2002
    Winsock1.Listen
    flag = "head"
        Dim xFileName As String
        fileNum = FreeFile()
        xFileName = App.Path & "\..\filecopy\a2.exe"
        Open xFileName For Binary Access Write Lock Write As #fileNum
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If Winsock1.State <> sckClosed Then Winsock1.Close
            Close #fileNum
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

   If Winsock1.State <> sckClosed Then Winsock1.Close
    Winsock1.Accept requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim buffer() As Byte, s1 As String
    If flag = "head" Then
        Winsock1.GetData s1, vbString
        Label1.Caption = Label1.Caption & vbCrLf & "客户方准备发送长度为" & s1 & "的块"
        trans_num = Val(s1)
        flag = "file"
        Winsock1.SendData "ok"
        
    Else
        ReDim buffer(trans_num)
        Winsock1.GetData buffer, vbArray + vbByte
        flag = "head"
        Label1.Caption = Label1.Caption & vbCrLf & "长度为" & Str(trans_num) & "的块接受完毕"
        Dim i As Integer
        i = 0
        For i = 0 To trans_num - 1
            Put #fileNum, , buffer(i)
        Next

        Winsock1.SendData "ok"
    End If
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox Description
End Sub

这样就可以传送二进制文件包括执行程序。
可以发现,这样传送的副本会比原本大一个字节,但是不影响程序的执行。至于为什么大一个字节,其实是在读取源文件的结尾到缓冲区的时候,会多取一个byte。大家可以思索一下。当然简单的办法可以限制最后一个byte写入副本。

值得注意的是:每次最多只能发送1024*8byte,所以要循环。



----
私章                  签名 
▇▇▇▇▇▇▇ 
▇横空出世版▇ 
▇哈哈天使之▇        哈哈天使 
▇私務專用印▇  网海琼楼
▇▇▇▇▇▇▇  

[关闭][返回]