zoukankan      html  css  js  c++  java
  • 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下载的代码:

     1 package main
     2 
     3 import (
     4     "fmt"
     5     "net/http"
     6     "os"
     7 )
     8 
     9 func main() {
    10     dirpath := "."
    11     port := "8080"
    12 
    13     if len(os.Args) > 1 {
    14         dirpath = os.Args[1]
    15     }
    16 
    17     if len(os.Args) > 2 {
    18         port = os.Args[2]
    19     }
    20 
    21     fmt.Println("listen:", port)
    22     fmt.Println("path:", dirpath)
    23 
    24     h := http.FileServer(http.Dir(dirpath))
    25     http.ListenAndServe(":"+port, h)
    26 }
    文件较少时使用http
  • 相关阅读:
    对javascript的一点点认识总结——《javascript高级程序设计》读书笔记
    .Net Garbage Collection学习心得
    上网本重装系统的历程
    让验证控件进行分组验证
    .net应用程序分层的个人认识
    asp.net 4.0的变化(官网链接地址)
    SQL 延时 插入 修改 删除
    SQL 删除前100条 with as
    jQuery RadioButtonList
    网站推广的100个方法
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/4561799.html
Copyright © 2011-2022 走看看