一、引言

  欢迎大家接着看我的博客,如何大家有什么想法的话回复我哦,闲话不多聊了,接着上一讲的内容来说吧,在上一节中已经讲到了请求头字符串的解析,并且在解析中我我们已经获取了url。就是上节中提到的/doing。当浏览器发送了/doing请求后,这是的与服务器的连接并没有中断,原因无他,就是浏览器等待接受服务端发来的信息,然后他对信息进行解析并显示在浏览器界面上。在编写Http服务器时的C/S结构时,我只编写服务端server,客户端直接用现成的浏览器即可。

  当服务端找到浏览器需要的内容的时候,现在服务端就需要把内容发送给浏览器即可。但是在HTTP协议中,发送具体内容之前,服务端还是要发送一个响应头,之前浏览器发送的叫做请求头,那么服务端也要发送一个响应头告诉浏览器,说你的请求我接受或者拒接。拒绝的话之后就没有具体实体内容发送,否则再告诉浏览器说你请求的内容的格式是html或者text,或者是音频等二进制文件等,并且告诉浏览器你请求内容的大小(这个非常重要)。当响应头发送完毕后,如果是同意浏览器的请求的话,那么接着发送具体的内容即可,接着关闭这个链接。

二、HTTP协议

  现在我们来看一下这个响应头的一个例子,还是只说明一些我们现在需要知道的,其他内容读者可以自己去查找相关的内容。

1 HTTP/1.1 200 OK
2 Server:(Unix)
3 Content-type:application/octet-stream
4 Content-length:65144369
5 Connection:Keep-Alive

  在这个例子中的响应头我们可以看到:

  1)在第一行就告诉浏览器http协议的版本是1.1,状态码是200,意思是OK,就是说你的请求我同意了。

  2)在第二行就是告知浏览器我服务器的名字。

  3)在第三行就是你请求的内容的格式是applicaiton/octet-stream,理解为二进制流即可。

  4)在第四行说明你请求内容的大小,单位是字节。

  5)第五行告诉浏览器是Keep-Alive连接方式。

  在这个协议头发送给浏览器时,还是每行结尾都有一个回车换行\r\n。最后还是需要一个空行代表本响应头结束。还有一些协议内容到用用到时再讲,现在提出这几项即可。当这个协议头发送给浏览器后,浏览器对其解析。然后等待真正的请求内容。当服务端把浏览器的请求的具体内容发送完毕就关闭这个连接。

  讲到这里基本一个请求响应结束了。那在这里提一下如何处理大并发呢。其实在HTTP请求中,在每个URL请求中服务器并不关心一些请求是否来着同个浏览器,服务器做的只是有请求来临就对其连接发送数据,然后关闭数据。尽管可能来着同一客户端上的请求有数据上的关系,但是服务端只是在发送数据而已。所以对于同一个浏览器发送的多个请求和不同浏览器或者不同主机发送来的请求的对待都是一样的。就是每个请求都是独立的,并不关心这个逻辑关系。

  在这一篇中的主要内容也就讲完了,好像看起来比较短哦,哈哈。。。。。那么在讲一些细节上的内容吧。

  现在大并发的服务器linux中,主要在有线程,进程,select,poll,epoll的方式。这些方式在各个博客上都是有的,所以我并不想在解释一下,读者可以自己查询其中的不同之处。而本文开发的HTTP服务器采用线程的方式进行。主要是当一个请求来到时,就创建一个线程来处理。采用的linux下POSIX标准pthtread线程。如果其他读者可以采用其他的几种方式来处理。或者自己写个线程池来取代每次一个请求来创建一个线程。主要对其包裹在一个命名空间为MultiThread的线程Thread类中,接着是一些代码段:

头文件(include/thread.h):

 1 /*
2 * include/thread.h
3 */
4
5 #ifndef THREAD_H_
6 #define THREAD_H_
7 #include<pthread.h>
8 #include<iostream>
9 namespace MultiThread {
10
11 class Thread {
12 public:
13 Thread();
14 ~Thread();
15 static int create_thread(pthread_t &pid,void* (*pFunc)(void *),void *arg);
16 int stop_thread();
17
18 };
19
20 } /* namespace MultiThread */
21
22 #endif /* THREAD_H_ */

cpp文件(src/thread.cpp)

 1 /**
2 *
3 * src/thread.cpp
4 **/
5 #include "thread.h"
6 namespace MultiThread {
7
8 Thread::Thread() {
9 }
10
11 Thread::~Thread() {
12 }
13
14 int Thread::create_thread(pthread_t &pid,void* (*pFunc)(void *),void *arg) {
15 int ret=pthread_create(&pid,NULL,pFunc,arg);
16 if(ret==0)
17 std::cout<<"create_thread() ...succeed"<<std::endl;
18 else
19 std::cout<<"create_thread() ...failed"<<std::endl;
20 return ret;
21 }
22
23 int Thread::stop_thread() {
24 return 0;
25 }
26
27 } /* namespace MultiThread */

