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

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

  • 相关阅读:
    新装CentOS7用yum安装软件提示 cannot find a valid baseurl for repobase7x86_64
    新手快速上手webpack4打包工具的使用详解
    2种方法教你,如何将exe注册为windows服务,直接从后台运行
    如何部署前端DIST目录
    安装了vs2019 编译node-sass node-gyp 找不到编译器的解决方法
    node-sass安装失败之npm ERR! Failed at the node-sass@4.9.4 postinstall script.
    Node.js安装及环境配置之Windows篇
    npm源切换,从淘宝源切换至npm源
    找不到Python问题解决 (转)
    redisson
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9685338.html
Copyright © 2011-2022 走看看