• [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("open file err = ", err)
            return
        }
        defer f.Close()
        //核心功能,读多少就发送多少
        buf := make([]byte, 2048)
        for true {
            n , err := f.Read(buf)
            if err != nil {
                if err == io.EOF {
                    fmt.Println("文件发送完毕")
                    return
                }else {
                    fmt.Println("f.read err = ", err)
                    return
                }
            }
            //给服务器发送内容
            conn.Write(buf[:n])
        }
    }
    
    func main() {
        //提示输入文件
        fmt.Println("请输入需要传输的文件:")
        var path string
        fmt.Scan(&path)
    
        //获取文件名
        info, err := os.Stat(path)
        if err != nil {
            fmt.Print("获取文件名err = ", err)
            return
        }
        //文件连接服务器
        conn, err1 := net.Dial("tcp", ":8000")
        if err1 != nil {
            fmt.Println("net.Dial err = ", err1)
            return
        }
    
        defer conn.Close()
    
        //给接收方发送文件名
        _, err = conn.Write([]byte(info.Name()))
        if err != nil {
            fmt.Println("conn.Write err = ", err)
            return
        }
        buf := make([]byte, 1024)
        n, err := conn.Read([]byte(buf))
        if err != nil {
            fmt.Println("conn.Read err = ", err)
        }
        if "ok" == string(buf[:n]) {
            fmt.Println("开始发送文件了")
            //发送文件
            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, 4*1024)
        for true {
            n, err := conn.Read(buf) //接收对方发过来的文件内容
            if err != nil {
                if err == io.EOF {
                    fmt.Println("文件接收完毕")
                }else {
                    fmt.Println("f.read err = ", err)
                    return
                }
            }
            f.Write(buf[:n])
        }
    }
    
    func main() {
        //监听
        listener, err := net.Listen("tcp", ":8000")
        if err != nil {
            fmt.Println("net.Listen err = ", err)
            return
        }
    
        defer listener.Close()
    
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("listener.Accept err = ", err)
            return
        }
        //读取文件名
        buf := make([]byte, 1024)
        var n int
        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)
    }

    先开始发送方的服务后再开始接收方,在发送方输入发送的文件名

  • 相关阅读:
    android 选择图片或拍照时旋转了90度问题
    拍照选择图片(Activity底部弹出)
    Dialog 自定义使用1
    Dialog 基本使用
    秒杀主流应用的二维码扫描
    gen already exists but is not a source folder. Convert to a source folder or rename it.
    gen already exists but is not a source folder. Convert to a source folder or rename it.
    Unable to execute dex: Multiple dex files define
    xxxx is not translated in zh-rCN, zh-rTW
    Android Application 对象介绍
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9685338.html
Copyright © 2020-2023  润新知