• 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
            }
         }
    }
  • 相关阅读:
    前端之 http
    事务、存储、索引与慢查询及数据库设计的三大范式
    Navcat 软件使用及 pymysql模块
    MySQL单表查询与多表查询
    IO 模型
    Unable to round-trip http request to upstream: read tcp 192.168.xx.xxx:xxxxx->xx.xxx.xxx.x:xxx: read: operation timed out
    恶补计算机基础知识(一)
    2020 年终总结
    自我总结Java并发编程基础篇(一)
    jvm系列(三):GC算法、垃圾收集器
  • 原文地址:https://www.cnblogs.com/qq702368956/p/10195497.html
Copyright © 2020-2023  润新知