|
用Winsock控件发送文件,可是文本文件则不全 |
|
 |
我参照一份资料编了一个用Winsock控件发送文件的程序,可是有一点问题:(关于文件读取后再写入文件这个问题我上次已经问过了所以程序也改了)就是如果是文本文件则不全,如果是程序则打不开,我发现接收的数组和发送的不一样,该怎么办,程序如下:
客户端:
Private Sub Form_Load()
Winsock1.LocalPort = 1001
Winsock1.Listen
End Sub
Dim a() As Byte
Private Sub Command1_Click()
Winsock1.Connect
End Sub
Private Sub Command2_Click()
Winsock1.SendData a
End Sub
Private Sub Form_Load()
Form2.Show
Winsock1.RemoteHost = "C3Y0V3"
Winsock1.RemotePort = 1001
Open "d:\B.DAT" For Binary As #1
I = 0
Do While Not EOF(1)
I = I + 1
ReDim Preserve a(1 To I)
Get #1, , a(I)
Loop
Reset
Debug.Print I
End Sub
服务器端:
如何才能接收全呢???
Private Sub Form_Load()
Winsock1.LocalPort = 1001
Winsock1.Listen
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 B() As Byte
ReDim Preserve B(1 To bytesTotal)
Open "C:\WINDOWS\DESKTOP\C.DAT" For Binary As #2
Winsock1.GetData B, vbByte + vbArray
For I = 1 To bytesTotal - 1 '
Put #2, , B(I)
Next
Reset
End Sub
(zttjhm)
|
| |
|
 |
因为每次接收的最大字节数为:8192字节。 所以小于8192字节的文件传送与接收没有问题。如果要传送大于8192字节的文件,只好分几次传送与接收了!
主持人注:这里是唐学文推荐的文件传输程序: f_193.zip。
曲以鹏的意见:
Winsock控件的确每次只能传送8kb的数据,但是在接收方的却也收到了发送方的所有数据,你接收数据不全的原因是你每次接收新数据是会把上次的数据冲掉。解决的方法是你在接收方用一个全局的长整形数作计数器,每次接收数据时(即发生Data Arrival时间时)把这个计数器增一,并用这个计数器作文件指针,来写随机文件,这样就能传输任意大小的文件了,而且还能创送非文本的任意文件。
吴腾华的意见:
WinSock控件接受数据有两种方式,即Winsock.GetData和Winsock.PeekData,当传送的数据大于8192字节时,要采用Winsock.PeekData <string>,vbByte + vbArray +i
(i为传送的字节数),i 可以通过计算文本文件的长度取得,通过来回传送的方法,先送i值,再送文件。
此问题由刘玉军回答。
附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, Internet编程, INET, www, internet, ie。
|
| |
|
| |
|
| |
|
|
| |
|
|
|
|