tcp之间传输文件go实现

2022-04-25 14:21:30 浏览数 (1)

  • 服务端
  • 客户端

服务端

代码语言:javascript复制
package main

import (
    "io"
    "os"
    "net"
    "fmt" 
)
func revFile (fileName string, conn net.Conn) {
    defer conn.Close()
    fs,err := os.Create(fileName)
    defer fs.Close()
    if err != nil {
        fmt.Println("os.Create err =",err)
        return
    }

    // 拿到数据
    buf := make([]byte ,1024*10)
    for {
        n,err := conn.Read(buf)
        if err != nil {
            fmt.Println("conn.Read err =",err)
            if err == io.EOF {
                fmt.Println("文件结束了",err)
            }
            return
        }
        if n == 0 {
            fmt.Println("文件结束了",err)
            return
        }
         fs.Write(buf[:n])

    }
}
func main ( ) {
    // 创建一个服务器
    Server,err := net.Listen("tcp","192.168.1.11:8000")
    if err != nil {
        fmt.Println("net.Listen err =",err)
        return
    }
    defer Server.Close()
    // 接受文件名
    for {
        conn, err := Server.Accept()
        defer conn.Close()
        if err != nil {
            fmt.Println("Server.Accept err =",err)
            return
        }
        buf := make([]byte ,1024)
        n,err1 := conn.Read(buf)
        if err1 != nil {
            fmt.Println("conn.Read err =", err1)
            return
        }
        // 拿到了文件的名字
        fileName := string(buf[:n])
        // 返回ok
        conn.Write([]byte ("ok"))
        // 接收文件,
        revFile(fileName,conn)


    }
}

客户端

代码语言:javascript复制
package main

import (
    "net"
    "fmt"
    "os"
)
func sendFile (path string,conn net.Conn) {
    defer conn.Close()
     fs,err :=  os.Open(path)
     defer fs.Close()
 if err != nil {
    fmt.Println("os.Open err = ", err)
    return
 }
    buf := make([]byte,1024*10)
    for{
        //  打开之后读取文件
        n, err1:= fs.Read(buf)
        if err1 != nil {
            fmt.Println("fs.Open err = ", err1)
            return
        }

        //  发送文件
        conn.Write(buf[:n])
    }

}
func main ( ) {
    for {

    fmt.Println("请输入一个全路径的文件,比如,D:\a.jpg")
    //  获取命令行参数
    var path string 
    fmt.Scan(&path)
    // 获取文件名, 
    info,err := os.Stat(path);
    if err != nil {
        fmt.Println("os.Stat err = ",err)
        return
    }
    // 发送文件名
    conn, err1 :=  net.Dial("tcp","192.168.1.11:8000")
    defer conn.Close()
    if err1 != nil {
        fmt.Println("net.Dial err = ",err1)
        return
    }
    conn.Write([]byte (info.Name()))
    // 接受到是不是ok
    buf := make([]byte,1024)
    n , err2 := conn.Read(buf)
    if err2 != nil {
        fmt.Println("conn.Read err = ",err2)
        return
    }
    if "ok" == string(buf[:n]) {
        fmt.Println("成功");
        sendFile(path,conn)
    } 
    // 如果是ok,那么开启一个连接,发送文件
    }
}

0 人点赞