获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者。
发送者:
package main import (
"fmt"
"io"
"net"
"os"
) func main() {
fmt.Println("请输入接收者地址(IP:PORT):")
var addr string
fmt.Scan(&addr)
fmt.Println("请输入需要传输的文件:")
var path string
fmt.Scan(&path)
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, )
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, * ) 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 == {
fmt.Println("文件发送完毕")
break
}
conn.Write(buf[:n])
}
}
接收者:
package main import (
"fmt"
"io"
"net"
"os"
) func main() {
fmt.Println("请你的地址(IP:PORT):")
var addr string
fmt.Scan(&addr)
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, )
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, * )
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的更多相关文章
-
golang 文件传输小demo(转载)
转载地址:https://www.cnblogs.com/qq702368956/p/10195497.html 获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先 ...
-
c# 局域网文件传输实例
一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...
-
go bigfile (文件传输管理系统)前端分片上传demo
BIGFILE Github地址: https://github.com/bigfile/bigfile 欢迎大家前来issue & star BIGFILE 中文文档地址:https://l ...
-
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 ...
-
golang文件传输服务
续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...
-
在linux系统上文件传输的小技巧
各位做运维的小伙伴,你是不是常常在为文件传到linux服务器上感到头疼呢,我们知道常用的文件传输工具有好多,比如xftp,winscp等,但是有没有比这更简单的呢?当然是有的呢,下面给大家介绍下: y ...
-
linux几种文件传输方式
本文记录linux系统中文件传输的多种方式,留作备忘.linux中文件传输的方式有ftp,scp,rsync,rz,sz等,但各个工具的功能又有所区别: FTP : FTP是文件服务器,可实现文件的上 ...
-
RPC框架学习+小Demo实例
一.什么是RPC协议? 全称:远程过程调度协议 效果:使消费者向调用本地方法一样调用远程服务方法,对使用者透明 目前常用:Dubbo.Thirft.Sofa.... 功能: 建立远程通信(socket ...
-
新手 gulp+ seajs 小demo
首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...
随机推荐
-
JS trim()方法使用
JS trim()方法使用上有浏览器限制: 1.直接使用 string.trim() 浏览器版本限制:JavaScript Version 1.8 2.间接使用<即自己使用正则构造类trim的 ...
-
任务分发系统gearman
1 Gearman是什么 Gearman Job Server@http://gearman.org/. Gearman 是一个任务分发系统,它提供了一个分发框架,能够分发某类任务到更适合处理这类任务 ...
-
VC 对话框背景颜色、控件颜色(三种方法)
系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色 ...
-
JDBC batch批量Statement executeBatch 详细解释
JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...
-
Sping Cloud项目启动报A component required a bean of type &#39;com.tianyan.bbc.dao.SecurityUserBaseMapper&#39; that could not be found.
项目构建正常,启动和Debug报以下错误: Error starting ApplicationContext. To display the conditions report re-run you ...
-
设计模式C++学习笔记之十六(Observer观察者模式)
16.1.解释 概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. main(), IObservable,被观察者接口 CHanFei ...
-
容器监控告警方案(cAdvisor + nodeExporter + alertmanager + prometheus +grafana)
一.prometheus基本架构 Prometheus 是一套开源的系统监控报警框架.它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 ...
-
(转)关于android设备管理器的一些分析
转自http://bbs.pediy.com/showthread.php?t=183692 想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设 ...
-
sql中的SET NOCOUNT ON/OFF
当 SET NOCOUNT 为 ON 时,不返回计数(表示受Transact-SQL 语句影响的行数). 当 SET NOCOUNT 为 OFF 时,返回计数(默认为OFF). 即使当 SET NOC ...
-
6、scala面向对象-对象
一.对象 1.object object,相当于class的单个实例,通常在里面放一些静态的field或者method,第一次调用object的方法时,就会执行object的constructor, ...