[已解决]TCP在传输文件中怎样读取传输进度?
本帖最后由 jycel 于 2009-10-27 14:47 编辑解决方法:
发送端13楼、客户端照发送端会显示不正常!正在研究,解决后再发出来
效果图如下:
搜完整个贴子,还没看到有样,都只是局域网复制才有的
如题,在我们做TCP传输时,怎样来获取这个进度
比如说,传的这个文件大小FileGetSize(文件)
已传送:(?)
问题就在怎样来获取这个已传送进度,以便做个进度条出来!
测试代码如下:
接收端:
#NoTrayIcon
$fileini=@ScriptDir & "\file.ini"
_recvFiles()
Func _recvFiles();接收文件
Local $g_IP = @IPAddress1
Local $downfile = IniRead($fileini,"配置信息","保存地址","")
; 开始 TCP 服务
TCPStartup()
; 创建监听套接字(SOCKET)
$MainSocket = TCPListen($g_IP, 62345)
If $MainSocket = -1 Then Exit
$file = FileOpen($downfile, 2 + 8 + 16)
If $file = -1 Then
MsgBox(0, "错误", "无法打开目标文件。")
Exit
EndIf
; 查看客户端连接
;--------------------
Dim $var = 1
While 1
$ConnectedSocket = TCPAccept($MainSocket)
If $ConnectedSocket >= 0 Then
;MsgBox(0, "", "我的服务器 - 客户端已经连接")
;打开文件准备接收
;开始接收文件
While 1
$sBuff = TCPRecv($ConnectedSocket, 1024 * 1000)
If @error Then
FileClose($downfile)
Return $downfile
EndIf
;写文件
FileWrite($downfile, $sBuff)
$var += 1
TrayTip("msg", $var, 5)
WEnd
EndIf
WEnd
;关闭套接字,停止TCP服务
TCPCloseSocket($ConnectedSocket)
TCPShutdown()
EndFunc ;==>_recvFiles
发送端:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#NoTrayIcon
$fileini=@ScriptDir & "\send.ini"
#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Administrator\桌面\sendfile.kxf
$Form1 = GUICreate("请稍候,正在发送中……", 293, 71, 320, 260)
$Group1 = GUICtrlCreateGroup("", 2, 0, 289, 65)
$Label1 = GUICtrlCreateLabel("总大小:", 10, 16, 104, 17)
$Label2 = GUICtrlCreateLabel("已发送:", 146, 16, 100, 17)
$Label3 = GUICtrlCreateLabel("发送状态:", 10, 40, 220, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_SendFile()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _SendFile()
Local $g_IP = IniRead($fileini,"配置信息","接收地址","")
;Local $sendfile = @ScriptDir & "\test.rar"
Local $sendfile = IniRead($fileini,"配置信息","发送文件","")
dim $var = 1
;开始tcp服务
TCPStartup()
;创建一个套接字(socket)连接到已经存在的服务器
$socket = TCPConnect($g_IP, 62345)
If $socket = -1 Then
MsgBox(0, "出错", "连接到服务器出错: " & @error)
Exit
EndIf
$file = FileOpen($sendfile, 16)
;打开读取文件
While 1
$fdata = FileRead($file,1024 * 1000)
If @error = -1 Then ExitLoop
TCPSend($socket, $fdata)
$var += 1
traytip("msg",$var,5)
GUICtrlSetData($Label1,"总大小:"&FileGetSize($fdata))
GUICtrlSetData($Label2,"已发送:"&$var)
GUICtrlSetData($Label3,"发送状态:正在发送中……")
WEnd
TCPCloseSocket($socket)
TCPshutdown()
GUICtrlSetData($Label3,"发送状态:发送完毕!")
EndFunc ;==>_SendFile
添加计时器. 添加计时器.
bing614 发表于 2009-10-18 15:21 http://www.autoitx.com/images/common/back.gif
老兄能再说详细点吗?
提个思路!
有点不解:face (29): 接收端进度还是发送端啊? 关于这个方面破帽遮颜十分在行
灌水完毕!:face (25): 本帖最后由 jycel 于 2009-10-18 18:40 编辑
接收端进度还是发送端啊?
破帽遮颜 发表于 2009-10-18 18:28 http://www.autoitx.com/images/common/back.gif
帽子终于开腔了:face (3):
服务端和接收端都有最好~传输文件功能目前我只能和主程序分开写! 关于这个方面破帽遮颜十分在行
灌水完毕!:face (25):
make2855 发表于 2009-10-18 18:36 http://www.autoitx.com/images/common/back.gif
确实确实:face (33):
在还没学AU3前就知道了! 这是发送端的进度~我不知道是否你所需要的#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
;~ #NoTrayIcon
$fileini = @ScriptDir & "\send.ini"
#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Administrator\桌面\sendfile.kxf
$Form1 = GUICreate("请稍候,正在发送中……", 293, 71, 320, 260)
$Group1 = GUICtrlCreateGroup("", 2, 0, 289, 65)
$Label1 = GUICtrlCreateLabel("总大小:", 10, 16, 104, 17)
$Label2 = GUICtrlCreateLabel("已发送:", 146, 16, 100, 17)
$Label3 = GUICtrlCreateLabel("发送状态:", 10, 35, 220, 17)
$Label4 = GUICtrlCreateProgress(10, 45, 220, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_SendFile()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _SendFile()
;~ Local $g_IP = IniRead($fileini, "配置信息", "接收地址", "")
Local $g_IP = @IPAddress1
;Local $sendfile = @ScriptDir & "\test.rar"
;~ Local $sendfile = IniRead($fileini, "配置信息", "发送文件", "")
Local $sendfile = @ScriptDir & '\ini.txt'
Dim $var = 1
;开始tcp服务
TCPStartup()
;创建一个套接字(socket)连接到已经存在的服务器
$socket = TCPConnect($g_IP, 62345)
If $socket = -1 Then
MsgBox(0, "出错", "连接到服务器出错: " & @error)
Exit
EndIf
$DnSize = FileGetSize($sendfile)
$file = FileOpen($sendfile, 16)
;打开读取文件
While 1
$fdata = FileRead($file, 1024 * 1000)
If @error = -1 Then ExitLoop
TCPSend($socket, $fdata)
$var += 1
TrayTip("msg", $var, 5)
GUICtrlSetData($Label1, "总大小:" & $DnSize)
GUICtrlSetData($Label2, "已发送:" & $var)
GUICtrlSetData($Label3, "发送状态:正在发送中……")
$DnPercent = Int($var * 1024 * 1000 / $DnSize * 100)
GUICtrlSetData($Label4, $DnPercent)
WEnd
TCPCloseSocket($socket)
TCPShutdown()
GUICtrlSetData($Label3, "发送状态:发送完毕!")
EndFunc ;==>_SendFile 马上试试!:face (33): 帽子有点不对吧?总大小为文件的字节,后面只是一个跑的进度也就是从0开始往上加1
我先也是那样,但是文件总大小和从1相加不相关?
$DnSize = FileGetSize($sendfile)
$DnPercent = Int($var * 1024 * 1000 / $DnSize * 100)
GUICtrlSetData($Label4, $DnPercent)
呵呵~大概是这样吧!至于准确否,就自己多多研究了!都差不多 我觉得这个算法不对!已发送只是一个时间!而总大小为文件大小,真正的传送进度根本未表现出来!
AU3帮助中也没提到这方面知识!也许AU3本身就没得这功能 本帖最后由 jycel 于 2009-10-27 14:46 编辑
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=b.ico
#AutoIt3Wrapper_outfile=SendaFile.exe
#AutoIt3Wrapper_Res_Comment=文件传送-发送端
#AutoIt3Wrapper_Res_Description=文件传送程序
#AutoIt3Wrapper_Res_LegalCopyright=BY-Jycel
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#NoTrayIcon
$fileini = @ScriptDir & "\File.ini"
#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Administrator\桌面\sendfile.kxf
$Form1 = GUICreate("请稍候,正在发送中……", 391, 122, 266, 477)
$Group1 = GUICtrlCreateGroup("", 3, 0, 385, 113)
$Label1 = GUICtrlCreateLabel("文件大小:", 11, 16, 364, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Labeljd = GUICtrlCreateLabel("已经发送:", 11, 40, 364, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label2 = GUICtrlCreateLabel("", 355, 88, 30, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label3 = GUICtrlCreateLabel("发送状态:", 11, 64, 364, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label4 = GUICtrlCreateProgress(11, 88, 337, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_SendFile()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _SendFile()
;~ Local $g_IP = IniRead($fileini, "配置信息", "接收地址", "")
Local $g_IP = IniRead($fileini, "配置信息", "接收地址", "");@IPAddress1
;Local $sendfile = @ScriptDir & "\test.rar"
;~ Local $sendfile = IniRead($fileini, "配置信息", "发送文件", "")
Local $sendfile = IniRead($fileini, "配置信息", "发送文件", "");@ScriptDir & '\ini.txt'
Dim $var = 1
;开始tcp服务
TCPStartup()
;创建一个套接字(socket)连接到已经存在的服务器
$socket = TCPConnect($g_IP, 62345)
If $socket = -1 Then
MsgBox(0, "出错", "连接到服务器出错: " & @error)
Exit
EndIf
$DnSize = FileGetSize($sendfile)
$file = FileOpen($sendfile, 16)
;打开读取文件
While 1
$fdata = FileRead($file, 1024 * 1000)
If @error = -1 Then ExitLoop
TCPSend($socket, $fdata)
$var += 1
;TrayTip("msg", $var, 5)
GUICtrlSetData($Label1, "文件大小:" & $DnSize&"字节")
GUICtrlSetData($Label3, "发送状态:正在发送中……")
$DnPercent = Int($var * 1024 * 1000 / $DnSize * 100)
GUICtrlSetData($Label2, GUICtrlRead($Label4)&"%")
$jd=GUICtrlRead($Label4)/100
GUICtrlSetData($Labeljd,"已经发送:"&$jd*$DnSize&"字节")
GUICtrlSetData($Label4, $DnPercent)
WEnd
TCPCloseSocket($socket)
TCPShutdown()
GUICtrlSetData($Label3, "发送状态:发送完毕!3秒后退出")
Sleep(1000)
GUICtrlSetData($Label3, "发送状态:发送完毕!2秒后退出")
Sleep(1000)
GUICtrlSetData($Label3, "发送状态:发送完毕!1秒后退出")
Sleep(1000)
Exit
EndFunc ;==>_SendFile
留个名。。。。以后来看看 拿走,研究下。。互联网上传送不知道效果如何
页:
[1]