转载地址:https://www.cnblogs.com/qq702368956/p/10195497.html

获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者。

发送者

package main

import (
"fmt"
"io"
"net"
"os"
) func main() {
var addr string = "127.0.0.1:1234"
fmt.Println("请输入需要传输的文件:")
var path string = "./test.txt"
info, errf := os.Stat(path)
if errf != nil{
fmt.Println("os.Stat errf =", errf)
return
} conn, err := net.Dial("tcp", addr)
if err != nil{
fmt.Println("net.Dial err =",err)
return
}
defer conn.Close() _, err = conn.Write([]byte(info.Name()))
if err != nil{
fmt.Println("conn.Write info.Name err =",err)
return
}
var n int
buf := make([]byte, 1024)
n, err = conn.Read(buf)
if err != nil{
fmt.Println("conn.Read ok err =", err)
return
}
if "ok" == string(buf[:n]){
fmt.Println("ok")
SendFile(path, conn)
}
} func SendFile(path string, conn net.Conn){
file , err := os.Open(path) if err != nil{
fmt.Println("os.Open err =", err)
return
}
defer file.Close()
buf := make([]byte, 1024 * 4) for {
n, err := file.Read(buf)
if err != nil{
if err == io.EOF{
fmt.Println("文件发送完毕")
} else{
fmt.Println("file.Read err =",err)
} return
}
if n == 0{
fmt.Println("文件发送完毕")
break
}
conn.Write(buf[:n])
}
}

接收者

package main

import (
"fmt"
"io"
"net"
"os"
) func main() {
var addr string = "127.0.0.1:1234"
listenner, err := net.Listen("tcp", addr)
if err != nil{
fmt.Println("net.Listen err =", err)
return
}
defer listenner.Close() conn, errl := listenner.Accept()
if errl != nil{
fmt.Println("listenner.Accept err =", errl)
return
}
var n int
buf := make([]byte, 1024)
n, err = conn.Read(buf)
if err != nil{
fmt.Println("conn.Read fileName err =", err)
return
}
fileName := string(buf[:n])
n, err = conn.Write([]byte("ok"))
if err != nil{
fmt.Println("conn.Write ok err =", err)
return
} RecvFile(fileName, conn)
} func RecvFile(fileName string, conn net.Conn){
file , err := os.Create(fileName)
if err != nil{
fmt.Println("os.Create err =", err)
return
} defer file.Close() 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
} n, err = file.Write(buf[:n])
if err != nil{
fmt.Println("file.Write err =", err)
break
}
}
}

  

golang 文件传输小demo(转载)的更多相关文章

  1. golang 实现文件传输小demo

    获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者. 发送 ...

  2. golang文件传输服务

    续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...

  3. Spring Boot 简单小Demo 转载!!!

    Spring Boot简介 接下来我们所有的Spring代码实例将会基于Spring Boot,因此我们先来了解一下Spring Boot这个大杀器. Spring早期使用XML配置的方式来配置Spr ...

  4. c# 局域网文件传输实例

    一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...

  5. libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

    转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/14207 ...

  6. go bigfile (文件传输管理系统)前端分片上传demo

    BIGFILE Github地址: https://github.com/bigfile/bigfile 欢迎大家前来issue & star BIGFILE 中文文档地址:https://l ...

  7. golang 远程传输文件

    概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...

  8. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  9. golang sftp传输文件

    之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件,还需要用 ...

随机推荐

  1. kali安装结束重启黑屏?

    很多人碰到过kali在安装结束后自动重启,屏幕黑屏就显示一个光标. 解决办法: 安装最后一步,不要选择默认项 Enter device manually 改选第二项.....具体什么忘记了. 即可解决 ...

  2. iOS应用安全开发,你不知道的那些事

    来源:http://www.csdn.net/article/2014-04-30/2819573-The-Secret-Of-App-Dev-Security 摘要:iOS应用由于其直接运行在手机上 ...

  3. 精选SpringBoot八大开源项目:支付、秒杀、全文搜索等

    前言 曾在自己的博客中写下这样一段话:有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 如今,虽然没有大理想抱负,但是却有自己的小计划.下面是这一年来,自己利用闲暇 ...

  4. EFK(Elasticsearch+Filebeat+Kibana)收集容器日志

    介绍 Elasticsearch 是一个实时的.分布式的可扩展的搜索引擎,允许进行全文.结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档. Beats 是数据采集的得力工具 ...

  5. Docker02-重要概念

    目录 Docker简介 思考 Docker是什么 Docker 解决了什么问题 Docker 的优点 Docker的目的 Docker常用场景 虚拟化和Docker的对比 Docker的架构 Dock ...

  6. js eval()

    1.基本字符串(数组字符串,json字符串)类型转化为对象(对象数组,json对象):  eval("("+字符串+")"); 2.json字符串转化为json ...

  7. Kotlin函数式编程范式深入剖析

    继续学习Kotlin的函数式编程,先定义一个高阶函数: 其实上面这种调用方式在Kotlin用得不多,反而是将Lambda表达式放到方法体中使用得较频繁,如下: 接下来定义一个扩展方法,用来对字符串进行 ...

  8. 【转载】linux性能监控分析及通过nmon_analyse生成分析报表

    转载地址:http://www.cnblogs.com/Lam7/p/6604832.html nmon是一款分析 AIX 和 Linux 性能的免费工具 nmon 工具还可以将相同的数据捕获到一个文 ...

  9. 微信支付之获取openid

    一.准备工具 不管开发什么,官方的文档应该是第一个想到的这里把官方文档贴出来:微信网页授权文档除此之外,我们还需要一个内网穿透的工具在开发环境下让微信能访问到我们的域名.我使用的是natapp.此类工 ...

  10. python 添加Windows权限

    # -*- coding: utf-8 -*- """ Created on Mon Jan 8 09:09:51 2018 @author: coordinate &q ...