在服务器端和客户端怎样实现网络传输,我现在用CAsyncSocket传输,但由于是传输多个文件。如1.TXT 2.GIF 3.JPEG。必须一个一个传输,怎样在客户端和服务器端建立一种机制,使发送端发送的数据能被接收端正确的接收到。比如怎样在传送完1.TXT传输2.GIF。而且客户端怎样才能保证当前接收的数据就是目前要接收的,而不是过时的。比如当前要接收2.GIF,就不要接收到的数据是1.TXT
解决方案 »
- 怎样编辑CMFCRibbonBar的事件响应
- 问一个关于一MFC窗口中嵌入另一个非MFC窗口的问题
- DoPrintPreview的困惑
- 求助 个人制作的一个上位机软件 ,和单片机通讯,在笔记本上和台式机上完全没有问题,可是在工控机上就出问题
- 视频捕捉程序,100分!急急
- 请推荐一本好书
- 为什么第二回不进来?
- 一个极其无聊的问题!答好给分!!!
- 收发udp包,当包较小的时候,用不用考虑一次收发不全的情况?请大侠详细讲讲。
- Microsoft Media Player控件有资源漏洞???
- 请问,如何引发阻塞?如何去避开阻塞处理呢?
- 一个关于SDI窗口分割的问题,不知道是什么原因分割出来的,和实际想要的不一样,有代码+图.解决者送分提出方法也给分
发送前先把 文件的数据属性 先发送了
然后发送文件
一个一个发 注意 每次 发送数据后 对方要给各应答 确认收到了 再 继续发~~
没有什么好的东东 ~~
给你看个你想实现的示例~~:)
http://www.vckbase.com/code/downcode.asp?id=1786
可以给我发代码吗?谢谢
[email protected]
另外你有没有udp协议传送文件的例子?
但是由于udp协议本身没有自动找包的功能,因此经常会出现丢包的现象,会造成传送的文件丢包的现象
因为时间匆忙和水平有限,本人在效率上没有作优化,只是简单的实现,请大家自己看源码吧
注释:
主要功能:把文件猜成4k大小的包 在包头+上包的长度 接受了1个包判断长度是否和接受的长度相符如果符合那么就继续发,如果出现丢包那么就从发
希望大家有什么好的建议通知我,我会尽量完善的
Option Explicit
'==============================================
'===============================
'udp传文件
'客户端
'作者: 影子
'================================
'==============================================
Dim FileNumber As Integer '用来存文件的句柄
Dim LenFile As Long '文件的长度
Private Sub Command2_Click()
closefile
End SubPrivate Sub Form_Load()
Winsock0.LocalPort = 5698
Winsock0.Bind
beginfile
End Sub
Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim FileByte() As Byte
Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组
Dim mendByte() As Byte, i As Long, j As Long
Dim temp As String, temp1 As String
'获得包长
j = UBound(FileByte)
'合并包头
For i = 0 To 7 Step 2
temp = temp & Chr(FileByte(i))
Next
'比较长度看丢包没有
If Val(temp) = j Then ReDim mendByte(j - 8)
' 提出包头
For i = 0 To j - 8
mendByte(i) = FileByte(i + 7)
Next
' 写文件
Put #FileNumber, , mendByte
' 发送继续发送的请求
frmmain.Winsock0.SendData "ok"
Else
'出现丢包,请求重发
frmmain.Winsock0.SendData "no"
End If
End SubPublic Sub beginfile()
FileNumber = FreeFile '取得未使用的文件号
Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
End SubPublic Sub closefile() '关闭文件句柄
Close #FileNumber
End SubOption Explicit
Dim GetFileNum As Integer
Dim LenFile As Long
Dim Sendbaye() As Byte '发送的包
'===============================
'udp传文件
'作者: 影子
'服务器端
'================================
Private Sub Command1_Click()
GetFileNum = FreeFile '取得未使用的文件号
LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度
Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件
Command1.Enabled = False
' 传送文件
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Text1.Text = Now
End SubPrivate Sub Form_Load()
frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
frmmain.Winsock0.RemotePort = 5698End Sub
'=========================================================================
'为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据
'==========================================================================
Private Function SplitFile() As Long '拆包
On Error Resume Next
Dim GetCount As Long
'计算出这次可发送的字节数
If LenFile >= 4000 Then
GetCount = 4000
LenFile = LenFile - GetCount
Else
GetCount = LenFile
LenFile = LenFile - GetCount
End If
SplitFile = GetCountEnd Function
Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long)
Dim FileByte() As Byte, i As Long, j As Long
Dim temp As String
ReDim Sendbaye(0)
Dim tempa As String * 4
ReDim FileByte(SendLen - 1)
tempa = SendLen + 7
Sendbaye = tempa ' 把长度负值给包头
Get #FileNumber, , FileByte '读取文件
ReDim Preserve Sendbaye(SendLen + 7) '把包头+到文件头
For i = 0 To UBound(FileByte)
Sendbaye(i + 7) = FileByte(i)
Next
frmmain.Winsock0.SendData Sendbaye
End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim str As String
frmmain.Winsock0.GetData str
Select Case str
Case "ok"
'成功继续发送
If LenFile = 0 Then '发送完成
MsgBox "成功"
Exit Sub
End If
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Case "no"
'不成功重发上一个包
frmmain.Winsock0.SendData Sendbaye
End Select
End Sub一个vb的例子,udp传文件关键是设计好上层协议,防止丢包。这个例子用的是停止等待协议,比较简单易懂。