精华内容
下载资源
问答
  • 我将浏览器的代理服务器设置成我自己写的服务器,但是在使用的过程中发现,当web浏览器通过一个socket发出connect请求报文并处理完成之后,其他的请求报文(例如get\post等)就会通过其他不同的socket发送过来,请问...
  • 公共网关接口(CGI),一套标准,定义了信息如何在 Web 服务器和客户端脚本之间进行交换的。CGI 规范目前由 NCSA 维护的,NCSA 定义 CGI 如下:公共网关接口(CGI),一种用于外部网关程序与信息服务器(如 ...

    什么是 CGI?

    • 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。
    • CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下:
    • 公共网关接口(CGI),是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的接口标准。
    • 目前的版本是 CGI/1.1,CGI/1.2 版本正在推进中。

    Web 浏览

    为了更好地了解 CGI 的概念,让我们点击一个超链接,浏览一个特定的网页或 URL,看看会发生什么。

    • 您的浏览器联系上 HTTP Web 服务器,并请求 URL,即文件名。
    • Web 服务器将解析 URL,并查找文件名。如果找到请求的文件,Web 服务器会把文件发送回浏览器,否则发送一条错误消息,表明您请求了一个错误的文件。
    • Web 浏览器从 Web 服务器获取响应,并根据接收到的响应来显示文件或错误消息。

    然而,以这种方式搭建起来的 HTTP 服务器,不管何时请求目录中的某个文件,HTTP 服务器发送回来的不是该文件,而是以程序形式执行,并把执行产生的输出发送回浏览器显示出来。

    公共网关接口(CGI),是使得应用程序(称为 CGI 程序或 CGI 脚本)能够与 Web 服务器以及客户端进行交互的标准协议。这些 CGI 程序可以用 Python、PERL、Shell、C 或 C++ 等进行编写。

    CGI 架构图

    下图演示了 CGI 的架构:

    0bcf980cb85a5d2c88d3ad38cee39ab4.png

    Web 服务器配置

    在您进行 CGI 编程之前,请确保您的 Web 服务器支持 CGI,并已配置成可以处理 CGI 程序。所有由 HTTP 服务器执行的 CGI 程序,都必须在预配置的目录中。该目录称为 CGI 目录,按照惯例命名为 /var/www/cgi-bin。虽然 CGI 文件是 C++ 可执行文件,但是按照惯例它的扩展名是 .cgi

    默认情况下,Apache Web 服务器会配置在 /var/www/cgi-bin 中运行 CGI 程序。如果您想指定其他目录来运行 CGI 脚本,您可以在 httpd.conf 文件中修改以下部分:

    <Directory "/var/www/cgi-bin">
       AllowOverride None
       Options ExecCGI
       Order allow,deny
       Allow from all
    </Directory>
     
    <Directory "/var/www/cgi-bin">
    Options All
    </Directory>

    在这里,我们假设已经配置好 Web 服务器并能成功运行,你可以运行任意的 CGI 程序,比如 Perl 或 Shell 等。

    第一个 CGI 程序

    请看下面的 C++ 程序:

    实例
    #include <iostream> using namespace std; int main () { cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>Hello World - 第一个 CGI 程序</title>n"; cout << "</head>n"; cout << "<body>n"; cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    编译上面的代码,把可执行文件命名为 cplusplus.cgi,并把这个文件保存在 /var/www/cgi-bin 目录中。在运行 CGI 程序之前,请使用 chmod 755 cplusplus.cgi UNIX 命令来修改文件模式,确保文件可执行。访问可执行文件,您会看到下面的输出:

    Hello World! 这是我的第一个 CGI 程序

    上面的 C++ 程序是一个简单的程序,把它的输出写在 STDOUT 文件上,即显示在屏幕上。在这里,值得注意一点,第一行输出 Content-type:text/htmlrnrn。这一行发送回浏览器,并指定要显示在浏览器窗口上的内容类型。您必须理解 CGI 的基本概念,这样才能进一步使用 Python 编写更多复杂的 CGI 程序。C++ CGI 程序可以与任何其他外部的系统(如 RDBMS)进行交互。

    HTTP 头信息

    Content-type:text/htmlrnrn 是 HTTP 头信息的组成部分,它被发送到浏览器,以便更好地理解页面内容。HTTP 头信息的形式如下:

    HTTP 字段名称: 字段内容
     
    例如
    Content-type: text/htmlrnrn

    还有一些其他的重要的 HTTP 头信息,这些在您的 CGI 编程中都会经常被用到。

    头信息描述Content-type:MIME 字符串,定义返回的文件格式。例如 Content-type:text/html。Expires: Date信息变成无效的日期。浏览器使用它来判断一个页面何时需要刷新。一个有效的日期字符串的格式应为 01 Jan 1998 12:00:00 GMT。Location: URL这个 URL 是指应该返回的 URL,而不是请求的 URL。你可以使用它来重定向一个请求到任意的文件。Last-modified: Date资源的最后修改日期。Content-length: N要返回的数据的长度,以字节为单位。浏览器使用这个值来表示一个文件的预计下载时间。Set-Cookie: String通过string设置 cookie。

    CGI 环境变量

    所有的 CGI 程序都可以访问下列的环境变量。这些变量在编写 CGI 程序时扮演了非常重要的角色。

    变量名描述CONTENT_TYPE内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。CONTENT_LENGTH查询的信息长度。只对 POST 请求可用。HTTP_COOKIE以键 & 值对的形式返回设置的 cookies。HTTP_USER_AGENT用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。PATH_INFOCGI 脚本的路径。QUERY_STRING通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。REMOTE_ADDR发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。REMOTE_HOST发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。REQUEST_METHOD用于发出请求的方法。最常见的方法是 GET 和 POST。SCRIPT_FILENAMECGI 脚本的完整路径。SCRIPT_NAMECGI 脚本的名称。SERVER_NAME服务器的主机名或 IP 地址。SERVER_SOFTWARE服务器上运行的软件的名称和版本。

    下面的 CGI 程序列出了所有的 CGI 变量。

    实例
    #include <iostream> #include <stdlib.h> #include <string> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>CGI 环境变量</title>n"; cout << "</head>n"; cout << "<body>n"; cout << "<table border = "0" cellspacing = "2">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // 尝试检索环境变量的值 char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ){ cout << value; }else{ cout << "环境变量不存在。"; } cout << "</td></tr>n"; } cout << "</table><n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    C++ CGI 库

    在真实的实例中,您需要通过 CGI 程序执行许多操作。这里有一个专为 C++ 程序而编写的 CGI 库,我们可以从 ftp://ftp.gnu.org/gnu/cgicc/ 上下载这个 CGI 库,并按照下面的步骤安装库:

    d3f87c1550de22f83dc9f93d83898cdf.png
    $ tar xzf cgicc-X.X.X.tar.gz 
    $ cd cgicc-X.X.X/ 
    $ ./configure --prefix=/usr 
    $ make
    $ make install
    注意:libcgicc.so 和 libcgicc.a 库会被安装到/usr/lib目录下,需执行拷贝命令:
    $ sudo cp /usr/lib/libcgicc.* /usr/lib64/才能使 CGI 程序自动找到 libcgicc.so 动态链接库。

    您可以点击 C++ CGI Lib Documentation,查看相关的库文档。

    GET 和 POST 方法

    您可能有遇到过这样的情况,当您需要从浏览器传递一些信息到 Web 服务器,最后再传到 CGI 程序。通常浏览器会使用两种方法把这个信息传到 Web 服务器,分别是 GET 和 POST 方法。

    使用 GET 方法传递信息

    GET 方法发送已编码的用户信息追加到页面请求中。页面和已编码信息通过 ? 字符分隔开,如下所示:

    http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

    GET 方法是默认的从浏览器向 Web 服务器传信息的方法,它会在浏览器的地址栏中生成一串很长的字符串。当您向服务器传密码或其他一些敏感信息时,不要使用 GET 方法。GET 方法有大小限制,在一个请求字符串中最多可以传 1024 个字符。

    当使用 GET 方法时,是使用 QUERY_STRING http 头来传递信息,在 CGI 程序中可使用 QUERY_STRING 环境变量来访问。

    您可以通过在 URL 后跟上简单连接的键值对,也可以通过使用 HTML <FORM> 标签的 GET 方法来传信息。

    简单的 URL 实例:Get 方法

    下面是一个简单的 URL,使用 GET 方法传递两个值给 hello_get.py 程序。

    /cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

    下面的实例生成 cpp_get.cgi CGI 程序,用于处理 Web 浏览器给出的输入。通过使用 C++ CGI 库,可以很容易地访问传递的信息:

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>使用 GET 和 POST 方法</title>n"; cout << "</head>n"; cout << "<body>n"; form_iterator fi = formData.getElement("first_name"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "名:" << **fi << endl; }else{ cout << "No text entered for first name" << endl; } cout << "<br/>n"; fi = formData.getElement("last_name"); if( !fi->isEmpty() &&fi != (*formData).end()) { cout << "姓:" << **fi << endl; }else{ cout << "No text entered for last name" << endl; } cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    现在,编译上面的程序,如下所示:

    $g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

    生成 cpp_get.cgi,并把它放在 CGI 目录中,并尝试使用下面的链接进行访问:

    /cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

    这会产生以下结果:

    名:ZARA 
    姓:ALI 

    简单的表单实例:GET 方法

    下面是一个简单的实例,使用 HTML 表单和提交按钮传递两个值。我们将使用相同的 CGI 脚本 cpp_get.cgi 来处理输入。

    <form action="/cgi-bin/cpp_get.cgi" method="get"> 名:<input type="text" name="first_name"> <br /> 姓:<input type="text" name="last_name" /> <input type="submit" value="提交" /> </form>

    下面是上述表单的实际输出,请输入名和姓,然后点击提交按钮查看结果。

    使用 POST 方法传递信息

    一个更可靠的向 CGI 程序传递信息的方法是 POST 方法。这种方法打包信息的方式与 GET 方法相同,不同的是,它不是把信息以文本字符串形式放在 URL 中的 ? 之后进行传递,而是把它以单独的消息形式进行传递。该消息是以标准输入的形式传给 CGI 脚本的。

    我们同样使用 cpp_get.cgi 程序来处理 POST 方法。让我们以同样的例子,通过使用 HTML 表单和提交按钮来传递两个值,只不过这次我们使用的不是 GET 方法,而是 POST 方法,如下所示:

    <form action="/cgi-bin/cpp_get.cgi" method="post"> 名:<input type="text" name="first_name"><br /> 姓:<input type="text" name="last_name" /> <input type="submit" value="提交" /> </form>

    向 CGI 程序传递复选框数据

    当需要选择多个选项时,我们使用复选框。

    下面的 HTML 代码实例是一个带有两个复选框的表单:

    <form action="/cgi-bin/cpp_checkbox.cgi" method="POST" target="_blank"> <input type="checkbox" name="maths" value="on" /> 数学 <input type="checkbox" name="physics" value="on" /> 物理 <input type="submit" value="选择学科" /> </form>

    下面的 C++ 程序会生成 cpp_checkbox.cgi 脚本,用于处理 Web 浏览器通过复选框给出的输入。

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; bool maths_flag, physics_flag; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>向 CGI 程序传递复选框数据</title>n"; cout << "</head>n"; cout << "<body>n"; maths_flag = formData.queryCheckbox("maths"); if( maths_flag ) { cout << "Maths Flag: ON " << endl; }else{ cout << "Maths Flag: OFF " << endl; } cout << "<br/>n"; physics_flag = formData.queryCheckbox("physics"); if( physics_flag ) { cout << "Physics Flag: ON " << endl; }else{ cout << "Physics Flag: OFF " << endl; } cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    向 CGI 程序传递单选按钮数据

    当只需要选择一个选项时,我们使用单选按钮。

    下面的 HTML 代码实例是一个带有两个单选按钮的表单:

    <form action="/cgi-bin/cpp_radiobutton.cgi" method="post" target="_blank"> <input type="radio" name="subject" value="maths" checked="checked"/> 数学 <input type="radio" name="subject" value="physics" /> 物理 <input type="submit" value="选择学科" /> </form>

    下面的 C++ 程序会生成 cpp_radiobutton.cgi 脚本,用于处理 Web 浏览器通过单选按钮给出的输入。

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>向 CGI 程序传递单选按钮数据</title>n"; cout << "</head>n"; cout << "<body>n"; form_iterator fi = formData.getElement("subject"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Radio box selected: " << **fi << endl; } cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    向 CGI 程序传递文本区域数据

    当需要向 CGI 程序传递多行文本时,我们使用 TEXTAREA 元素。

    下面的 HTML 代码实例是一个带有 TEXTAREA 框的表单:

    <form action="/cgi-bin/cpp_textarea.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 请在这里输入文本... </textarea> <input type="submit" value="提交" /> </form>

    下面的 C++ 程序会生成 cpp_textarea.cgi 脚本,用于处理 Web 浏览器通过文本区域给出的输入。

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>向 CGI 程序传递文本区域数据</title>n"; cout << "</head>n"; cout << "<body>n"; form_iterator fi = formData.getElement("textcontent"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Text Content: " << **fi << endl; }else{ cout << "No text entered" << endl; } cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    向 CGI 程序传递下拉框数据

    当有多个选项可用,但只能选择一个或两个选项时,我们使用下拉框。

    下面的 HTML 代码实例是一个带有下拉框的表单:

    <form action="/cgi-bin/cpp_dropdown.cgi" method="post" target="_blank"> <select name="dropdown"> <option value="Maths" selected>数学</option> <option value="Physics">物理</option> </select> <input type="submit" value="提交"/> </form>

    下面的 C++ 程序会生成 cpp_dropdown.cgi 脚本,用于处理 Web 浏览器通过下拉框给出的输入。

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>向 CGI 程序传递下拉框数据</title>n"; cout << "</head>n"; cout << "<body>n"; form_iterator fi = formData.getElement("dropdown"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Value Selected: " << **fi << endl; } cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    在 CGI 中使用 Cookies

    HTTP 协议是一种无状态的协议。但对于一个商业网站,它需要在不同页面间保持会话信息。例如,一个用户在完成多个页面的步骤之后结束注册。但是,如何在所有网页中保持用户的会话信息。

    在许多情况下,使用 cookies 是记忆和跟踪有关用户喜好、购买、佣金以及其他为追求更好的游客体验或网站统计所需信息的最有效的方法。

    它是如何工作的

    服务器以 cookie 的形式向访客的浏览器发送一些数据。如果浏览器接受了 cookie,则 cookie 会以纯文本记录的形式存储在访客的硬盘上。现在,当访客访问网站上的另一个页面时,会检索 cookie。一旦找到 cookie,服务器就知道存储了什么。

    cookie 是一种纯文本的数据记录,带有 5 个可变长度的字段:

    • Expires : cookie 的过期日期。如果此字段留空,cookie 会在访客退出浏览器时过期。
    • Domain : 网站的域名。
    • Path : 设置 cookie 的目录或网页的路径。如果您想从任意的目录或网页检索 cookie,此字段可以留空。
    • Secure : 如果此字段包含单词 "secure",那么 cookie 只能通过安全服务器进行检索。如果此字段留空,则不存在该限制。
    • Name=Value : cookie 以键值对的形式被设置和获取。

    设置 Cookies

    向浏览器发送 cookies 是非常简单的。这些 cookies 会在 Content-type 字段之前,与 HTTP 头一起被发送。假设您想设置 UserID 和 Password 为 cookies,设置 cookies 的步骤如下所示:

    实例
    #include <iostream> using namespace std; int main () { cout << "Set-Cookie:UserID=XYZ;rn"; cout << "Set-Cookie:Password=XYZ123;rn"; cout << "Set-Cookie:Domain=www.w3cschool.cc;rn"; cout << "Set-Cookie:Path=/perl;n"; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>CGI 中的 Cookies</title>n"; cout << "</head>n"; cout << "<body>n"; cout << "设置 cookies" << endl; cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    从这个实例中,我们了解了如何设置 cookies。我们使用 Set-Cookie HTTP 头来设置 cookies。

    在这里,有一些设置 cookies 的属性是可选的,比如 Expires、Domain 和 Path。值得注意的是,cookies 是在发送行 "Content-type:text/htmlrnrn 之前被设置的。

    编译上面的程序,生成 setcookies.cgi,并尝试使用下面的链接设置 cookies。它会在您的计算机上设置四个 cookies:

    /cgi-bin/setcookies.cgi

    获取 Cookies

    检索所有设置的 cookies 是非常简单的。cookies 被存储在 CGI 环境变量 HTTP_COOKIE 中,且它们的形式如下:

    key1=value1;key2=value2;key3=value3....

    下面的实例演示了如何获取 cookies。

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; const_cookie_iterator cci; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>CGI 中的 Cookies</title>n"; cout << "</head>n"; cout << "<body>n"; cout << "<table border = "0" cellspacing = "2">"; // 获取环境变量 const CgiEnvironment& env = cgi.getEnvironment(); for( cci = env.getCookieList().begin(); cci != env.getCookieList().end(); ++cci ) { cout << "<tr><td>" << cci->getName() << "</td><td>"; cout << cci->getValue(); cout << "</td></tr>n"; } cout << "</table><n"; cout << "<br/>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    现在,编译上面的程序,生成 getcookies.cgi,并尝试使用下面的链接获取您的计算机上所有可用的 cookies:

    /cgi-bin/getcookies.cgi

    这会产生一个列表,显示了上一节中设置的四个 cookies 以及您的计算机上所有其他的 cookies:

    UserID XYZ 
    Password XYZ123 
    Domain www.w3cschool.cc 
    Path /perl 

    文件上传实例

    为了上传一个文件,HTML 表单必须把 enctype 属性设置为 multipart/form-data。带有文件类型的 input 标签会创建一个 "Browse" 按钮。

    <html> <body> <form enctype="multipart/form-data" action="/cgi-bin/cpp_uploadfile.cgi" method="post"> <p>文件:<input type="file" name="userfile" /></p> <p><input type="submit" value="上传" /></p> </form> </body> </html>

    这段代码的结果是下面的表单:

    文件:

    注意:上面的实例已经故意禁用了保存上传的文件在我们的服务器上。您可以在自己的服务器上尝试上面的代码。

    下面是用于处理文件上传的脚本 cpp_uploadfile.cpp

    实例
    #include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; cout << "Content-type:text/htmlrnrn"; cout << "<html>n"; cout << "<head>n"; cout << "<title>CGI 中的文件上传</title>n"; cout << "</head>n"; cout << "<body>n"; // 获取要被上传的文件列表 const_file_iterator file = cgi.getFile("userfile"); if(file != cgi.getFiles().end()) { // 在 cout 中发送数据类型 cout << HTTPContentHeader(file->getDataType()); // 在 cout 中写入内容 file->writeToStream(cout); } cout << "<文件上传成功>n"; cout << "</body>n"; cout << "</html>n"; return 0; }

    上面的实例是在 cout 流中写入内容,但您可以打开文件流,并把上传的文件内容保存在目标位置的某个文件中。

    展开全文
  • Web服务器可以向Web浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。Web服务器,也称为“WWW服务器”( 英文全写:World Wide Web,翻译成中文:万维网或环球信息网 )...

    494618279e33de9a5a1da191463d42e1.png

    本文编辑:富哥

    Web服务器,一般是指“网站服务器”,是指驻留于互联网上某种类型计算机的程序。Web服务器可以向Web浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。

    Web服务器,也称为“WWW服务器”( 英文全写:World Wide Web,翻译成中文:万维网或环球信息网 ),主要功能是“提供网上信息浏览服务”。 WWW 是Internet(互联网)的多媒体信息查询工具,是Internet(互联网)上发展起来的服务,也是发展最快和目前使用最广泛的服务。正是因为有了WWW工具,才使得近十几年来互联网迅速繁荣发展,用户数量飞速飙升。据最新数据显示,目前全球人口数量达到76.76亿人,其中全球“网民”(互联网用户)达到惊人的43.88亿。

    37249968ca60533fe7c9a0158a288452.png

    对于“Web服务器”的多种定义和解读:

    1、Web服务器是一种被动程序,只有当互联网上运行的、其他计算机中的浏览器发出请求时,Web服务器才会响应。

    2、互联网上的服务器,也称为:Web服务器,是一台在互联网上具有独立IP地址的高性能计算机,可以向互联网上的客户机,包括:个人台式机电脑、笔记本电脑、平板电脑等,提供“WWW(万维网)、Email(电子邮件)和FTP(文件传输)”等各种互联网服务。

    3、Web服务器,是指驻留于互联网上某种类型计算机的程序。当Web浏览器(客户端)连到Web服务器上,并请求文件时,Web服务器将处理该请求,并将文件发送反馈到Web浏览器上,附带的信息会告诉Web浏览器如何查看该文件。由于Web服务器,使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,所以人们常把它们称为“HTTP服务器”。

    4、Web服务器,不仅能够存储信息,还能在通过Web浏览器向用户提供信息的基础上,运行脚本和程序。

    8802799b7fce24adfe8b3a9a2261093a.png

    再来谈谈“WWW”:

    WWW是“ World Wide Web (环球信息网)”的英文缩写,也可以简称为:Web,中文名字叫“万维网”。它起源于1989年3月,由欧洲量子物理实验室CERN(世界上最大的粒子物理学实验室)所发展出来的“主从结构分布式超媒体系统”。通过万维网,人们只要使用简单的方法,就可以很迅速、方便地获取到丰富的信息资料。由于用户在通过“Web浏览器”访问信息资源的过程中,无需关心一些技术性的细节,且使用界面简单易懂,因而 Web在互联网上一经推出,就受到了热烈的追捧,风靡全球,并迅速得到了爆炸性的增长。

    长期以来,人们只能通过传统的媒体(如:电视、报纸、杂志和广播等)获取信息。然而随着计算机技术和互联网的发展,人们获取信息的需求,已不仅仅满足于传统媒体那种单方面传播和获取的方式,而是希望有一种主观的选择性和更多的交互性。随着个人电脑的普及与互联网的日益渗透和推广,人们获取信息变得非常及时、方便、迅速、快捷。

    到了1993年,WWW的技术有了突破性的进展,它解决了远程信息服务中的“文字显示、数据连接以及图像传递”等问题,使得WWW成为互联网上最为流行的信息传播方式。Web服务器,成为互联网上最大的计算机群,Web的文档之多、链接的网络之广,令人叹为观止。

    可以说,Web为互联网应用的普及,迈出了“革命性”的一步,是互联网发展史上取得的最激动人心的成就。

    目前最常用的Web服务器是: Apache (阿帕奇)和Microsoft(微软)的互联网信息服务器(英文全写:Internet Information Services,缩写:IIS,即“互联网信息服务”)。

    99ef5cd3ed002f84c9cb390e9b5af89a.png

    Web服务器的工作原理:

    Web服务器的工作原理并不复杂,一般可分成4个步骤:连接过程、请求过程、应答过程以及关闭连接。

    连接过程,就是Web服务器和Web浏览器之间所建立起来的一种连接。要查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件(一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的“打开、读写和关闭”等操作)。这个文件的建立,意味着“连接过程”这一步骤已经成功建立。

    请求过程,就是Web的浏览器运用socket这个文件向Web的服务器提出各种请求。应答过程,就是运用“HTTP协议”把在请求过程中所提出来的请求,传输到Web的服务器,进而实施任务处理,然后运用“HTTP协议”把任务处理的结果,再传输到Web的浏览器,同时在Web的浏览器上面,展示上述所请求的界面。

    e1766065264227ba38ac1bea5e8523ad.png

    关闭连接,就是当上一个步骤:“应答过程”完成以后,Web服务器和Web浏览器之间断开连接的过程。Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程,以及多个进程与多个线程相混合的技术。

    感谢葵芳IDC技术员一凡对本文专业指导,本文仅代表个人观点,感谢阅读。

    专业的服务,来自专业的态度。

    展开全文
  • Web服务器可以向Web浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。 Web服务器,也称为“WWW服务器”( 英文全写:World Wide Web,翻译成中文:万维网或环球信息网...

    本文编辑:玲子

    Web服务器,一般是指“网站服务器”,是指驻留于互联网上某种类型计算机的程序。Web服务器可以向Web浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。

    Web服务器,也称为“WWW服务器”( 英文全写:World Wide Web,翻译成中文:万维网或环球信息网 ),主要功能是“提供网上信息浏览服务”。 WWW 是Internet(互联网)的多媒体信息查询工具,是Internet(互联网)上发展起来的服务,也是发展最快和目前使用最广泛的服务。正是因为有了WWW工具,才使得近十几年来互联网迅速繁荣发展,用户数量飞速飙升。据最新数据显示,目前全球人口数量达到76.76亿人,其中全球“网民”(互联网用户)达到惊人的43.88亿。

    对于“Web服务器”的多种定义和解读:

    1、Web服务器是一种被动程序,只有当互联网上运行的、其他计算机中的浏览器发出请求时,Web服务器才会响应。

    2、互联网上的服务器,也称为:Web服务器,是一台在互联网上具有独立IP地址的高性能计算机,可以向互联网上的客户机,包括:个人台式机电脑、笔记本电脑、平板电脑等,提供“WWW(万维网)、Email(电子邮件)和FTP(文件传输)”等各种互联网服务。

    3、Web服务器,是指驻留于互联网上某种类型计算机的程序。当Web浏览器(客户端)连到Web服务器上,并请求文件时,Web服务器将处理该请求,并将文件发送反馈到Web浏览器上,附带的信息会告诉Web浏览器如何查看该文件。由于Web服务器,使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,所以人们常把它们称为“HTTP服务器”。

    4、Web服务器,不仅能够存储信息,还能在通过Web浏览器向用户提供信息的基础上,运行脚本和程序。

    再来谈谈“WWW”:

    WWW是“ World Wide Web (环球信息网)”的英文缩写,也可以简称为:Web,中文名字叫“万维网”。它起源于1989年3月,由欧洲量子物理实验室CERN(世界上最大的粒子物理学实验室)所发展出来的“主从结构分布式超媒体系统”。通过万维网,人们只要使用简单的方法,就可以很迅速、方便地获取到丰富的信息资料。由于用户在通过“Web浏览器”访问信息资源的过程中,无需关心一些技术性的细节,且使用界面简单易懂,因而 Web在互联网上一经推出,就受到了热烈的追捧,风靡全球,并迅速得到了爆炸性的增长。

    长期以来,人们只能通过传统的媒体(如:电视、报纸、杂志和广播等)获取信息。然而随着计算机技术和互联网的发展,人们获取信息的需求,已不仅仅满足于传统媒体那种单方面传播和获取的方式,而是希望有一种主观的选择性和更多的交互性。随着个人电脑的普及与互联网的日益渗透和推广,人们获取信息变得非常及时、方便、迅速、快捷。

    到了1993年,WWW的技术有了突破性的进展,它解决了远程信息服务中的“文字显示、数据连接以及图像传递”等问题,使得WWW成为互联网上最为流行的信息传播方式。Web服务器,成为互联网上最大的计算机群,Web的文档之多、链接的网络之广,令人叹为观止。

    可以说,Web为互联网应用的普及,迈出了“革命性”的一步,是互联网发展史上取得的最激动人心的成就。

    目前最常用的Web服务器是: Apache (阿帕奇)和Microsoft(微软)的互联网信息服务器(英文全写:Internet Information Services,缩写:IIS,即“互联网信息服务”)。

    Web服务器的工作原理:

    Web服务器的工作原理并不复杂,一般可分成4个步骤:连接过程、请求过程、应答过程以及关闭连接。

    连接过程,就是Web服务器和Web浏览器之间所建立起来的一种连接。要查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件(一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的“打开、读写和关闭”等操作)。这个文件的建立,意味着“连接过程”这一步骤已经成功建立。

    请求过程,就是Web的浏览器运用socket这个文件向Web的服务器提出各种请求。应答过程,就是运用“HTTP协议”把在请求过程中所提出来的请求,传输到Web的服务器,进而实施任务处理,然后运用“HTTP协议”把任务处理的结果,再传输到Web的浏览器,同时在Web的浏览器上面,展示上述所请求的界面。

    关闭连接,就是当上一个步骤:“应答过程”完成以后,Web服务器和Web浏览器之间断开连接的过程。Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程,以及多个进程与多个线程相混合的技术。

     

     

    转载于:https://www.cnblogs.com/xiaoxiao998/p/11456948.html

    展开全文
  • 浏览器服务器请求页面的原理

    千次阅读 2016-02-28 18:24:31
    我们经常用浏览器上网,但是大家想过没有在浏览器服务器之间怎么交互的吗?接下给大家说说web页面请求的原理(高手直接跳过)。 首先我们不要把服务器想的太神圣了,其实他也就是一台 没有显示器的电脑,处理...

    我们经常用浏览器上网,但是大家想过没有在浏览器和服务器之间是怎么交互的吗?接下给大家说说web页面请求的原理(高手直接跳过)。

    首先我们不要把服务器想的太神圣了,其实他也就是一台 没有显示器的电脑,处理速度比普通电脑快罢了。

    服务器端安装的IIS软件,在客户端是浏览器;

    客户端: 

    当我们在浏览器输入网址并回车后,如果你是第一次访问这个网址例如www.itcast.cn,你的浏览器并不知道这个网站的IP,所以第一次请求时发向DNS服务器,DNS服务器查询到该网址对应的IP后,再给你发回,然后浏览器根据IP地址向www.itcast.cn对应的web服务器发送请求。

    服务器端:

    首先在服务器端有一个监听请求的东东,那是什么呢?是Socket,负责监听请求的Sockets发现有请求到达,他会根据socket.Accept()立即创建一个socket负责与发送请求的 浏览器进行通信(浏览器本来就是用socket与服务器通信的,因此浏览也就是一个socket),因为监听请求的的socket占用一个线程,因此我们也创建另一个线程专门处理客户端浏览器的请求。

    接下来分析请求的页面的路径和页面的类型:如果发现请求的是静态页面,我么直接读取静态页面页面,并生成响应报文头(text/html),通过socket发回给浏览器;如果请求的是图片的话,生成响应报文头(image/jpeg),和图片内容一起发回给客户端,想css,js之类的都是基本一样的处理方式;

    如果发送来的请求是动态页面,那服务器该怎么处理请求呢(IIS没有直接处理动态页面的能力),其实IIS是通过可扩展插件来处理的,例如asp.net做的动态页面是通过 netframework来处理的 ,其他的暂时不理会(偶不会啊)!当页面处理完毕后,将处理完的结果交给socket,由socket 发回给浏览器。

    如果客户端请求的页面在服务器端不存在,服务器给客户端发回的响应报文中提示有错误信息404,还有其他一些错误信息代码,在这里就不再多说了!

    展开全文
  • web服务器工作原理 思考问题:服务器知道浏览器什么时候关闭吗?除非浏览器请求,否则服务器无法主动向浏览器发送数据!浏览器服务器之间短暂的网络连接。(*)
  • 很多Web前端学习入门小白好奇浏览器究竟如何工作的?它的缓存机制什么,接下来小编就给大家介绍一下。 浏览器缓存机制有四个方面,按照获取资源时请求的优先级依次排列为:Memory Cache、Service ...
  • #2020毕业季##网络安全在我身边##新作者扶植计划 第二期#你知道当我们在网页浏览器的地址栏中输入URL时,Web页面如何呈现的吗?即使你不知道Web页面如何呈现在你眼前的,但,你确确实实的看见了这样一个Web页面...
  • web服务器是干什么的?Servlet归什么管?Servlet本质上不就是一个普通的java类吗,没有main方法如何工作的?(文章中请求一律指HTTP请求,Servlet指HttpServlet)那么接下来就开始讲解了,这我的一些个人认知,有不准确的...
  • 前一段为公司设计开发在线Python编程引擎(就是打开浏览器在网页上就可以进行Python编程),一开始想着前端用一个文本...什么BrythonBrython被用来设计为替代JavaScript,用于Web客户端编程。它一个浏览器上的Pyth...
  • ist是Web4Rail吗? Web4Rail的eine Modellbahn-Steuerungs软件,einem Web-Browserausgeführtzu werden中的welchedafürzugeschnitten ist。 客户端服务器-服务器。 Das beuteute: Die Anwendung wird zentral ...
  • 一个新的Python学习者,我想实现一个可以处理多线程的简单Web服务器 . 如果我不把评论作为评论,那么一切都很顺利 . 如果我发表评论,就会出现问题 . 客户端可以在第一次请求后成功获得响应,但是当我刷新网页时...
  • php需要应用服务器吗php需要应用服务器,因为php程序需要开启一个端口来监听9000端口,用来与web服务器进行通信。以下是浏览器和PHP、MySQL服务器通信的流程。1)用户的 Web 浏览器发出 HTTP 请求,请求特定 Web 页面...
  • [要协议一个web服务器,需要了解http协议,下面我们来看一下当浏览器请求网张的时候向web服务器发送的数据,我使用的ubuntu 中telent展现一个下过程。 我需要一个String Agent = request.getHeader("User-Agent");...
  • cookie数据会自动在web浏览器和web服务器之间传输,也就是说HTTP请求发送时,会把保存在该请求域名下的所有cookie值发送给web服务器,因此服务器端脚本可以读、写存储在客户端的cookie的操作。 cookie的有效期: ...
  • 会话技术类似于生活中两个人聊天,你说一句我说一句,在web中体现为服务器端与客户端的交互一次会话中包含多次请求与响应,当服务器请求浏览器是会话建立,当一方断开时会话结束什么是SessionSession是服务器端会话...
  • 比如随着云计算的普及和 HTML5 技术的快速发展,越来越多的应用转向了浏览器 / 服务器(B/S)架构,这种改变让浏览器的重要性与日俱增,视频、音频、游戏几大核心场景也都在逐渐往 Web 使用场景切换。可以说,在 PC 端...
  • --http请求方式则通过假架设一个web服务器,解析http协议的请求然后向浏览器返回资源信息。我们所开发的html文件最后必定会以网页的形式部署在服务器上,通过http协议访问,所以我们开发中也尽可能模...
  • 服务器端执行的浏览器软件

    千次阅读 2006-01-07 16:19:00
    以前我一直认为浏览器只能在客户机上面执行的软件。不就是解析网页吗,只是一个把页面内容呈现出来的过程...UCWEB一个JAVA浏览器,用来浏览WAP和WEB网页。虽说JAVA程序,不过它的速度却比Smartphone自带的IE快很
  • 我们经常在各种文章看到一些性能指标:pv、uv等等,这些都是web站点性能涉及的一些专业名词,我们就了解一下。PVPV(page view)翻译中文就是页面访问量,代表页面浏览量或者用户点击量,用户每刷新一次就会累计加一次...
  • 我们现在每天浏览网页,浏览器服务器发送请求,服务器中的web服务器来处理来 至全世界各地的请求信息。web服务器是怎样处理请求并返回文档信息?,web服务器的 基本原理怎样的呢?我们可以这样分析,web...
  • web项目图片来源本地硬盘,<img src="/web_mvn/ImageShowServlet" alt="" />src处调用servlet直接返回图片吗?看到有的网站用一个文件夹uploads存放图片,这下载硬盘上的图片到服务器文件夹uploads中,图片...
  • php需要应用服务器吗发布时间:2020-10-22 15:13:52来源:亿速云阅读:63...php需要应用服务器吗php需要应用服务器,因为php程序需要开启一个端口来监听9000端口,用来与web服务器进行通信。以下是浏览器和PHP、MyS...
  • 在做接口测试的时候都会遇到需要登录这个操作,有一些接口在登录过后才能操作过程,前面写过如何通过requests...CookieWeb服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时...
  • GoAccess一个开源的实时Web日志分析器和交互式查看器,可在* nix系统上的终端中或通过浏览器运行。 它为需要动态服务器视觉报告的系统管理员提供了快速而有价值的HTTP统计信息。 有关更多信息,访问: : 。 产品...
  • 要启动Phoenix服务器: 使用启动数据库 docker-compose -f docker-compose-development.yaml up 安装依赖项 mix deps.get 使用以下命令创建和迁移数据库 mix ecto.create && mix ecto.migrate 使用以下命令安装Node....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475
精华内容 190
关键字:

web浏览器是服务器吗