这送端:
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
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
解决方案 »
- 由图形生成数据^_^
- VBA执行带有ant命令的bat文件
- 请问提高向数据库写数据速度的方法
- VB在调试时可以把鼠标放在要查看的变量上就会显示出值,但为什么有时不行有时又得行呢?有没有什么补丁呢
- 如何实现如QQ特效Listview列表中多个检查框(checkbox)
- CSDN什么时候可以好啊?
- 100分求一个用API方式实现PC机与单片机串口通信的完整实例
- Datalist与Text关联问题???在线等,送100分!!
- 请教关于sql语句中的日期变量的查询问题
- 有网友 知道 如何用VBA 向WORD 中写入 文档吗
- 请问:microsoft transaction server type library 的文件名称是什么?
- 一个问题,请指教
Winsock1(i).SendData "SendFile," & Dir(Text2.Text) & " arr"
Senfile就是发送文件的时也送过去!到了接收端的时.就用CmdArr(0)来接收!
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数据。
CmdArr = Split(strData, ",") '把数据格式化到数组里
MsgBox CmdArr(0) -----------------???????为什么这里得不到SendFile?
去掉之后,文件就可以传输啊!
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
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" 是字符串类型,因此接收端接收不到
解决方法,如果在原来你的方法上改的话很复杂,你再下载个代码吧,
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
如果你想使用 字符的方式来发送 二进制的数据的话 请把所有二进制转化为字符编码格式(譬如 base64)接收端 再解码。不过这样效率很低,建议都使用二进制来发送。也就是把字符串格式成二进制(使用StrConv函数)
2。对大数据发送最好使用tcp方式,看楼主的代码应该是udp方式。tcp 发送数据有一个 叫sendcomplete 事件 当一次senddata调用对方收到数据后会触发的。这样在这个事件里再发送下一个数据包。
因为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
楼上的各位都说的差不多了。要纯二进制处理,不要把字符串掺和到里面。VB中的字符串是一种高度自动化的Unicode字符串,大部分时候用起来很方便,可是有时候会帮倒忙。经常见到一些代码用字符串来处理二进制数据,那些大概都是VB1-VB4时代的代码,那时候字符串可能是ANSI的,就像C语言中的Char[],当然可以代替字节数组,但现在对 VB5/6 肯定不适用了。(以上纯属猜测,我没用过VB1-VB4,呵呵)
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字节,则这些方法都不行,必须编程序处理了,讲那些太麻烦。