找回密码
 加入
搜索
查看: 6535|回复: 14

[已解决]TCP在传输文件中怎样读取传输进度?

[复制链接]
发表于 2009-10-18 12:50:42 | 显示全部楼层 |阅读模式
本帖最后由 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2009-10-18 15:21:17 | 显示全部楼层
添加计时器.
 楼主| 发表于 2009-10-18 15:51:50 | 显示全部楼层
添加计时器.
bing614 发表于 2009-10-18 15:21

老兄能再说详细点吗?
提个思路!
有点不解
发表于 2009-10-18 18:28:28 | 显示全部楼层
接收端进度还是发送端啊?
发表于 2009-10-18 18:36:26 | 显示全部楼层
关于这个方面破帽遮颜十分在行
灌水完毕!
 楼主| 发表于 2009-10-18 18:39:06 | 显示全部楼层
本帖最后由 jycel 于 2009-10-18 18:40 编辑
接收端进度还是发送端啊?
破帽遮颜 发表于 2009-10-18 18:28

帽子终于开腔了
服务端和接收端都有最好~传输文件功能目前我只能和主程序分开写!
 楼主| 发表于 2009-10-18 18:45:05 | 显示全部楼层
关于这个方面破帽遮颜十分在行
灌水完毕!
make2855 发表于 2009-10-18 18:36

确实确实
在还没学AU3前就知道了!
发表于 2009-10-18 18:56:44 | 显示全部楼层
这是发送端的进度~我不知道是否你所需要的
#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
 楼主| 发表于 2009-10-18 19:03:57 | 显示全部楼层
马上试试!
 楼主| 发表于 2009-10-18 19:14:50 | 显示全部楼层
帽子有点不对吧?总大小为文件的字节,后面只是一个跑的进度也就是从0开始往上加1
我先也是那样,但是文件总大小和从1相加不相关?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2009-10-18 19:38:19 | 显示全部楼层
$DnSize = FileGetSize($sendfile)
$DnPercent = Int($var * 1024 * 1000 / $DnSize * 100)
GUICtrlSetData($Label4, $DnPercent)

呵呵~大概是这样吧!至于准确否,就自己多多研究了!都差不多
 楼主| 发表于 2009-10-18 20:40:52 | 显示全部楼层
我觉得这个算法不对!已发送只是一个时间!而总大小为文件大小,真正的传送进度根本未表现出来!
AU3帮助中也没提到这方面知识!也许AU3本身就没得这功能
 楼主| 发表于 2009-10-18 21:34:22 | 显示全部楼层
本帖最后由 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
发表于 2010-6-10 00:30:41 | 显示全部楼层
留个名。。。。以后来看看
发表于 2014-6-22 00:00:06 | 显示全部楼层
拿走,研究下。。互联网上传送不知道效果如何
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-29 11:07 , Processed in 0.078924 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表