美文网首页go
tcp之间传输文件go实现

tcp之间传输文件go实现

作者: 女神经柒月 | 来源:发表于2018-10-31 17:02 被阅读13次

    服务端

    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)
    
    
        }
    }
    

    客户端

    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,那么开启一个连接,发送文件
        }
    }
    

    相关文章

      网友评论

        本文标题:tcp之间传输文件go实现

        本文链接:https://www.haomeiwen.com/subject/otnatqtx.html