看到现在,大家一定发现stop_thread()为空,应为我到现在还没用这个函数。并且到现在只用到create_thread函数,之后如果用到,接着在之后的文章中提出吧。

如果大家对HTTP服务器感兴趣的话,接着看《Http服务器实现文件上传与下载(三)》和我学习HTTP服务器编写吧。

Http服务器实现文件上传与下载(二)的更多相关文章

  1. Http服务器实现文件上传与下载(一)

    一.引言 大家都知道web编程的协议就是http协议,称为超文本传输协议.在J2EE中我们可以很快的实现一个Web工程,但在C++中就不是非常的迅速,原因无非就是底层的socket网络编写需要自己完成 ...

  2. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息

    1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...

  3. Http服务器实现文件上传与下载(五)

    一.引言 欢迎大家和我一起编写Http服务器实现文件的上传和下载,现在我回顾一下在上一章节中提到的一些内容,之前我已经提到过文件的下载,在文件的下载中也提到了文件的续下载只需要在响应头中填写Conte ...

  4. Http服务器实现文件上传与下载(四)

    一.引言 欢迎大家来到和我一起编写Http服务器实现文件的上传和下载,现在我稍微回顾一下之前我说的,第一.二章说明说明了整体的HTTP走向,第三章实现底层的网络编程.接着这一章我想给大家讲的是请求获取 ...

  5. Http服务器实现文件上传与下载(三)

    一.引言 在前2章的内容基本上已经讲解了整个的大致流程.在设计Http服务器时,我设计为四层的结构,最底层是网络传输层,就是socket编程.接着一层是请求和响应层,叫做Request和Respons ...

  6. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  7. 【问题解决方案】Xshell连接服务器并实现上传和下载文件

    参考链接: Xshell连接服务器并实现上传和下载文件 第一步:xshell登录完成 略 第二步: 在服务器安装lrzsz 如果服务器的操作系统是 CentOS,则输入命令[yum install l ...

  8. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  9. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

随机推荐

  1. U盘装系统:安装GHOST Win7系统教程

    可以搜索:装机吧 原文地址:http://www.zhuangjiba.com/jiaocheng/show-27-247-1.html

  2. Python selenium -- cookie处理

    转自:http://www.cnblogs.com/fnng/p/3269450.html 本节重点: driver.get_cookies() 获得cookie信息 add_cookie(cooki ...

  3. python selenum ---如何定位一组元素

    使用findElements方法定位一组对象 定位一组对象一般用于以下场景: · 批量操作对象,比如将页面上所有的checkbox都勾上 · 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象 ...

  4. HR问“预期薪资是多少”,这么说能加薪zz

    每年过完节,收好上一年的年终奖,身边人就开始蠢蠢欲动,招聘市场也异常火爆,节前各种裁员的新闻,过了个节都变成了“我们还要继续招人”. 年景不好,人才更是成了紧俏货.可现实中,我却发现,优质的人才未必能 ...

  5. 关于UI功能解锁,UI特效动画,UI tips的再思考

    之前写过一篇这样的文章,但当时的思路可行性太低 首先所有的UI面板通过发送字符串消息来告知,是否触发了解锁检测,tips检测,动画特效.可以理解为这样的接口: AsyncResult SendUIMe ...

  6. 转-linux下配置socks5代理

    简介: 在Linux下有各种各样的代理程序可用,象最常用的Squid,是http/https代理,也能代理ftp请求,但它实际上 是个HTTP代理程序,不是ftp代理,但它能处理ftp代理请求,就象浏 ...

  7. 初识PowerShell

    一.简介 Windows PowerShell 是微软公司为Windows环境所开发的壳程序(shell)及脚本语言技术,采用的是命令行界面.这项全新的技术提供了丰富的控制与自动化的系统管理能力.之前 ...

  8. CentOS/Linux 网卡设置 IP地址配置永久生效

    CentOS/Linux下设置IP地址 1.临时生效设置 1.1修改IP地址 #ifconfig eth0 192.168.100.100 1.2修改网关地址 #route add default g ...

  9. 基于quick-cocos2d-x的LuaSocket范例

    这是一个 luasocket 范例. 为了便于使用,我封装了 luasocket 到 cc.net.SocketTCP 类中.这个范例展示如何使用 cc.net.SocketTCP . 同时,在本范例 ...

  10. Oracle的REGEXP_INSTR函数简单使用方法

    REGEXP_INSTR函数让你搜索一个正則表達式模式字符串. 函数使用输入字符集定义的字符进行字符串的计算. 它返回一个整数,指示開始或结束匹配的子位置.这取决于return_option參数的值. ...