1.软文推荐

2.软文推荐

3.软文推荐

这篇文章主要为大家详细介绍了Golang实现文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Golang实现文件传输的具体代码,供大家参考,具体内容如下

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

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

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

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

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

首先获取文件名。借助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)
}

本文来源:www.lxlinux.net/10502.html,若引用不当,请联系修改。

相关文章 8

1

学生云服务器(学生云服务器怎么用) 2分钟前

目录:1、有哪些对学生有优惠的VPS云主机?2、学生要怎样选购云服务器?谢谢了。3、有哪些适合学生党使用的云服务器?有哪些对学生有...

2

通过python实现横向拼接图片 3分钟前

本篇文章重点为大家讲解一下通过python实现横向拼接图片具体方法,有需要的小伙伴可以参考一下。 importosfromPILimportImage #单个图片的大小为...

3

包含韩国vpshttps的词条 5分钟前

目录:1、韩国vps服务器哪家好2、vps韩国uplus线路好吗3、最近找到一家很好的韩国vps,分享给大家kdatacenter。4、韩国vps多少钱一年5、韩国VPS服...

4

Linux系统监测cpu温度的具体方法 5分钟前

电脑在运行中肯定会产生热量,那么在Linux系统中如何检查cpu的温度呢?本篇文章良许教程网为大家分享一下Linux系统检查cpu温度的具体方法...

5

负载均衡器(负载均衡器的软件有哪些) 6分钟前

目录:1、ribbon负载均衡详解2、路由负载均衡是什么3、负载均衡SLBribbon负载均衡详解 服务端负载均衡:在客户端和服务端中间使用代理,...

6

Ubuntu 最新版震撼发布 !手里的系统瞬间不香了… 9分钟前

不久前,Ubuntu 22.04 LTS发布,该版本在之前的 LTS 版本基础上进行了许多变化。除了Ubuntu 22.04引入的一部分新功能外,LTS 用户还将最终受益于...

7

阳泉云服务器(阳泉教育云) 11分钟前

目录:1、哪种云服务器便宜2、百度网盘为何能坚挺不倒?3、百度云计算(阳泉)中心的建设意义4、百度云计算阳泉中心什么时间建成?具体...

8

Linux scp命令使用实例 14分钟前

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是...