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 mainimport ("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}// 读取服务器回发的 OKbuf := make([]byte, 1024)n, err := conn.Read(buf)if err != nil {fmt.Println("conn.Read err:", err)return}if "ok" == string(buf[:n]) {// 写文件内容给服务器——借助connsendFile(conn, filePath)}
}

接收端:

package mainimport ("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() {// 创建用于监听的socketlistener, 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)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang——HTTP编程请求和响应实现

请求: HTTP 请求报文由请求行、请求头部、空行、请求包体4个部分组成,如下图所示: 请求行: 请求行由方法字段、URL 字段 和HTTP 协议版本字段 3个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST。…

zabbix v3.0安装部署【转】

关于zabbix及相关服务软件版本: Linux:oracle linux 6.5 nginx:1.9.15 MySQL:5.5.49 PHP:5.5.35 一、安装nginx: 安装依赖包: yum -y install gcc gcc-c autoconf automake zlib zlib-devel ope…

WeChatTweak-微信小助手安装教程

github下载:https://github.com/Sunnyyoung/WeChatTweak-macOS CSDN下载:https://download.csdn.net/download/weixin_45477086/83895866 双击解压下载的WeChatTweak-macOS-***.zip在终端输入cd ,并敲一个空格,然后把解压的文件夹拖到终端 …

nodejs开发工具

我选择的是Hbuilder作为node项目的开发工具。先在Hbuilder 里面安装nodeEclipse插件,然后重启工具。点击添加项目,选择其他选项,出现下图选项,然后选择圈住的选项点击下一步:3. 如果不使用缺省位置,那么你的路径一定要…

排序之外部排序

有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能使用内部排序了(这里做一下说明,其实所有的排序都是在内存中做的,这里说的内部排序是指待排序的内容在内存中就可以完成,…

Golang——Json的序列化和反序列化

JSON: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写…

安装配置 flannel - 每天5分钟玩转 Docker 容器技术(59)

上一节我们部署了 etcd,本节安装和配置 flannel。 build flannel flannel 没有现成的执行文件可用,必须自己 build,最可靠的方法是在 Docker 容器中 build。不过用于做 build 的 docker 镜像托管在 gcr.io,国内可能无法直接访问&a…

人人都是产品经理?

产品经理顾名思义就是产品经理。那么只要搞懂产品是什么、经理又什么什么,就明白了产品经理是什么。 产品是什么: 产品是满足需求的载体,能被市场、人们使用和消费,并能满足人们某种需求(创造价值)的任何东…

搭建一个简单的FTP服务器

本文介绍通过win7自带的IIS来搭建一个只能实现基本功能的FTP服务器,第一次装好WIN7后我愣是没整出来,后来查了一下网上资料经过试验后搭建成功,其实原理和步骤与windows前期的版本差不多,主要是对新的操作系统还不是很熟悉。相信用…

3D文档(BRD、MRD、PRD)怎么写

3D文档: 一般来说,BRD作为战略方向的制定,是最早产出的文档,而MRD则是在战略方向的基础上对市场进行的分析,同时对后续工作的方向进行一些说明和指导,也可以说是通过对市场环境、竞品的分析,明确…

需求收集、分析、管理的方法

需求: 什么是需求 百度百科给的解释:指人们在某一特定的时期内在各种可能的价格下愿意并且能够购买某个具体商品的需要。所以要想明白需求,还要明白另外两个概念,需要和欲望,因为从需要到需求是一个由宏观到微观的过程…

if函数 字体自动标红_发喜糖!REPT函数和图表订婚了~~

小伙伴们早上好呀!今天为大家分享的是REPT函数的应用实例。案例1:基础用法左右:按照给定的次数重复显示文本用法:REPT(文本,重复次数)搭配:Wingdings字体家族的应用案例2:条形图⑴ 单元格D3输入…

用户体验五要素

用户体验: 用户在使用产品过程中建立起来的一种纯主观感受。 用户体验的重要性: 会失去客户:如果你没有良好的体验,用户不会使用你的产品,而且产品很难有二次机会接触用户。会增加获客成本:获客成本越来越高…

trackingmore快递查询平台_国际快递物流信息追踪查询

以下是快递公司常用查询物流信息追踪平台1. 17TRACK查询网址:www.17track.net/zh-cn (强烈推荐,国际件都能查询)2. EMS查询网址:www.ems.com.cn 客服电话:11833. DHL网址查询:www.cn.dhl.com …

竞品分析该怎么做

竞品分析: 作用: 知己知彼,百战不殆。为自身产品设计提供功能、可用性、关键技术等方面的参考。提高自身产品的差异化程度。为新立项的产品、拍脑袋想出来的,降低风险。 如何选择竞品: 行业内领先的产品,通…

饿了么超时20分钟_饿了么回应“多等5分钟”,网友气炸了

广告记编辑整理(ID:adgroup)昨天一篇题为《外卖骑手,困在系统里》的文章刷屏文章指出外卖骑手是被平台系统算法与数据支配的“工具人”在系统的压迫下骑手们每天都在违反交规、与死神赛跑外卖员成了高危职业引发网友热议今天凌晨饿了么官方发布了一篇《你…

java获取本周的开始时间和结束时间_创业板注册制开始时间/股票开户流程结束后,怎么炒股?...

股户流程刚走完,先别急着炒股,多研究股市行情。首选开户选好券商,没选好后患无穷,券商建议是富途、老虎,这两家美股港股都可以入,各有优势,富途的港股股票期权值得关注,老虎证券目前…

MarkDown 中使用 LaTeX 数学式

 最近看了些机器学习的书籍, 想写点笔记记录下. 由于需要使用到很多的数学推导, 所以就看了下如何在 Markdown 中插入数学式,发现在 Markdown 中可以直接插入 LaTeX 数学式. 排版数学公式是 \(\TeX\) 系统设计的初衷, 在 \(\LaTeX\) 中占有特殊地位, 是…

信息架构、结构图、流程图

互联网信息架构: 信息架构的本质就是分类!按照一定的规则,对产品的功能和内容进行组织,在功能确定的情况下,合理地设置和摆放,建立尽可能短的使用路径。目的就是为了更高效的满足用户的使用需求。如不进行信…

api商品分享源码_谈谈微服务中的 API 网关(API Gateway)

在本篇文章中,我们就一起来探讨一下 API 网关在整个微服务分布式架构中的一个作用。# 背景我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有…