我的地盘我做主

来源:互联网 发布:大数据与房地产公司 编辑:程序博客网 时间:2024/04/27 20:29

最能体现自己特色的地方

 

编写完BQYAHOO,我最大的感受就是“站在巨人的肩膀上”。首先,文件上传下载功能都是由雅虎中国提供;其次,在编写程序时完全使用微软公司的产品:开发工具和类库。那么我做了什么?在BQYAHOO的帮助文件里面,我提出了一些自己创造的“新词汇”,我想这些东西背后所代表的东西才是真的属于我自己(我不太好意思把这些称作设计)。

 

虽然我在帮助文件里面解释了这些“新词汇”,但我想在这篇文章里面从编程的角度进一步讲解它。不仅谈它们的含义,也谈谈它们的来龙去脉。

 

 

 

登陆码:我的邮箱请你用

 

登陆码实际非常简单,下面两个公式可以充分的表示它的作用:

加密(用户名+密码)=登陆码

解密(登陆码)=用户名+密码

 

任何人都不愿意将自己邮箱的用户名和密码公布在网上,这将使得他彻底失去对这个邮箱的控制权。但是,或许有人愿意分享自己邮箱当中的一部份,或许可以把它称作部分的使用权。这个时候,加入一个加密解密体系就可以实现这个功能。使用加密解密来限制权限不是一个新话题,文件权限,系统权限都是如此。不过这个体系可以说是BQYAHOO的根基,它也决定了为什么BQYAHOO可以用来共享文件。从信任的角度来说,你将对其它网友的信任转化为对BQYAHOO的信任,虽然BQYAHOO知道你的用户名和密码,但它只做你希望它做的事情。

 

出于对正在使用BQYAHOO的用户的尊重(可惜人数不多),我没有公布加密解密部分的源码。不过,我们其实可以相当简单的看待这个问题,你自己也可以设计一个加密解密算法,只要你不说,又有谁会知道呢(更准确地说,谁会试图破解你的加密解密算法)?比如说把用户名反转,然后让它和密码进行交叉。

 

这里我想强调的是,在BQYAHOO这种上下文环境下,似乎只能使用对称加密,而与非对称加密无缘。加密和解密只能是完全对称的,相反的过程,没有办法在中间添加变数。关于这一点,如果读者您有好的建议可以和我联系。

 

 

 下载码:邮箱中的文件夹

 

 

我记得有一句网络上的广告说:拥有文件夹才能称作网络硬盘。下载码的作用就是给你雅虎邮箱的文件分类,起到一种类似于文件夹的作用。如果没有下载码,你将面临两难的选择,要么不共享这个雅虎邮箱;要么共享这个邮箱中的所有附件。应该说,下载码提供了一种灵活性。

 

下载码可以由共享文件的用户随意设置,比如说将周杰伦的专辑《七里香》的下载码设置位QLX。下面就来讲讲这个下载码将如何起作用,如何来代表专辑《七里香》中歌曲。现在假设专辑里面有十首歌曲,其中第一首歌曲的名字为《我的地盘》,第二首歌曲为《七里香》(喜欢周杰伦的读者对这些一定不会陌生)。

 

我将第一首歌曲作为附件发送到雅虎邮箱,其邮件主题为QLX.part0;将第二首歌曲作为附件发送到雅虎邮箱,其邮件主题为QLX.part1。那么最后一首歌曲所在邮件的主题就应该为QLX.part9。这样是不是很有规律?下载码QLX相当于一个前缀,最终定义了该邮件中的附件归属于那个“文件夹”。实际上,这种设计的灵感来自于WinRAR分解大文件时的起名方式。

 

如果现在让我重新设计BQYAHOO,我一定会将下载码和登陆码合并在一起,同时加密和解密,这样既增加了安全性,同时也减轻了下载用户的负担,不必去了解两个概念。只需一段密文就可以下载一系列文件。可惜这些都是马后炮了。在本文接下来的内容当中,你会常常看到这些遗憾。

 

 

描述文件:文件名的救世主

 

 

在前面的文章中我提到过,如果间接地得到邮件的附件下载网址,也就是根据邮件的网址来推算附件的下载网址,就会导致无法得知附件的文件名。在BQYAHOO早期的版本中,我使用了一种很无奈的做法:将所有附件都命名为邮件主题+.rar。也就是说如果一个附件的邮件主题为QLX.part1,那么它就被命名为QLX.part1.rar。这样,当这个附件被下载到本地硬盘,那么它就表现为一个压缩文件(假设这个机器上安装了WinRAR),可实际上它只是一首mp3歌曲。很明显这样做会带来混淆,给用户带来不便,不仅仅需要再次修改文件后缀,同时也不能根据文件名简单地推断出其中内容。

 

在一个QQ上自称计算机大学生的网友死活不会修改文件的后缀名之后,我明确地告诉自己再也不能让BQYAHOO的用户受这种折磨了。如是描述文件诞生了。它在上传文件时记录下各个文件的信息,然后它也被上传到雅虎邮箱。在BQYAHOO来到收件箱网页,首先做的事情就是下载与下载码相关的描述文件。在描述文件的帮助下,准确地给出附件名就是一件很轻松的事情。

 

下载码QLX对应的描述文件的邮件主题为:QLX.describe。也就是说:描述文件邮件主题=下载码+.describe

 

