GO语言实现文件的断点续传
本文主要简单实现一个发送文件的端点续传功能,主要解决在传输过程中客户端断开后在重新取得连接后可在之前的传输基础上进行继续传输,直到文件传输完毕。
客户端
package mainimport ("fmt""io""net""os""strconv""time"
)func clientRead(conn net.Conn) int{buf := make([]byte, 10)n, err := conn.Read(buf)if err != nil {fmt.Println("conn.Read err:", err)}off, err := strconv.Atoi(string(buf[:n]))if err != nil {fmt.Println("strconv.Atoi err:", err)}return off
}//发送数据
func clientWrite(conn net.Conn, data []byte){_, err := conn.Write(data)if err != nil {fmt.Println("conn.Write err:", err)}fmt.Println("写入数据:", string(data))
}func clientConn(conn net.Conn) {defer conn.Close()clientWrite(conn, []byte("start-->"))off := clientRead(conn)fp, err := os.OpenFile("file.txt", os.O_RDONLY, 0777)if err != nil {fmt.Println("os.OpenFile err:", err)}defer fp.Close()_, err = fp.Seek(int64(off), 0)if err != nil {fmt.Println("Seek err:", err)}for{data := make([]byte, 10)n, err := fp.Read(data)if err != nil {if err == io.EOF{time.Sleep(time.Second)//clientWrite(conn, []byte("<--end"))fmt.Println("文件发送结束!")break}}//time.Sleep(time.Second)clientWrite(conn, data[:n])}
}func main(){conn, err := net.DialTimeout("tcp", "127.0.0.1:8848", time.Second*10)//conn, err := net.Dial("tcp", "127.0.0.1:8848")if err != nil {fmt.Println("Dial err:", err)}clientConn(conn)
}
服务端
package mainimport ("fmt""io""net""os""strconv"
)//追加
func WriteFile(content []byte){if len(content) > 0{fp, err := os.OpenFile("file_out.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0777)if err != nil {fmt.Println("OpenFile err:", err)}defer fp.Close()_, err = fp.Write(content)if err != nil {fmt.Println("fp.Write err:", err)}fmt.Println("fp.Write ok")}
}//判断文件是否存在
func getFileState() int64{stat, err := os.Stat("file_out.txt")if err != nil {if os.IsNotExist(err){fmt.Println("文件不存在")return 0}}return stat.Size()
}func serverConn(conn net.Conn){defer conn.Close()for true {var buf = make([]byte, 10)n, err := conn.Read(buf)if err != nil {if err == io.EOF{fmt.Println("server is EOF")return}fmt.Println("conn.read err:", err)return}fmt.Println("收到数据:", string(buf[:n]))switch string(buf[:n]) {case "start-->":off := getFileState()stroff := strconv.FormatInt(off, 10)_, err := conn.Write([]byte(stroff))if err != nil {fmt.Println("conn.Write err:", err)}continue//case "<--end":// fmt.Println("文件写入完毕!")// return}WriteFile(buf[:n])}
}func main(){listen, err := net.Listen("tcp", "127.0.0.1:8848")if err != nil {fmt.Println("net.Listen err:", err)}fmt.Println("正在监听...")defer listen.Close()conn, err := listen.Accept()if err != nil {fmt.Println("Accept err:", err)}serverConn(conn)
}
GO语言实现文件的断点续传相关推荐
- 大文件上传服务器:支持超大文件HTTP断点续传的实现办法
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/ababab12345/a ...
- 大文件上传服务器、支持超大文件HTTP断点续传实践总结
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/ababab12345/ article/details/80490621 最近由于笔者所在的研发集团产品需要,需要支持高性能的 ...
- c++文件读取空格_程序员术与道:术—C语言对文件进行处理,文件处理的基本操作...
各种编程语言都实现了文件的基本操作,提供了对应的接口,本篇文章先为你介绍C语言对文件进行处理和文件处理的基本操作.主要从以下几个方面进行介绍: 读取文件 写入文件 重命名文件 读取目录 读取目录下的文 ...
- linux c 判断文件打开文件,Linux 用C语言判断文件和文件夹
Linux 用C语言判断文件和文件夹 #include #include #include #include int access(const char *pathname, int mode); i ...
- c语言程序头文件作用,C语言头文件
C语言头文件教程 C 语言的头文件一般都是 .h 做为结尾的. C语言头文件详解 语法 #include 参数 参数 描述 filename 我们需要引入的头文件的名称. 说明 C 语言的头文件一般都 ...
- c语言课件 文件,C语言课件--文件.ppt
C语言课件--文件 例12-5 /*将字符串"apple", "grape", "pear" 写入到磁盘文件f12-5.txt中,然后再从该 ...
- c语言删除文件中的结构体_C语言插入、删除、更改文件内容
我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...
- 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 追加键值对数据 | 更新键值对数据 )
文章目录 一.追加键值对数据 二.更新键值对数据 三.完整代码示例 一.追加键值对数据 在上一篇博客 [C 语言]文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取 ...
- 【C 语言】文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )
文章目录 一.文件名路径设置 二.文件打开方式 三.fputc 函数 | 按照字符方式写文件 1.fputc 函数 2.代码示例 四.fgetc 函数 | 按照字符方式读文件 1.fgetc 函数 2 ...
最新文章
- OpenGL入门学习(十二) 【转】
- php代码注释处理类库,php代码注释
- day13-(事务mvc反射补充)
- python学习turtle(龟图标状态)
- Ubuntu搭建嵌入式开发(交叉编译)环境-转
- python个位怎么表示_如何在django管理中表示位标志int字段?
- 小米4 win10 刷回android,小米4怎么从win10刷回MIUI 小米4 win10刷回MIUI系统详细教程...
- 电脑无限重启 服务器,电脑开机无限蓝屏重启怎么办
- 纯干货!一款APP从设计稿到切图过程全方位揭秘(转)
- 根据起始时间和流逝的时间计算出终止时间(C语言)
- echarts自定义legend图例和tooltip默认提示文字
- 新浪微相册https外链图片无法调用解决方法
- 树洞OCR文字识别v1.1.0官方版
- 网页实现excel下载
- pycharm运行异常 UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes in position 600-601: invalid contin
- 有哪些微信小程序值得推荐?
- Python 魔法方法与属性
- 调教ChatGPT提取公众号封面
- OpenFlow Tutorial
- Maven安装教程讲解
热门文章
- keypair java_如何在Java中序列化和反序列化RSA KeyPair
- 数据中心节能环保政策汇总分析:2022年新建大型数据中心PUE需达到1.4以下
- 无处不在的智能设备与边缘计算时代即将来临
- 浅谈如何防范电池事故
- DL之DNN优化技术:自定义MultiLayerNet【5*100+ReLU】对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化、He参数初始化)性能差异
- 4.2 Tensorflow笔记:池化函数
- Linux下WRF Domain Wizard使用教程(PART2: 使用教程及 遇到的种种BUG)
- 蓝桥杯_算法训练_ALGO10_集合运算
- 2、cookie session token详解
- Flask 系列之 部署发布