温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Golang如何实现文件传输功能

发布时间:2023-03-30 09:45:59 阅读:93 作者:iii 栏目:编程语言
GO开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

今天小编给大家分享一下Golang如何实现文件传输功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

借助TCP完成文件的传输,基本思路如下:

1、发送方(客户端)向服务端发送文件名,服务端保存该文件名。

2、接收方(服务端)向客户端返回一个消息ok,确认文件名保存成功。

3、发送方(客户端)收到消息后,开始向服务端发送文件数据。

4、接收方(服务端)读取文件内容,写入到之前保存好的文件中。

Golang如何实现文件传输功能Golang如何实现文件传输功能

首先获取文件名。借助os包中的stat()函数来获取文件属性信息。在函数返回的文件属性中包含文件名和文件大小。Stat参数name传入的是文件访问的绝对路径。FileInfo中的Name()函数可以将文件名单独提取出来。

func Stat(name string) (FileInfo, error) type FileInfo interface {   Name() string          Size() int64           Mode() FileMode        ModTime() time.Time    IsDir() bool           Sys() interface{}   }

发送端:

package main import (    "fmt"    "io"    "net"    "os") func sendFile(conn net.Conn, filePath string) {    // 只读打开文件    f, err := os.Open(filePath)    if err != nil {        fmt.Println("os.Open err:", err)        return    }    defer f.Close()     // 从本文件中,读数据,写给网络接收端。 读多少,写多少。原封不动。    buf := make([]byte, 1024)    for {        n, err := f.Read(buf)        if err != nil {            if err == io.EOF {                fmt.Println("发送文件完成。")            } else {                fmt.Println("os.Open err:", err)            }            return        }        // 写到网络socket中        _, err = conn.Write(buf[:n])        if err != nil {            fmt.Println("conn.Write err:", err)            return        }    }} func main() {    list := os.Args // 获取命令行参数     if len(list) != 2 {        fmt.Println("格式为:go run xxx.go 文件绝对路径")        return    }    // 提取 文件的绝对路径    filePath := list[1]     //提取文件名    fileInfo, err := os.Stat(filePath)    if err != nil {        fmt.Println("os.Stat err:", err)        return    }    fileName := fileInfo.Name()     // 主动发起连接请求    conn, err := net.Dial("tcp", "127.0.0.1:8000")    if err != nil {        fmt.Println("net.Dial err:", err)        return    }    defer conn.Close()     // 发送文件名给 接收端    _, err = conn.Write([]byte(fileName))    if err != nil {        fmt.Println("conn.Write err:", err)        return    }    // 读取服务器回发的 OK    buf := make([]byte, 1024)    n, err := conn.Read(buf)    if err != nil {        fmt.Println("conn.Read err:", err)        return    }     if "ok" == string(buf[:n]) {        // 写文件内容给服务器——借助conn        sendFile(conn, filePath)    }}

接收端:

package main import (    "fmt"    "net"    "os") func recvFile(conn net.Conn, fileName string) {    // 按照文件名创建新文件    f, err := os.Create(fileName)    if err != nil {        fmt.Println("os.Create err:", err)        return    }    defer f.Close()     // 从 网络中读数据,写入本地文件    buf := make([]byte, 1024)    for {        n, _ := conn.Read(buf)        if n == 0 {            fmt.Println("接收文件完成。")            return        }        // 写入本地文件,读多少,写多少。        f.Write(buf[:n])    }} func main() {    // 创建用于监听的socket    listener, err := net.Listen("tcp", "127.0.0.1:8000")    if err != nil {        fmt.Println(" net.Listen err:", err)        return    }    defer listener.Close()     fmt.Println("接收端启动成功,等待发送端发送文件!")     // 阻塞监听    conn, err := listener.Accept()    if err != nil {        fmt.Println(" listener.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(conn, fileName)}

以上就是“Golang如何实现文件传输功能”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×