开始搞实验的杂谈(二)-------主要关于第一个比较完整的boost支撑的client和单线程server

第一:首先几乎每个类都以private方式继承了boost::noncopyable,开始不知道是什么好玩的东西,查了下,原来是这样私有地继承就可以实现单例了,随便找了位大神的博客来看看,这里吧:http://blog.csdn.net/huang_xw/article/details/8248960

 

第二:connection_management这个类还是比较简单的,无非就是拿来stop,start那些connection,然后还有一个set来装所有的connections

 

第三:connection这个类,也没有太特别的地方,主要就是定义了一个以connection为模板参数的智能指针,也是集成noncopyable,然后connection拥有的变量有:socket(这个好理解,每一次连接就负责搞一个socket),一个connection_management的引用(额,好吧,这个就是管理它的那个对象的引用,这么设计好像有点不适我的风格…),一个request_handler的引用(这个connection所使用的用来处理请求的对象的引用),类似的必须有这些配套:request_parser,request,reply,还有一个boost::array<char,8192>buffer,当然是用来处理的时候来放的东西的了。

 

第四:request_handler也没有什么特别的,有个url_decode的方法吧,来看下url是否合法的。就这样了

 

第五:string原来有一个find(string)的函数,如果在字符串里面没有找到那个string,就会返回:string::nops

 

第六:在搞requst-handler这个类的时候碰到了文件流的操作,额,原来之前对文件的操作基本上是java就非常的熟,python也还可以(主要还是python的操作太傻瓜了),然后c++的还真没有认真弄过,所以有点忘了,当然这里用的就是fstream,用的时候就添加个<fstream.h>,这位朋友的博文还是讲的不错的,连我多年么碰到的这个用法也写上了,谢谢:http://panpan.blog.51cto.com/489034/101625

ifstream is(full_path.c_str(), ios::in | ios::binary);

 

第七:这里的这个小段代码就是从一个文件流中不断地读出数据,然后写入那个reply的content里面的过程,gcount这个函数是用来获取每一次读了多少个字节数的

            while (is.read(buf, sizeof(buf)).gcount() > 0)
            {
                rep.content.append(buf, is.gcount());
            }

对了,其实之前也弄过,不过也刚好在这个朋友的博客上看到了i以前获取文件的总字节数的一个小小的技巧,指针移到文件末尾然后用现在指针距离文件的头的偏移数量来获取文件的length,完事之后再把指针设为文件头:

is.seekg (0, ios::end);  
  length = is.tellg();  
  is.seekg (0, ios::beg);  

 

第八:这里留个位置给那个url_decode的函数,因为暂时还不是很懂…

 

好吧,另外再开一篇!

 

posted @ 2013-11-22 23:11  Allen_Tung  阅读(258)  评论(0编辑  收藏  举报