Go语言之进阶篇文件传输
一、文件传输
1、文件传输原理
2、文件传输
示例:
发送方: send_file.go
package main import (
"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, err := f.Read(buf) //从文件读取内容
if err != nil {
if err == io.EOF {
fmt.Println("文件发送完毕")
} else {
fmt.Println("f.Read err = ", err)
} return
} //发送内容
conn.Write(buf[:n]) //给服务器发送内容
} } func main() {
//提示输入文件
fmt.Println("请输入需要传输的文件:")
var path string
fmt.Scan(&path) //获取文件名 info.Name()
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 int
buf := 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)
}
}
接收方: recv_file.go
package main import (
"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) //接收多少,写多少,一点不差
for {
n, err := conn.Read(buf) //接收对方发过来的文件内容
if err != nil {
if err == io.EOF {
fmt.Println("文件接收完毕")
} else {
fmt.Println("conn.Read err = ", err)
}
return
} if n == 0 {
fmt.Println("n == 0 文件接收完毕")
break
} f.Write(buf[:n]) //往文件写入内容
} } func main() {
//监听
listenner, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Listen err = ", err)
return
} defer listenner.Close() //阻塞等待用户连接
conn, err1 := listenner.Accept()
if err1 != nil {
fmt.Println("listenner.Accept err = ", 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]) //回复"ok"
conn.Write([]byte("ok")) //接收文件内容
RecvFile(fileName, conn) }
执行结果:
Go语言之进阶篇文件传输的更多相关文章
- go语言之进阶篇文件常用操作接口介绍和使用
一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...
- 我们一起学习WCF 第六篇文件传输
原文 http://www.cnblogs.com/LipeiNet/p/4653830.html 前言:文件的输出我们并不陌生,但是今天我写的是用wcf模式进行文件传输,我觉得一大好处就是能进 ...
- go语言之进阶篇接口转换
1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Pers ...
- go语言之进阶篇拷贝文件案例
1.文件案例:拷贝文件 示例: package main import ( "fmt" "io" "os" ) func main() { ...
- go语言之进阶篇JSON处理
一.JSON处理 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaScr ...
- Linux命令进阶篇-文件查看与查找
上一篇的博客对于Linux如何在不同目录下跳转和查看目录下内容做出了总结,主要靠cd和ls,很常见也很实用.但是你看到目录下面那么多不同花花绿绿的文件,心里是不是痒痒,是不是想进去一探究竟,有办法! ...
- Go语言之进阶篇操作redis
1.windows安装redis 软件包下载地址: https://github.com/MicrosoftArchive/redis/releases 1.1.安装--->下一步---> ...
- Go语言之进阶篇爬捧腹网
1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html 下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...
- Go语言之进阶篇爬百度贴吧并发版
1.爬百度贴吧并发版 示例: package main import ( "fmt" "net/http" "os" "strco ...
随机推荐
- cropper.js实现图片裁剪预览并转换为base64发送至服务端。
一 .准备工作 1.首先需要先下载cropper,常规使用npm,进入项目路径后执行以下命令: npm install cropper 2. cropper基于jquery,在此不要忘记引入jq,同时 ...
- html (第四本书第四章参考)
上机1 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...
- Android中加载事件的方式
Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...
- BZOJ.4832.[Lydsy1704月赛]抵制克苏恩(期望DP)
题目链接 \(f[s][i][j][k]\)表示还剩\(s\)次攻击,分别有\(i,j,k\)个血量为\(1,2,3\)的奴隶主时,期望受到伤害. 因为期望是倒推,所以这么表示从后往前求,注意\(a, ...
- hdu 4451 37届金华赛区 J题
题意:给出衣服裤子鞋子的数目,有一些衣服和裤子,裤子和鞋子不能搭配,求最终的搭配方案总数 wa点很多,我写wa了很多次,代码能力需要进一步提升 #include<cstdio> #incl ...
- BZOJ3355 : [Usaco2004 Jan]有序奶牛
对于一条边x->y,若去掉之后x不能到达y,那么它是必需的. 首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边. 对于每个点,维护一个bitset,表示 ...
- 9、Redis处理过期keys的机制
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 1.Redis处理过期k ...
- centos7安装rvm
导入钥匙$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 若是提示 ...
- MySQL_事务没有提交导致 锁等待 Lock wait timeout exceeded
java.lang.Exception:### Error updating database. Cause: java.sql.SQLException: Lock wait timeout ex ...
- Java中的锁(转)
Java中的锁 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂.因为锁(以及其它更高级的线程同步机制)是由synchronized同步 ...