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 ...
随机推荐
- LeetCode 343
Integer Break Given a positive integer n, break it into the sum of at least two positive integers an ...
- Jersey(1.19.1) - Deploying a RESTful Web Service
JAX-RS provides a deployment agnostic abstract class Application for declaring root resource and pro ...
- Lombok(1.14.8) - @Cleanup
@Cleanup @Cleanup,关闭流.如果最后清理资源的方法不是 close(),可以指定,例如 @Cleanup("clean"). package com.huey.lo ...
- IntellJ 13.x JPA Persistence Sample
跟上一篇差不多,一些基本的东西. 这次是JPA + Spring MVC 3.0 1.建立Project 2.Add JPA Support 3.我们以Hibernate为例,设置JPA的Provid ...
- Java之趣味编程结婚问题
问题如下:判断结婚的组合对数数.定义: 好三位新郎为 A,B,C ;三位新娘为X,Y,Z 有人想要知道他们谁和谁结婚 ,于是问了其中的三位. 回答是这样的:A说他将和X结婚 :X说她的未婚夫是C ;C ...
- PHP获取本周第一天和最后一天
//本周的第一天和最后一天 代码如下 复制代码 $date=new DateTime();$date->modify('this week');$first_day_of_week=$date ...
- ###《VIM实用技巧》
###<VIM实用技巧> #@author: gr #@date: 2015-11-20 #@email: forgerui@gmail.com <VIM实用技巧>阅读笔记. ...
- OC7_单词个数
// // WordManger.h // OC7_单词个数 // // Created by zhangxueming on 15/6/17. // Copyright (c) 2015年 zhan ...
- docker & nodejs
Docker 部署 Node js demo程序 1.准备node js程序,使用express框架. mkdir demo 在demo文件夹下建立package.json { "name& ...
- CAF(C++ actor framework)使用随笔(使用类去构建actor和使用的一些思路)
Class-based actorsA class-based actor is a subtype of event_based_actor and must implement the pure ...