局域网文件传输软件[通俗易懂]

局域网文件传输软件[通俗易懂]在公司实习了一个周,虽然很累,但也感觉有所得,此次项目是做一个局域网两台计算机之间的文件传输。我用的主要控件为winsock控件,用其TCP协议。至于用此控件连接两台计算机书上都有介绍,我主要介绍一下我传送文件的思想和方法:首先,将要传送的文件分成指定大小的N个包,大小不能超过8K因为TCP每次最多发送8K数据,最后一个包可能会小于其它包。然后在每个包加个包头,因为接收端需要通过包头知道传送过来的

大家好,又见面了,我是你们的朋友全栈君。在公司实习了一个周,虽然很累,但也感觉有所得,此次项目是做一个局域网两台计算机之间的文件传输。我用的主要控件为winsock控件,用其TCP协议。至于用此控件连接两台计算机书上都有介绍,我主要介绍一下我传送文件的思想和方法:

首先,将要传送的文件分成指定大小的N个包,大小不能超过8K因为TCP每次最多发送8K数据,最后一个包可能会小于其它包。然后在每个包加个包头,因为接收端需要通过包头知道传送过来的是数据还是路径(因为发送端指定存放路径),接收端收到数据后必须返回确认到发送端,这样才能循环发送,但一定要有最后的终止,不然会死循环。我的主要发送和接收代码如下:

发送端收到数据后产生的事件

Private Sub WskCli_DataArrival(ByVal bytesTotal As Long)

    Dim FIT As Boolean, OVER As Boolean, xx As Byte

    WskCli.GetData FIT

    If Number < BagNum Then

        If FIT = True Then ‘接收端已收到上一个数据包

           

            If v <> 0 Then ‘传送速率受限制

                Dim ss As Long

                ss = 0

                Do Until (Number * 1024 <= v * ss) ‘传送速率过大则等待

                    ss = CLng((Time – timeInt) * 3600 * 24)

                Loop

            End If

           

            Send_File ‘调用发送文件数据包过程

        End If

        Number = Number + 1 ‘计数

        ProgressBar1.Value = Number * 20 / BagNum ‘刷新进度条的进度

    El**

        *x = 2

        WskCli.SendData xx ‘发送传送完毕的信息给接收端

        Close 1

        Label1.Caption = “发送完毕!”

        OVER = True

        Number = 0 ‘传送完后置计数Number=0

    End If

    If OVER = True Then ‘传送完之后的处理

        Drive1.Enabled = True

        Dir1.Enabled = True

        File1.Enabled = True

        CmdSend.Enabled = True

        Exit Sub

    End If

End Sub

send_file是自定义的一个发送过程:

Private Sub Send_File()

    Dim i As Long ‘循环变量

    If Number <= BagNum – 1 Then

        ReDim Buff(1 To BagSize) As Byte ‘定义缓冲区

        ReDim TempBuff(0 To BagSize) As Byte

       

        Get 1, , Buff

       

        TempBuff(0) = 1 ‘设置包头为1代表文件数据

        For i = 1 To BagSize

            TempBuff(i) = Buff(i)

        Next

       

        WskCli.SendData TempBuff

    Else

        ‘传送最后一个数据包

        n = filelength – Seek(1) + 1 ‘得到最后一个包的大小

        If n > 0 Then

            ReDim Buff(0 To n) As Byte

            ReDim TempBuff(0 To n) As Byte

            TempBuff(0) = 1 ‘设置包头为1代表文件数据

            Get 1, , Buff

            For i = 1 To n

                TempBuff(i) = Buff(i – 1)

            Next

            WskCli.SendData TempBuff

        End If

    End If

End Sub

‘发送按钮被按下的响应事件

Private Sub CmdSend_Click()

    CmdSend.Enabled = False

    Combo1.Enabled = False

    If Combo1.Text = “” Then

        MsgBox “请选择一个传输速度!”, vbOKOnly, “错误”

    Else

        ‘传送速度的选择

        Select Case Combo1.ListIndex

            Case 0

                v = CLng(200) * 1024

            Case 1

                v = CLng(600) * 1024

            Case 2

                v = 1.5 * CLng(1024) * 1024

            Case 3

                v = 2 * CLng(1024) * 1024

            Case 4

                v = 0

        End Select

        If Number > 0 Then

            ‘重传或续传

            If MsgBox(“上次未能传送完成,是否续传?”, vbYesNo, “提示”) = vbNo Then Number = 0: Close 1

        End If

       

        ReDim Buff(Len(sendFileName)) As Byte

        Buff(0) = 0

        For i = 1 To Len(sendFileName)

            Buff(i) = Asc(Mid(sendFileName, i, 1))

        Next

        WskCli.SendData Buff ‘发送文件路径和文件名

    End If

    Open fn For Binary Access Read As #1

   

    ‘设置数据包的数量

    filelength = LOF(1) ‘文件长度

    BagNum = filelength / BagSize

    If BagNum < filelength / BagSize Then BagNum = BagNum + 1

   

    ‘计时初始化

    timeInt = Time

