我尝试过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为何发送过来的图片会只有一半,究竟错在哪里?摸不着头脑。
程序如下:
发送端:
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为何发送过来的图片会只有一半,究竟错在哪里?摸不着头脑。
解决方案 »
- [求助] 一个极大值的判断是否为整数的问题?
- 帮忙解决
- Acrobat接口怎么用?我有上万个PDF文件要设置密码及权限,想写个程序来解决,怎么解决?
- 如何调用WINDWOS API以控制当前执行的应用程序,启动停止
- CSDN上就没人知道吗?那这个号称“程序员大本营”的地方岂不太不名不副实了......
- 三角快速变星星(不二秘技)
- vb到底能不能取得真正的硬盘序列号(不是分区的!因为格了就变了,没用)??
- 用winhttp的时候,Open "GET",url 这个url是不是有什么格式要求?我这里老是报"实时错误5----无效的过程调用或参数"
- 请问如何知道表的名字!大加快救救我!老板要炒我鱿鱼了!!!!
- VB下控制ACCESS数据库.报表输出用哪个办法好?
- 问一个简单的问题100分相送
- 如何向systreeview32的结点发送鼠标的双击事件
======================================
http://www.aivisoft.net/Zyl910/NetPicTran.zip
这个也试了吗?
当然,你的图片不会就只有7891那么大,所以你用循环来读,读到了马上发...这已经是错了!
说多了也是无谓,倒不如贴个地址你下载个源码来看看吧...不光是图片,别的文件也可以传...当然你也可以看zy1910的,但相对复杂点(注:文件3天后过期)
http://pickup.mofile.com/6026015554814265
首先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一块,比我设的块还大呢?你提供的源码我正在测试中,写得好像有点复杂了。谢谢您的支持。等我解决了再结贴。
想确定你的网络一次到底传了多时,在接收端那debug.print一下是最好不过的了!
也不是很复杂吧??
但还是不行:
程序如下:
发送端:(没有多少改变,就多了一个发送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秒(怕太短会出现错误)传一次图片。结果还是不行。一个头两个大!
建议不要用socket控件了~用API来封装吧.这样的效率会比较高(zy1910的网络屏幕监视.注:文件3天后过期)
http://pickup.mofile.com/3563550573712701