>  기사  >  백엔드 개발  >  golang에서 파일 전송에 대한 작은 데모를 공유하세요

golang에서 파일 전송에 대한 작은 데모를 공유하세요

藏色散人
藏色散人앞으로
2020-11-04 14:45:252544검색

다음 튜토리얼 칼럼인 golang에서는 golang의 파일 전송에 대한 작은 데모를 공유할 예정입니다. 필요한 친구들에게 도움이 되길 바랍니다!

파일 정보를 얻으려면 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
        }
     }
}

위 내용은 golang에서 파일 전송에 대한 작은 데모를 공유하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제