End Sub

接收端接收数据的事件:

Private Sub WskSer_DataArrival(ByVal bytesTotal As Long)

    Dim Buff() As Byte ‘定义接收数据缓冲区

    Dim OVER As Boolean ‘结束标记

   

    WskSer.GetData Buff ‘接收数据

   

    ‘判断包头信息

    Select Case Buff(0) ‘包头

        Case 0

            ‘得到存放路径和文件名

            fn = “”

            For i = 1 To UBound(Buff)

                fn = fn + Chr(Buff(i))

            Next

           

            Open fn For Binary As #1 ‘新建或打开文件

            Close 1

            Label1.Caption = “正在发送”

        Case 1

            ‘写入文件

            Open fn For Binary Access Write As #1

            Seek #1, LOF(1) + 1 ‘找到文件尾

            ReDim TempBuff(1 To UBound(Buff)) As Byte

           

            ‘去掉包头

            For i = 1 To UBound(Buff)

                TempBuff(i) = Buff(i)

            Next

           

            Put 1, , TempBuff ‘将数据写入文件

            Close 1

        Case 2

            ‘接收结束

            Label1.Caption = “发送完毕!”

            OVER = True

    End Select

   

    If OVER = True Then Exit Sub ‘如果接收完毕则退出此过程

    WskSer.SendData True ‘告诉客户端继续发送下一个数据包

End Sub

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135923.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c程序设计,贪吃蛇程序是什么_C语言编写贪吃蛇

    c程序设计,贪吃蛇程序是什么_C语言编写贪吃蛇C语言,贪吃蛇程序设计一.代码分析(1)头文件(2)宏定义(3)全局变量(4)函数部分1)绘制地图函数DreawMap(),2)食物位置函数FoodRand()3)键盘控制移动函数ControlMove()函数4)移动函数Move()函数5)蛇身开始函数Isnake()函数6)判断食物是否被吃到函数Jfood()函数7)判断是否碰到墙Jwell()函数8)判断是否碰到蛇身Jsnake()函数9)计算分数和难度Showf()函数10)清空存储空间函数二.代码附录一.代码分析(1)头文件1.include

    2025年7月22日
    4
  • 私有IP地址_ipv6私有地址

    私有IP地址_ipv6私有地址私有IP地址:在ABC三类网络中,如下三段网络地址为私有IP地址,如何人都可以自行在自己的局域网中使用这些IP地址.A类私有:10.0.0.110.255.255.254B类私有:172.16

    2022年8月5日
    14
  • SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合

    SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合

    2021年9月26日
    61
  • C语言中动态分配数组

    C语言中动态分配数组很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些致命的错误。尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的。那么我们在自己编写C语言代码的时候就…

    2022年7月22日
    9
  • python和java哪个就业更好_python和JAVA的区别

    python和java哪个就业更好_python和JAVA的区别一、从几个方面进行比较Python和Java都是目前最为流行的编程语言,到底哪一个更好找工作,比较以下几个方面可以提供一些参考价值。1、就业现状从目前的就业现状来看,Java的工作机会肯定是更多的,如Web开发、大数据开发和移动互联网开发等都是基于Java的应用方向。正是因为应用方向多,所以存在人才发展跟不上市场的需求的现状,因此长期来看Java的霸主地位是不会动摇的。但Python是更面向未来的。毕竟我国把发展人工智能作为国策大力推动。大数据、人工智能、数据分析都是基于Python…

    2025年7月31日
    3
  • matlab中doc怎么用_ipaddock栏设置

    matlab中doc怎么用_ipaddock栏设置dock栏是是苹果IOS系统或者MAC系统自带任务栏以及切换的快捷窗口,一般活动桌面为最下方固定的界面就是dock栏;MAC系统中的Dock栏,可以显示、切换下运行的程序,也可以单击上面的程序图标则启动那个程序。本文操作环境:iOS12.3.1系统,iPhone11。Dock栏就是苹果IOS系统或者MAC系统自带任务栏以及切换的快捷窗口,一般活动桌面为最下方固定的界面就是dock栏。MAC系统…

    2025年10月31日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号