当前位置: 首页 > news >正文

Go语言--传输文件

获取文件属性Stat()

info,err:=os.Stat(fileName)
  • Stat()底层如下:
func Stat(name string) (FileInfo, error) {testlog.Stat(name)return statNolog(name)
}
  • FileInfo 底层如下:
type FileInfo interface {Name() string       // base name of the fileSize() int64        // length in bytes for regular files; system-dependent for othersMode() FileMode     // file mode bitsModTime() time.Time // modification timeIsDir() bool        // abbreviation for Mode().IsDir()Sys() any           // underlying data source (can return nil)
}

在这里插入图片描述

功能介绍

分别实现客户端和接收端,使得客户端发送的各种文件信息,接收方能够以相同的形式以及大小拷贝到当前目录下。

客户端

package mainimport ("fmt""io""net""os"
)func SendFile(path string, conn net.Conn) {//以只读方式打开f, err := os.Open(path)if err != nil {fmt.Println("os.Open.err=", err)return}defer f.Close()//读文件内容,读多少发多少buf := make([]byte, 1024*4)for {n, err1 := f.Read(buf)if err1 != nil {if err1 == io.EOF {fmt.Println("文件发送完毕")} else {fmt.Println("f.Read.err1=", err1)}return}//给接收方发送内容conn.Write(buf[:n])}
}func main() {//提示传输文件fmt.Println("请输入需要传输的文件:")var path stringfmt.Scan(&path)info, err := os.Stat(path)if err != nil {fmt.Println("os.Stat.err=", err)return}//主动连接服务器conn, err1 := net.Dial("tcp", "127.0.0.1:8000")if err1 != nil {fmt.Println("net.Dial.err1=", err1)return}defer conn.Close()//给接收方发送文件名_, err = conn.Write([]byte(info.Name()))if err != nil {fmt.Println("conn.Write.err=", err)return}//接收对方的回复,回复ok 就可以发var n intbuf := make([]byte, 1024)n, err = conn.Read(buf)if err != nil {fmt.Println("conn.Read.err=", err)return}if "ok" == string(buf[:n]) {//发送文件内容SendFile(path, conn)}}
  • 读取客户输入的文件路径 fmt.Scan(&path)
  • 读取文件信息info, err := os.Stat(path)
  • 主动连接服务器conn, err1 := net.Dial("tcp", "127.0.0.1:8000")
  • 给接收方发送文件名_, err = conn.Write([]byte(info.Name()))
  • 接收对方的回复,回复ok 就可以发n, err = conn.Read(buf)
  • 发送文件内容SendFile(path, conn)
  • 以只读方式打开f, err := os.Open(path)
  • 读文件内容,读多少发多少buf := make([]byte, 1024*4)
  • 给接收方发送内容conn.Write(buf[:n])

接收端

package mainimport ("fmt""io""net""os"
)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, 1024*4)var n int//接收多少,写多少for {n, err = conn.Read(buf)if err != nil {if err == io.EOF {fmt.Println("文件接收完毕")} else {fmt.Println("conn.Read.err=", err)}return}f.Write(buf[:n]) //往文件写入内容}}func main() {//监听listener, err := net.Listen("tcp", "127.0.0.1:8000")if err != nil {fmt.Println("net.Listen.err=", err)return}defer listener.Close()//阻塞等待用户连接conn, err1 := listener.Accept()if err1 != nil {fmt.Println("listener.Accept.err1=", err1)return}defer conn.Close()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])//回复okconn.Write([]byte("ok"))//接收文件内容RecvFile(fileName, conn)
}
  • 监听客户端的连接listener, err := net.Listen("tcp", "127.0.0.1:8000")
  • 阻塞等待用户连接conn, err1 := listener.Accept()
  • 读取对方发送的文件名n, err = conn.Read(buf)
  • 回复okconn.Write([]byte("ok"))
  • 接收文件内容RecvFile(fileName, conn)
  • 创建一个相同名字的文件f, err := os.Create(fileName)
  • 接收多少,写多少n, err = conn.Read(buf)
  • 往文件写入内容f.Write(buf[:n])

结果图

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库
  • 修BUG:程序包javax.servlet.http不存在
  • 算法学习day12(动态规划)
  • LabVIEW前面板占满整个屏幕(转)
  • 【操作系统】文件管理——文件管理基础、文件的逻辑结构和目录结构(个人笔记)
  • 高级Puppet manifest编写和模块化管理:构建高效可靠的自动化运维平台
  • Python实现一对多WebSocket发送给指定多个客户端
  • Window10下安装WSL-Ubuntu20.04
  • 找到并留住最佳员工
  • 掌握异常处理的艺术:LangChain中的错误与异常管理策略
  • 深度学习-2-TensorFlow和PyTorch深度学习框架的选择
  • Qt常用快捷键
  • 云计算【第一阶段(29)】远程访问及控制
  • OpenCV 寻找棋盘格角点及绘制
  • 构建GitLab代码私有仓库
  • C# 免费离线人脸识别 2.0 Demo
  • ES6--对象的扩展
  • extract-text-webpack-plugin用法
  • IP路由与转发
  • JavaScript标准库系列——Math对象和Date对象(二)
  • nfs客户端进程变D,延伸linux的lock
  • Sass 快速入门教程
  • SSH 免密登录
  • Vue2.x学习三:事件处理生命周期钩子
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 后端_MYSQL
  • 力扣(LeetCode)357
  • 前端攻城师
  • 入口文件开始,分析Vue源码实现
  • 使用putty远程连接linux
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习ES6 变量的解构赋值
  • 用Python写一份独特的元宵节祝福
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 我们雇佣了一只大猴子...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​香农与信息论三大定律
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #13 yum、编译安装与sed命令的使用
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2.2w字)前端单元测试之Jest详解篇
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (floyd+补集) poj 3275
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二十四)Flask之flask-session组件
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)socket Aio demo
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .gitignore文件---让git自动忽略指定文件
  • .NET C# 使用GDAL读取FileGDB要素类
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .net core 依赖注入的基本用发