golang实现文件传输小demo的方法
创始人
2024-11-18 11:02:13
0次

获取文件信息需要用到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
        }
     }
}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...