zoukankan      html  css  js  c++  java
  • go 接收发送文件

    package main
    
    import (
        "fmt"
        "os"
        "net"
        "io"
    )
    
    //发送文件内容
    func SendFile(path string,conn net.Conn){
        //以只读的方式打开文件
        f,err  := os.Open(path)
        if err != nil{
            fmt.Println("os.Open err=",err)
            return
        }
    
        defer f.Close()
    
        buf := make([]byte,1024*4)
        for{
            n,err := f.Read(buf)
            if err !=nil{
                if err == io.EOF{
                    fmt.Println("文件传输完毕")
                }else{
                    fmt.Println(" f.Read err=",err)
                }
                return
            }
            //发送内容
            conn.Write(buf[:n])
        }
    
    
    }
    
    func main()  {
        //提示输入文件
        fmt.Println("请输入需要传输的文件")
        var path string
        fmt.Scan(&path)
    
        //获取文件名 info.Name()
        info,err := os.Stat(path)
    
        if err != nil{
            fmt.Println("os.Stat err= ",err)
            return
        }
    
        //主动连接我们的服务器
        conn,err := net.Dial("tcp","127.0.0.1:8000")
        if err !=nil{
            fmt.Println("net.Dial err=",err)
            return
        }
    
        //给接收方发送文件名
        _,err = conn.Write([]byte(info.Name()))
        if err != nil{
            fmt.Println("conn.Write err =",err)
            return
        }
    
        var n int
        buf := make([]byte,1024)
        n,err = conn.Read(buf)
        if err !=nil{
            fmt.Println("conn.Read err=",err)
            return
        }
    
        if "ok"== string(buf[:n]){
            //发送文件内容
            SendFile(path,conn)
        }
    
    
    
    
    
    }
    package main
    
    import (
        "net"
        "fmt"
        "os"
        "io"
    )
    //文件的接收操作
    func RecvFile(filename string,conn net.Conn)  {
       //新建文件
       f,err :=  os.Create(filename)
       if err != nil{
           fmt.Println("os.Create err=",err)
           return
       }
    
       buf := make([]byte,1024)
       for{
            n,err := conn.Read(buf) //接收对方发送过来的文件内容
            if err != nil{
                if err == io.EOF{
                    fmt.Println("文件接收完毕")
            }else{
                fmt.Println("conn.Read err=",err)
    
            }
            return
         }
         if n == 0{
             fmt.Println("n==0 文件接收完毕")
             break
         }
         f.Write(buf[:n])
       }
    }
    
    func main()  {
        //监听
        listernner,err := net.Listen("tcp","127.0.0.1:8000")
        if err != nil{
            fmt.Println("net.Listen err =",err)
            return
        }
        defer  listernner.Close()
        //阻塞等待用户连接
        conn,err := listernner.Accept()
        if err != nil{
            fmt.Println("listenner.Accept err=",err)
            return
        }
        defer  conn.Close()
    
        //缓冲
        buf := make([]byte,1024)
    
         n,err := conn.Read(buf)
         if err != nil{
             fmt.Println("conn.Read err =",err)
             return
         }
    
         filename := string(buf[:n])
         //回复ok
         conn.Write([]byte("ok"))
    
         //接收文件内容
         RecvFile(filename,conn)
    
    
    
    
    }
  • 相关阅读:
    MySQL 5.6中如何定位DDL被阻塞的问题
    MySQL 5.7中如何定位DDL被阻塞的问题
    MySQL表结构变更,不可不知的Metadata Lock
    mysqlfrm
    升级MySQL5.7,开发不得不注意的坑
    MySQL root密码忘记,原来还有更优雅的解法!
    MySQL 8 新特性之自增主键的持久化
    ip route显示和设定路由
    RHEL7/CentOS7 ip 命令常用用法,代替 ifconfg/route/ifup/ifdown
    网络安全+运维进阶(79)-网络基础-网络基础
  • 原文地址:https://www.cnblogs.com/dqh123/p/12075341.html
Copyright © 2011-2022 走看看