其实程序很小,只不过是想写点东西了。
后天晚上要回学校考试了,转眼已经出来了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语言实现的目录共享程序的更多相关文章

  1. 超详细Go语言源码目录说明

    开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎go home~ 导读 学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢?今天 ...

  2. go语言实现遍历目录,及查找特定的文件类型

    // filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...

  3. LINUX下用C语言历遍目录 C语言列出目录 dirent.h在C/C++中的使用

    LINUX下历遍目录的方法一般是这样的打开目录->读取->关闭目录相关函数是opendir -> readdir -> closedir #include <dirent ...

  4. R 语言解压目录下的所有gz文件

    setwd("GSE29431_RAW") # 进入目录 fileNames <- list.files() # 获取目录下的所有文件 sapply(fileNames, g ...

  5. c++两种字符串赋值方式 并介绍 C语言下遍历目录文件的方式

    c++字符串声明:一种是声明字符数组并赋值,另一种是直接声明string类 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #incl ...

  6. 【原创】go语言之打印目录

    package main import ( "fmt" "io/ioutil" "log" ) func listFiles(dirname ...

  7. R语言 重命名目录下所有文件

    myfilepath <- "F:/paper2/climateExposure/wjj_mec/second/paths/" setwd(myfilepath) allty ...

  8. C语言提高内容目录

    (1)基础 数据类型和变量 内存四区(栈 堆 全局 代码区) (2)指针和字符串操作 指针强化 字符串的基本操作 字符串一级指针内存模型图 字符串做为函数参数 (3)二级指针多级指针 二级指针的输入输 ...

  9. Android 国际化字符串资源,各语言目录表及从字符串资源文件读字符方法

    字符串国际化 只要在 res 目录下 建对应语言的 values 目录即可. res下values是所有资源(包括字符串资源)的默认目录,如果没有特指资源目录或找不到某资源时,就用它. 如values ...

随机推荐

  1. poj 3250 栈应用

    #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #d ...

  2. asp.net的CascadingDropDown取值和赋值

    获取选择的值 可以使用形如以下的方式获得选择的值: Label1.Text = ddlProvince.SelectedValue;        Label2.Text=ddlCity.Select ...

  3. Redis 命令 - Hashs

    HDEL key field [field ...] Delete one or more hash fields 127.0.0.1:6379> HSET book.1 title hello ...

  4. 【MINA】缓存区ByteBuffer和IOBuffer你要了解的常用知识

    mina中IOBuffer是Nio中ByteBuffer的衍生类,主要是解决Bytebuffer的两个不足 1.没有提供足够灵活的get/putXXX方法 2.它容量固定,难以写入可变长度的数据 特点 ...

  5. 诡异的问题“该字符串未被识别为有效的 DateTime”

    问题描述:"该字符串未被识别为有效的 DateTime"这个异常相信大家都会碰到,但是这一次真的无法理解,服务器运行一段时间之后才会出现这个问题,并且是系统中所有和日期相关的模块, ...

  6. bootstrap学习起步篇:初识bootstrap之html5语法构建hello篇(一)

    目前选择使用bootstrap作为前端页面模板,是件很省心的事情.官网上给出的实例和教程也很多.在实际使用过程中,我们也许还要借助文档去了解它的元素和样式.但也不能减少我们使用他的兴趣. 我准备将其整 ...

  7. 使用C#通过调用minitab的COM库自动化生成报表

    本文介绍通过C#调用minitab com组建自动化生成报表的方法. 首先需要在minitab中通过手动配置的方式生成报表来得到该报表的命令行,过程如下 选择菜单“编辑器”->“启用命令”启用命 ...

  8. c# 简单的通用基础字典

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Alif.Ali ...

  9. OC8_NSData

    // // main.m // OC8_NSData // // Created by zhangxueming on 15/6/19. // Copyright (c) 2015年 zhangxue ...

  10. (转) Crittercism: 在MongoDB上实现每天数十亿次请求

    MongoDB的扩展能力可以满足你业务需求的增长——这也是为什么它的名字来源于单词humongous(极大的)的原因.当然,这并不是说你在 使用MongoDB的路上并不会碰到一些发展的痛点.Critt ...