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

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

原文地址:https://www.cnblogs.com/baylorqu/p/9685338.html