zoukankan      html  css  js  c++  java
  • golang 实现文件传输小demo

        获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者。

    发送者:

    package main
    
    import (
        "fmt"
        "io"
        "net"
        "os"
    )
    
    func main() {
        fmt.Println("请输入接收者地址(IP:PORT):")
        var addr string
        fmt.Scan(&addr)
        fmt.Println("请输入需要传输的文件:")
        var path string
        fmt.Scan(&path)
        info, errf := os.Stat(path)
        if errf != nil{
            fmt.Println("os.Stat errf =", errf)
            return
        }
    
        conn, err := net.Dial("tcp", addr)
        if err != nil{
            fmt.Println("net.Dial err =",err)
            return
        }
        defer conn.Close()
    
        _, err = conn.Write([]byte(info.Name()))
        if err != nil{
            fmt.Println("conn.Write info.Name err =",err)
            return
        }
        var n int
        buf := make([]byte, 1024)
        n, err = conn.Read(buf)
        if err != nil{
            fmt.Println("conn.Read ok err =", err)
            return
        }
        if "ok" == string(buf[:n]){
            fmt.Println("ok")
            SendFile(path, conn)
        }
    }
    
    func SendFile(path string, conn net.Conn){
         file , err := os.Open(path)
    
         if err != nil{
             fmt.Println("os.Open err =", err)
             return
         }
         defer file.Close()
         buf := make([]byte, 1024 * 4)
    
         for {
             n, err := file.Read(buf)
             if err != nil{
                 if err == io.EOF{
                     fmt.Println("文件发送完毕")
                } else{
                    fmt.Println("file.Read err =",err)
                }
    
                 return
             }
             if n == 0{
                 fmt.Println("文件发送完毕")
                 break
             }
             conn.Write(buf[:n])
         }
    }

    接收者:

    package main
    
    import (
        "fmt"
        "io"
        "net"
        "os"
    )
    
    func main() {
        fmt.Println("请你的地址(IP:PORT):")
        var addr string
        fmt.Scan(&addr)
        listenner, err := net.Listen("tcp", addr)
        if err != nil{
            fmt.Println("net.Listen err =", err)
            return
        }
        defer listenner.Close()
    
        conn, errl := listenner.Accept()
        if errl != nil{
            fmt.Println("listenner.Accept err =", errl)
            return
        }
        var n int
        buf := make([]byte, 1024)
        n, err = conn.Read(buf)
        if err != nil{
            fmt.Println("conn.Read fileName err =", err)
            return
        }
        fileName := string(buf[:n])
        n, err = conn.Write([]byte("ok"))
        if err != nil{
            fmt.Println("conn.Write ok err =", err)
            return
        }
    
        RecvFile(fileName, conn)
    }
    
    func RecvFile(fileName string, conn net.Conn){
         file , err := os.Create(fileName)
         if err != nil{
             fmt.Println("os.Create err =", err)
             return
         }
    
         defer file.Close()
    
         buf := make([]byte, 1024 * 4)
         for{
             n, err := conn.Read(buf)
             if err != nil{
                 if err == io.EOF{
                     fmt.Println("文件接收完成")
                } else {
                    fmt.Println("conn.Read err =", err)
                }
                return
            }
    
             n, err = file.Write(buf[:n])
             if err != nil{
                 fmt.Println("file.Write err =", err)
                 break
            }
         }
    }
  • 相关阅读:
    Window安装Redis并设置为开机启动
    大佬为你揭秘微信支付的系统架构,你想知道的都在这里了
    想要设计自己的微服务?看这篇文章就对了
    破局人工智能:构建AI,与腾讯云一起探索语音应用场景
    巧用机器学习定位云服务器故障
    重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」
    5分钟内看懂机器学习和深度学习的区别
    如何防范和应对Redis勒索,腾讯云教你出招
    Redis勒索事件爆发,如何避免从删库到跑路?
    作为一个编程新手,我再也不怕Flink迷了我的眼!
  • 原文地址:https://www.cnblogs.com/qq702368956/p/10195497.html
Copyright © 2011-2022 走看看