jycel 发表于 2009-10-18 12:50:42

[已解决]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:17

添加计时器.

jycel 发表于 2009-10-18 15:51:50

添加计时器.
bing614 发表于 2009-10-18 15:21 http://www.autoitx.com/images/common/back.gif
老兄能再说详细点吗?
提个思路!
有点不解:face (29):

破帽遮颜 发表于 2009-10-18 18:28:28

接收端进度还是发送端啊?

make2855 发表于 2009-10-18 18:36:26

关于这个方面破帽遮颜十分在行
灌水完毕!:face (25):

jycel 发表于 2009-10-18 18:39:06

本帖最后由 jycel 于 2009-10-18 18:40 编辑

接收端进度还是发送端啊?
破帽遮颜 发表于 2009-10-18 18:28 http://www.autoitx.com/images/common/back.gif
帽子终于开腔了:face (3):
服务端和接收端都有最好~传输文件功能目前我只能和主程序分开写!

jycel 发表于 2009-10-18 18:45:05

关于这个方面破帽遮颜十分在行
灌水完毕!:face (25):
make2855 发表于 2009-10-18 18:36 http://www.autoitx.com/images/common/back.gif
确实确实:face (33):
在还没学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

jycel 发表于 2009-10-18 19:03:57

马上试试!:face (33):

jycel 发表于 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)

呵呵~大概是这样吧!至于准确否,就自己多多研究了!都差不多

jycel 发表于 2009-10-18 20:40:52

我觉得这个算法不对!已发送只是一个时间!而总大小为文件大小,真正的传送进度根本未表现出来!
AU3帮助中也没提到这方面知识!也许AU3本身就没得这功能

jycel 发表于 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

ssfnpyu 发表于 2010-6-10 00:30:41

留个名。。。。以后来看看

freedom 发表于 2014-6-22 00:00:06

拿走,研究下。。互联网上传送不知道效果如何
页: [1]
查看完整版本: [已解决]TCP在传输文件中怎样读取传输进度?