这送端:
Open Text2.Text For Binary As #1
    L = LOF(1)
    ReDim arr(1 To 4096) As Byte
    For u = 0 To Int(L / 4096) - 1
        DoEvents
        Get #1, u * 4096 + 1, arr
        Winsock1(i).SendData arr
    Next
    DoEvents
    If L Mod 4096 <> 0 Then
        Dim k As Integer
        k = L Mod 4096
        ReDim arr(1 To k)
        Get #1, L - k + 1, arr
        'Winsock1(i).SendData arr
        Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"      
    End If
    Close #1
     End If
Next i接收端:
Dim CmdArr() As String
Dim FileByte() As Byte
Dim strData() As Byte
Winsock2.GetData strData, vbArray + vbByte   
CmdArr = Split(strData, ",") '把数据格式化到数组里
   MsgBox CmdArr(0)   -----------------???????为什么这里得不到SendFile?
   Open App.Path & "\ 2.mp3" For Binary As #2
    k = UBound(strData) + 1
    Put #2, sum, strData
    sum = sum + k
    Close #2

解决方案 »

  1.   

    是在发送端:
    Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"
    Senfile就是发送文件的时也送过去!到了接收端的时.就用CmdArr(0)来接收!
      

  2.   

    你这个代码的确不能用,问题如下:
    1、Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"
    " arr"什么意思?没发送字节数组,发个字符串" arr"?百思不解?
    2、前面已开始发送数据了,后面来个夹在中间有"SendFile,",接收端怎么分析?
    3、字符串与字节数组混发,不是不可以,只是技巧很多,不太好处理,例如:象CmdArr = Split(strData, ",")这样处理字节数据,肯定是不行的,因为Split返回的是字符串数组,字节数组转成字符串VB会改写Byte数据,会出错的,而且","为Unicode码,而你发送端最后一段是按字符串发送,得到的是ANSI码字节数组,Split也不会有结果。
    ....还有很多问题,不找了解决方案:
    首先信息部分应放在数据头部,其次可考虑两种方法
    1、完全用Byte数组,头部预留一定长度字节用于装载信息,信息格式自己定义,便于客户端分析就行;
    2、可象Http协议那样使用字符串头部,用一特定字符组合做为头部信息结束标志,Http协议使用了两个vbCrLf,你也可以这样。客户端在收到Byte数组后,应使用InstrB、LeftB、MidB等函数分析分隔信息与数据;另外,为避开这种信息与数据混发引起的麻烦,你还可用一种更简单的方案,即建立两个连接,一个专用于字符串通讯收发信息,互通完信息后,另一个专用于收发Byte数据。
      

  3.   

    ReDim arr(1 To 4096) As Byte
      

  4.   

    哎!累呀,我知道,arr是你的Byte数组名,但你用引号括起来的"arr",就是字符串a、r、r、三个字符呀,VB不会把它与你的字节数组想成是同一个东东的!!!另外就算是字节数组,也不能用&号连接呀。
      

  5.   

    如果我把
    CmdArr = Split(strData, ",") '把数据格式化到数组里
       MsgBox CmdArr(0)   -----------------???????为什么这里得不到SendFile?
     去掉之后,文件就可以传输啊!
      

  6.   

    发送端:
    arr="SendFile,"
    lngLenth=UBound(arr)
    Open Text2.Text For Binary As #1
        L = LOF(1)
        ReDim Preserve arr(lngLenth To 4096) As Byte
        For u = 0 To Int(L / 4096) - 1
            DoEvents
            Get #1, u * 4096 + 1, arr
            Winsock1(i).SendData arr
        Next
        DoEvents
        If L Mod 4096 <> 0 Then
            Dim k As Integer
            k = L Mod 4096
            ReDim arr(1 To k)
            Get #1, L - k + 1, arr
            Winsock1(i).SendData arr
            '''''''Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"      
        End If
        Close #1
         End If
    Next i接收端:
    Dim arr() As Byte
    Winsock2.GetData arr
    MsgBox arr
      

  7.   

    Open Text2.Text For Binary As #1
        L = LOF(1)
        ReDim arr(1 To 4096) As Byte
        For u = 0 To Int(L / 4096) - 1
            DoEvents
            Get #1, u * 4096 + 1, arr
            Winsock1(i).SendData arr
        Next
        DoEvents
        If L Mod 4096 <> 0 Then
            Dim k As Integer
            k = L Mod 4096
            ReDim arr(1 To k)
            Get #1, L - k + 1, arr
            Winsock1(i).SendData arr
            ‘Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"      
        End If
        Close #1
         End If
    Next i
    发送端的注释恢复。别+上你改的那句
    愿因:
    接收端代码是这样
    Winsock2.GetData strData, vbArray + vbByte   
    他接收的代码是vbArray 类型而你发送的这句 Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"  是字符串类型,因此接收端接收不到
    解决方法,如果在原来你的方法上改的话很复杂,你再下载个代码吧,
      

  8.   

    更正:发送端:
    arr = "SendFile," & Dir(Text2.Text) & " arr"
    lngLenth=UBound(arr)
    Open Text2.Text For Binary As #1
        L = LOF(1)
        ReDim Preserve arr(1 To 4096) As Byte
        For u = 0 To Int(L / 4096) - 1
            DoEvents
            Get #1, u * 4096 + 1, arr
            Winsock1(i).SendData arr
        Next
        DoEvents
        If L Mod 4096 <> 0 Then
            Dim k As Integer
            k = L Mod 4096
            ReDim arr(1 To k)
            Get #1, L - k + 1, arr
            Winsock1(i).SendData arr
            '''''''Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"      
        End If
        Close #1
         End If
    Next i接收端:
    Dim arr() As Byte
    Winsock2.GetData arr
    MsgBox arr
      

  9.   

    不知道楼主的目的 嘿嘿 小吉兄 分析的很对1。楼主把字符数据跟二进制数据混淆了
    如果你想使用 字符的方式来发送 二进制的数据的话 请把所有二进制转化为字符编码格式(譬如 base64)接收端 再解码。不过这样效率很低,建议都使用二进制来发送。也就是把字符串格式成二进制(使用StrConv函数)
    2。对大数据发送最好使用tcp方式,看楼主的代码应该是udp方式。tcp 发送数据有一个 叫sendcomplete 事件 当一次senddata调用对方收到数据后会触发的。这样在这个事件里再发送下一个数据包。
      

  10.   

    Split(strData, ",")
    因为strData是字节数组所以上面的函数不能返回期望的结果,可以使用下面的方法得到开始的cmd
    Dim strCmd As String,i as integer
    i=InStrB(strData, ChrB(Asc(",")))
    if i>0 then strCmd=StrConv(LeftB(strData, i - 1), vbUnicode)
    msgbox strCmd
      

  11.   

    呀.我来晚了...今天19点多来上CSDN..
      

  12.   

    http://vssky.net/soft/TCP_SendFile.rar这是一个现成的例子.看看吧!
      

  13.   

    来晚了.
    楼上的各位都说的差不多了。要纯二进制处理,不要把字符串掺和到里面。VB中的字符串是一种高度自动化的Unicode字符串,大部分时候用起来很方便,可是有时候会帮倒忙。经常见到一些代码用字符串来处理二进制数据,那些大概都是VB1-VB4时代的代码,那时候字符串可能是ANSI的,就像C语言中的Char[],当然可以代替字节数组,但现在对 VB5/6 肯定不适用了。(以上纯属猜测,我没用过VB1-VB4,呵呵)
      

  14.   

    1、在WINSOCK里面发送不是一个字节一个字节操作的,所以发送一个文件只需要:
    dim RR() as byte
    open s for binary as #1
    redim rr(lof(1)-1)
    get #1,,rr
    close
    winsock1.senddata rr接收方:
    在DataArrival事件中
    winsock1.getdata rr
    if dir(s)<>"" then kill s
    open s for binary as #fn1
    put #fn1,,rr
    close #fn1就这些,但是如果内容大于 8192字节,则这些方法都不行,必须编程序处理了,讲那些太麻烦。