描述文件本身是一个XML文件。下面就是一个实例(DESCRIBE.xml)

<?xml version="1.0" encoding="GB2312"?>

<root><item discribe="123.txt" FileName="TEST.part0" SaveName="123.txt"/><item discribe="456.txt" FileName="TEST.part1" SaveName="456.txt"/><item discribe="欢迎下载!" MailBoxName="biqiong2005@yahoo.com.cn" DownLoadCode="TEST"/></root>

其中前面两个item代表两个邮件附件,其中discribe表示对该文件的说明、FileName表示该附件所在邮件的主题、SaveName代表这个附件最终保存在硬盘时的文件名。

 

最后一个item是对整个下载码的描述,其中discribe表示共享者想对下载者说的话、MailBoxName是邮箱名、DownLoadCode是下载码。

 

当描述文件出现后,我发现它不仅仅可以解决下载文件命名的问题,它还为BQYAHOO提供了更强劲的功能扩充机制。它本质上为文件共享者和下载者提供了一种相对方便的信息交流的通道。这样说是不是很玄?描述文件在共享文件时生成,然后在文件被下载时起作用。

 

下面是BQYAHOO源代码中与描述文件相关的类的声明:

class CXMLDESCRIBDATA //CXMLDESCRIBDATA保存描述文件信息

{

public:

    CXMLDESCRIBDATA(void);

    ~CXMLDESCRIBDATA(void);

public:

    vector <string> Vdescribe;//描述信息

    vector <string> VFileName;

    vector <string> VSaveName;//文件保存名

    string DescrbeForUser;

    string MailBoxName;

    string DownLoadCode;

public:

    bool ReadData(void);

    bool WriteData(string);

public:

    int XXFindFileName(const string name);

public:

    void clear()

    {

       Vdescribe.clear ();

       VFileName.clear ();

       VSaveName.clear ();

    }

   

};

 

 

邮箱信息文件:邮箱管理器

 

用户可能会在网络上得知别人通过BQYAHOO共享出来的多个邮箱(即使是同一个雅虎邮箱,如果下载码不一样,BQYAHOO也认为是不同邮箱),那么他可能需要将这些信息保存起来。邮箱信息文件就是做这样的工作,类似于FTP软件中的FTP站点管理器。

 

这部分内容没有什么多讲得,其实怎么保存都可以,只要下次能够被正确读取。BQYAHOO采用了一个XML文件,其实例如下:(XMLDATA.xml)

<?xml version="1.0" encoding="GB2312"?>

<root><item Name="格莱美歌曲" LogInCode="2F5BA6147EC5399C3809540AC5CED5193537AA8B6B8E1094CF1C77A0A542F2DA84A776C5CDE7215054124F3A2DFA605FC7AF67E2DC7620B414D413BBB1AD498DD61543612E3BE3A9D7D8045E3CDC056A" DownLoadCode="grammy"/><item Name="四季之春" LogInCode="1884EF03996E1F9011A56174B0B926D2E2E6FF5551D6DF0FF6779C481CAB8BDF1F66B3FE934101F12E034351287ABFC1F3EE3D23B8DB29DF8629639ED20D3481A570497FE09E8CE452F9935E8EB3B213" DownLoadCode="chun"/><item Name="生命的奥秘" LogInCode="515CE01B1F7FD9944644C9E0431E3EF13EA2C48262850F971652C7471111FAAC1BE5BA7C3B209766EFF08E90EF088871A2F15BEAF50DC9E6B0D6276D2E7FFA561982E9200A51732545D6E32889AE2A25" DownLoadCode="hong"/><item Name="TEST" LogInCode="9CE20F6CAD3B082B83527CC10118AF04E6745726267692C33CEC865AE4AFEC4B9B9AF475EF1C1B5B4BB0AF316A8AC0D279AF64E7C6FE4BD8F95E4A57A729DE34BFAA6043CE78902FDFC1D06BF715B5E1" DownLoadCode="TEST"/></root>

其中各个项目的属性的含义,我想读者一看便知。

下面是BQYAHOO源代码中与邮箱信息文件相关的类的声明:

class CXMLDATA { //CXMLDATA保存邮箱信息

public:

    CXMLDATA(void);

 

public:

    vector <string> VName;

    vector <string> VDownLoadCode;

    vector <string> VLogInCode;

 

public:

 

    bool ReadData(void);

    bool WriteData(void);

 

public:

 

    void clear()

    {

       VName.clear ();

       VDownLoadCode.clear ();

       VLogInCode.clear ();

    }

};

 

 

小结

 

本文讲解了很多我杜撰的新词,这也是最能在BQYAHOO当中表现自己意志的地方。我记得在《黑客帝国2:重装上阵》里面有一个地铁,在那里面,即使是强大的救世主也被地铁管理员打倒在地,临走时,他指出这个地铁程序是他编写的,所以一切由他说了算。在BQYHAOO当中,各种数据机制都是由我来制定,在当时制定它们时,都是灵机一动,说做就做。其实,从现在的角度来看存在着很多不完善的地方。

 

与熟悉相关函数库,分析雅虎网页信息相比,本文中的工作最让人有成就感,最体现编程者的智慧,可惜我在这方面做得不是很好。希望以后有时间和机会对BQYAHOO进行重新设计。

 

 

 

原创粉丝点击