我尝试过csdn里的多种方法传输,当连续不断传输图片时总是会出错。
程序如下:
发送端:
Public Function SendChunk()
Dim ChunkSize, k As Integer
Dim Chunk() As Byte
Dim FileLoc As Long
Dim n, m, i As LongChunkSize = 7891
FileLoc = 1
ReDim Chunk(0 To ChunkSize - 1)If Winsock2.State <> 7 Then Exit FunctionOpen App.Path & "\cap.jpg" For Binary Access Read As #1n = LOF(1) / ChunkSize
m = Int(n)
If n - m > 0 Then
  k = m
Else
  k = m - 1
End IfIf m > 1 Then
  For i = 1 To k
    Get #1, FileLoc, Chunk
    FileLoc = FileLoc + ChunkSize
    Winsock2.SendData Chunk
  Next
End IfChunkSize = LOF(1) - FileLoc
ReDim Chunk(0 To ChunkSize - 1)
Get #1, FileLoc, Chunk
Winsock2.SendData Chunk
Close #1
End Function接收端:Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
  Dim Chunk() As Byte
  Dim ChunkSize As Long
  ChunkSize = 7891
          
  Winsock1.GetData Chunk
    
If FileLenth = 0 Then
  Open App.Path & "\got.jpg" For Binary Access Write As #1
End If
  
If bytesTotal >= ChunkSize Then
  Put #1, FileLenth + 1, Chunk
  FileLenth = FileLenth + ChunkSize
Else
  Put #1, FileLenth + 1, Chunk
  FileLenth = 0
  Close #1
  VideoFrm.PicGot.Picture = LoadPicture(App.Path & "\got.jpg")
End IfEnd Sub为何发送过来的图片会只有一半,究竟错在哪里?摸不着头脑。

解决方案 »

  1.   

    我尝试过csdn里的多种方法传输,当连续不断传输图片时总是会出错。
    ======================================
    http://www.aivisoft.net/Zyl910/NetPicTran.zip
    这个也试了吗?
      

  2.   

    你定义一个7891的变量装载图片,而在接收那定义了一个相同大小的变量接收.看上去像是理所当然,但你可能不知道,socket在发送7891的时候,并不是一次就发完的.
    当然,你的图片不会就只有7891那么大,所以你用循环来读,读到了马上发...这已经是错了!
    说多了也是无谓,倒不如贴个地址你下载个源码来看看吧...不光是图片,别的文件也可以传...当然你也可以看zy1910的,但相对复杂点(注:文件3天后过期)
    http://pickup.mofile.com/6026015554814265
      

  3.   

    谢谢大家的回复。
    首先MmMVP提供的“http://www.aivisoft.net/Zyl910/NetPicTran.zip”这个载不下来。如果你有的话,劳烦你发到我邮箱[email protected] 谢谢!
    第二qyii所说的7891是我随便设的一个数,winsock传送时不是只要小于8k(1024×8),就一次性传送吗?您所提供的“http://pickup.mofile.com/6026015554814265”里的程序也有:
    '计算出这次可发送的字节数
        If LenFile >= 8192 Then
           GetCount = 8192
           LenFile = LenFile - GetCount
        Else
           GetCount = LenFile
           LenFile = LenFile - GetCount
        End If
           SplitFile = GetCount就是将文件分割成8192一块,比我设的块还大呢?你提供的源码我正在测试中,写得好像有点复杂了。谢谢您的支持。等我解决了再结贴。
      

  4.   

    汗~抱歉,thirdapple的文件以前丢失了,现在他没传,等他来了我让他传下NetPicTran.zip
      

  5.   

    //winsock传送时不是只要小于8k(1024×8),就一次性传送吗?当然不是~8192只是随便定义一个数值~具体一次能传多少由底层控制的~可能是1024可能是768也可能是4096也可能以上都不是!呵呵~所以我用到了sendcomplete事件来告知我那时候该传下一个8192!
    想确定你的网络一次到底传了多时,在接收端那debug.print一下是最好不过的了!
    也不是很复杂吧??
      

  6.   

    仔细看了你提供的“http://pickup.mofile.com/6026015554814265”我改了一种方法,这样发送还是按指定分割长度发送,但接收就可以不管多少了。
    但还是不行:
    程序如下:
    发送端:(没有多少改变,就多了一个发送file size,接收端修改较多)
    Public Function SendChunk()
    Dim ChunkSize, k As Integer
    Dim SChunk() As Byte
    Dim FileLoc As Long
    Dim n, m, i As LongChunkSize = 4000
    FileLoc = 1
    ReDim SChunk(0 To ChunkSize - 1)If Winsock2.State <> 7 Then Exit FunctionOpen App.Path & "\cap.jpg" For Binary Access Read As #1
    CmdTxt = "File Size:" & LOF(1)
    Winsock2.SendData CmdTxtn = LOF(1) / ChunkSize
    m = Int(n)
    If n - m > 0 Then
      k = m
    Else
      k = m - 1
    End IfIf m > 1 Then
      For i = 1 To k
        Get #1, FileLoc, SChunk
        FileLoc = FileLoc + ChunkSize
        Winsock2.SendData SChunk
      Next
    End IfChunkSize = LOF(1) - FileLoc + 1
    ReDim SChunk(0 To ChunkSize - 1)
    Get #1, FileLoc, SChunk
    Winsock2.SendData SChunk
    Close #1End Function
    接收端:(用OnAccept开关来制定接收的是字符还是数组,并读取文件和判断文件是否结束)
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
                 
    If OnAccept = False Then   Winsock1.GetData str1
       
       If Left(str1, 10) = "File Size:" Then
          FileLenth = Val(Right(str1, Len(str1) - 10))
          CmdTXT.Text = "File Size:" & FileLenth
          OnAccept = True
       End IfElse
        
       ReDim chunk(0 To bytesTotal - 1)
       Winsock1.GetData chunk
       Open App.Path & "\got.jpg" For Binary Access Write As #2
       Put #2, FileLoc + 1, chunk
       FileLoc = FileLoc + bytesTotal
       Close #2
       
       If FileLoc = FileLenth Then
         VideoFrm.PicGot.Picture = LoadPicture(App.Path & "\got.jpg")
         OnAccept = False
         FileLoc = 0
         FileLenth = 0
       End If
       
    End IfEnd Sub您提供的程序是一个文件一个文件传,我做的是捕捉视频后用realtime控件每隔5秒(怕太短会出现错误)传一次图片。结果还是不行。一个头两个大!
      

  7.   

    那就不能纸上谈兵了~~呵呵!到这里下载这个来看吧~可不是那么简单的~
    建议不要用socket控件了~用API来封装吧.这样的效率会比较高(zy1910的网络屏幕监视.注:文件3天后过期)
    http://pickup.mofile.com/3563550573712701
      

  8.   

    谢谢您一直的支持!但是程序运行后没有任何动静啊。点击了“连结”什么反应都没有。除了部分控件的enabled=false