go语言实现的目录共享程序
其实程序很小,只不过是想写点东西了。
后天晚上要回学校考试了,转眼已经出来了69天了,2个月多一点。
工资加上老妈赞助的钱,不知道能不能买台电脑,作为程序员一直用着i3-3217u实在难受。
回去找同学拷点片,再拷点游戏,好了,绕到正题了。
拷游戏免不了拷贝目录,最简单的办法当然是用U盘,可是U盘只有16G,一次不一定能装下一个游戏,而且我的劣质U盘写入速度只有3M多,显然不好折腾。
还一个办法是利用windows的共享文件夹功能,但是我试过几次速度都慢的要死,不知道为什么,所以对这种方式也并没有太多幻想。
还一个办法是ftp,但是同学的电脑上一般没有ftp服务,总不能挨个安装。
所以在百无聊赖之中,我就写了这么一个小东西,利用go语言静态编译的特点,编译之后放在网盘,用的时候随时下载,直接就可以执行,不需要安装各种软件和配置各种环境,比较绿色。另外也方便我自己在各种虚拟机之间共享文件了。
程序思路很简单,就是发送者遍历要发送的目录,依次发送每一个文件就可以。接收方要复杂一些,因为要处理断包和粘包的问题,还要知道每个文件的边界,还要保持与发送者相同的相对目录结构。
我的处理方法就是,每个文件发送前先发送一个json数据,用来描述接下来要发送的文件的相对路径、文件名、文件大小,这样就可以处理目录结构问题和边界问题了。但是这样又需要确定json数据的边界,所以发送json前先发送json数据的长度,是不是还要知道描述长度的数据的边界?当然,不过长度统一用uint32表示,也就是固定4个字节就OK了。
接收数据的时候需要谨慎处理,json的长度数据、json内容都会有断包和粘包的问题,需要仔细确定。
代码放在github了,地址是:
https://github.com/Anti-Magic/share_sender
https://github.com/Anti-Magic/share_receiver
另外,如果只是共享几个文件,还可以利用http下载的方式,但是不适合批量下载大量文件。
再贴一下http下载的代码:
package main import (
"fmt"
"net/http"
"os"
) func main() {
dirpath := "."
port := "" if len(os.Args) > {
dirpath = os.Args[]
} if len(os.Args) > {
port = os.Args[]
} fmt.Println("listen:", port)
fmt.Println("path:", dirpath) h := http.FileServer(http.Dir(dirpath))
http.ListenAndServe(":"+port, h)
}
文件较少时使用http
go语言实现的目录共享程序的更多相关文章
- 超详细Go语言源码目录说明
开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎go home~ 导读 学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢?今天 ...
- go语言实现遍历目录,及查找特定的文件类型
// filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...
- LINUX下用C语言历遍目录 C语言列出目录 dirent.h在C/C++中的使用
LINUX下历遍目录的方法一般是这样的打开目录->读取->关闭目录相关函数是opendir -> readdir -> closedir #include <dirent ...
- R 语言解压目录下的所有gz文件
setwd("GSE29431_RAW") # 进入目录 fileNames <- list.files() # 获取目录下的所有文件 sapply(fileNames, g ...
- c++两种字符串赋值方式 并介绍 C语言下遍历目录文件的方式
c++字符串声明:一种是声明字符数组并赋值,另一种是直接声明string类 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #incl ...
- 【原创】go语言之打印目录
package main import ( "fmt" "io/ioutil" "log" ) func listFiles(dirname ...
- R语言 重命名目录下所有文件
myfilepath <- "F:/paper2/climateExposure/wjj_mec/second/paths/" setwd(myfilepath) allty ...
- C语言提高内容目录
(1)基础 数据类型和变量 内存四区(栈 堆 全局 代码区) (2)指针和字符串操作 指针强化 字符串的基本操作 字符串一级指针内存模型图 字符串做为函数参数 (3)二级指针多级指针 二级指针的输入输 ...
- Android 国际化字符串资源,各语言目录表及从字符串资源文件读字符方法
字符串国际化 只要在 res 目录下 建对应语言的 values 目录即可. res下values是所有资源(包括字符串资源)的默认目录,如果没有特指资源目录或找不到某资源时,就用它. 如values ...
随机推荐
- javaweb学习总结四(反射技术)
一:反射的概念 反射就是加载类,然后获取类的属性.方法.构造函数等. 二:加载类到内存(有硬盘字节码文件到内存) 三种加载类的方式: @Test // 测试加载类 public void test1( ...
- [改善Java代码]注意Class类的特殊性
Java语言是先把Java源文件编译成后缀为class的字节码文件,然后再通过ClassLoader机制把这些类文件加载到内存中,最后生成实例执行的,这是Java处理的基本机制,但加载到内存中的数据是 ...
- POJ 1159 - Palindrome (LCS, 滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 55018 Accepted: 19024 Desc ...
- 【数论,水题】UVa 11728 - Alternate Task
题目链接 题意:给出一个数S,求一个最大的数,使这个数所有的因子之和为S; 这个所谓“因子之和”不知道有没有误导性,因为一开始以为得是素数才行.后来复习了下小学数学,比如12的因子分别是1,2,3,4 ...
- P2184 贪婪大陆
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...
- css3 颜色记
css3 颜色 opacity 使元素呈现出半透明效果. opacity:alphavalue || inherit alphavalue:默认值为1,可以取0~1任意浮点数.取值为1时,元素完全不透 ...
- C# IO操作(五)文件的递归加载
本篇是一个案例,其核心通过代码展示代码中的递归这个用法,程序的界面如下:
- Oracle 12c Dataguard 数据库恢复
http://allthingsoracle.com/rolling-forward-a-physical-standby-database-using-the-recover-command/ 当主 ...
- .net设计模式之观察者模式
摘要 在今天的设计模式系列中我给大家带来了观察者模式,首先我会以一个生动的故事引入观察者模式的应用的场景,然后描述这个场景中出现的问题,最后我们提出观察者模式的解决方案,并给出C#语言实现的代 ...
- 【leetcode】7. Reverse Integer
题目描述: Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 解题思 ...