一、文件传输

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语言之进阶篇文件传输的更多相关文章

  1. go语言之进阶篇文件常用操作接口介绍和使用

    一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...

  2. 我们一起学习WCF 第六篇文件传输

    原文  http://www.cnblogs.com/LipeiNet/p/4653830.html   前言:文件的输出我们并不陌生,但是今天我写的是用wcf模式进行文件传输,我觉得一大好处就是能进 ...

  3. go语言之进阶篇接口转换

    1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Pers ...

  4. go语言之进阶篇拷贝文件案例

    1.文件案例:拷贝文件 示例: package main import ( "fmt" "io" "os" ) func main() { ...

  5. go语言之进阶篇JSON处理

    一.JSON处理 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaScr ...

  6. Linux命令进阶篇-文件查看与查找

    上一篇的博客对于Linux如何在不同目录下跳转和查看目录下内容做出了总结,主要靠cd和ls,很常见也很实用.但是你看到目录下面那么多不同花花绿绿的文件,心里是不是痒痒,是不是想进去一探究竟,有办法! ...

  7. Go语言之进阶篇操作redis

    1.windows安装redis 软件包下载地址: https://github.com/MicrosoftArchive/redis/releases 1.1.安装--->下一步---> ...

  8. Go语言之进阶篇爬捧腹网

    1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html   下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...

  9. Go语言之进阶篇爬百度贴吧并发版

    1.爬百度贴吧并发版 示例: package main import ( "fmt" "net/http" "os" "strco ...

随机推荐

  1. iOS 覆盖率检测原理与增量代码测试覆盖率工具实现

    背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...

  2. GBDT算法

    GBDT通过多轮迭代,每轮迭代产生一个弱分类器,其中弱分类器通常选择为CART树,每个分类器在上一轮分类器的残差基础上进行训练. 对于GBDT算法,其中重要的知识点为: 1.GBDT是梯度下降法从参数 ...

  3. [HDU5713]K个联通块

    [HDU5713]K个联通块 题目大意: 有一张\(n(n\le14)\)个点,\(m\)条边无重边的无向图,求有多少个边集,使得删掉边集里的边后,图里恰好有\(k\)个连通块. 思路: 一个显然的动 ...

  4. 喵哈哈村的魔法考试 Round #3 (Div.2) 题解

    A 题解:保证一个三角形的话,得两边之和大于第三边才行,所以都拿来判一判就好了. #include <iostream> using namespace std; int main(){ ...

  5. 阿里云VPC默认网关问题

    在使用VPC专用网络时,阿里云上面不用设置网关都可以工作,其实不是的,狗日的阿里云居然把默认网关设置成了253,比如设置了172.18.0.0/24时,那么它的默认网关就是172.18.0.253.

  6. redis 写磁盘出错 Can’t save in background: fork: Cannot allocate memory (转)

    查看 Redis 日志 发现系统在频繁报错: [26641] 18 Dec 04:02:14 * 1 changes in 900 seconds. Saving… [26641] 18 Dec 04 ...

  7. Android开发:仿美团下拉列表菜单,帮助类,复用简单

    近期在项目中须要用到下拉菜单.公司比較推崇美团的下拉菜单,于是要实现该功能.想着.这个功能应该是一个常常会用到的.于是何不写一个帮助类,仅仅要往这个类里面传入特定的參数,既能够实现下来菜单,并且还能够 ...

  8. Ubuntu上的Hadoop安装教程

    Install Hadoop 2.2.0 on Ubuntu Linux 13.04 (Single-Node Cluster) This tutorial explains how to insta ...

  9. Quartz.NET简介

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  10. UIView 的旋转和缩放

    原文地址:http://www.cnblogs.com/gaoxiao228/archive/2012/05/04/2483577.html label.transform = CGAffineTra ...