精华内容
下载资源
问答
  • web服务器功能
    千次阅读
    2017-01-03 13:27:43

    正好这段时间多,公司没啥项目.做一个httpserver服务器玩玩,平时多练练,在项目中开发时才能更加的顺手.

    每个程序员都应该尝试下写博客
    http://droidyue.com/blog/2017/01/02/why-every-programmer-should-try-to-write-blogs/

    目前开源的web服务器主要有:
    https://h2o.examp1e.net/

    http请求库libCURL

    我推荐一个比较小众的:
    http://iunknown.iteye.com/blog/59804

    1.先看完libevent.初步理解libevent的源代码这种事件驱动的网络框架

    暂时先采用C语言版来实现,后面再完善成C++版本.

    webserver模块分析和设计
    1.命令行解析功能
    命令行参数主要有哪些?服务器侦听端口,最大客户端数量,网站的根目录,配置文件名称,连接超时时间扥等

    2.配置文件解析(tinyxml库使用)
    配置文件为服务器的主配置选项,相同选项,配置文件的配置将覆盖命令行的配置.
    3.日志库
    使用glog库,分等级将日志输出.

    4.多客户端支持(网络传输层,负责接收连接,数据接收,数据发送)
    连接的处理,请求数据的接收,响应数据的发送,客户端请求到来的时候,主线程查看线程池中是否有空闲的工作线程,
    有:分配任务,没有:创建新的线程.此处采用libevent框架来实现.减少多余的网络问题.

    5.http头部分析
    5.1解析http method,如GET,POST,HEAD等等
    5.2 解析http的版本
    5.3 解析URI,即请求资源的地址.

    6.http URI的分析设计
    请求主机的位置以’/‘开始,资源位置的最后一个’/'后的字符串为实际请求的文件名.需要根据文件名来判断请求资源的类型,对于一个以"%"开头的字符,需要进行转换后使用真正的值,其后面的两个字符拼成一个字符.

    7.http支持方法的分析设计
    暂时仅支持GET方法,服务器对应GET方法的处理逻辑分为:
    头部信息的组织(http response响应的头部信息)
    文件内容的发送

    8.http支持CGI的分析设计(查阅http CGI的资料和使用方法)

    9.http错误处理的分析设计
    9.1用户的请求发生错误
    9.2服务器端发生错误
    9.3网络传输过程中发生错误时

    类设计
    多客户端并发支持->网络类,libevent构造网络框架

    更多相关内容
  • web服务器的作用

    千次阅读 2021-07-30 02:43:35
    web服务器的作用[编辑]概述Web服务器一般指网站...一、web服务器简介WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才...

    web服务器的作用[编辑]

    概述

    Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,它的主要作用是向浏览器等Web客户端提供文档,放置网站文件让网络用户浏览以及提供可以下载的数据文件。

    一、web服务器简介

    WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。

    二、web服务器的特点

    1、Web是图形化的和易于导航的

    Web非常流行的一个很重要的原因就在于它可以在一页上同时显示色彩丰富的图形和文本的性能。在Web之前Internet上的信息只有文本形式。Web可以提供将图形、音频、视频信息集合于一体的特性。同时,Web是非常易于导航的,只需要从一个连接跳到另一个连接,就可以在各页各站点之间进行浏览了。

    2、Web与平台无关

    无论你的系统平台是什么,你都可以通过Internet访问WWW。浏览WWW对你的系统平台没有什么限制。无论从Windows平台、UNIX平台、Macintosh还是别的什么平台我们都可以访问WWW。对WWW的访问是通过一种叫做浏览器(browser)的软件实现的。如Netscape 的Navigator、NCSA的Mosaic、Microsoft的Explorer等。

    3、Web是分布式的

    大量的图形、音频和视频信息会占用相当大的磁盘空间,我们甚至无法预知信息的多少。对于Web没有必要把所有信息都放在一起,信息可以放在不同的站点上。只需要在浏览器中指明这个站点就可以了。使在物理上并不一定在一个站点的信息在逻辑上一体化,从用户来看这些信息是一体的。

    三、web协议

    1、应用层使用HTTP协议。

    2、HTML(标准通用标记语言下的一个应用)文档格式。

    3、浏览器统一资源定位器(URL)。

    4、为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

    四、web服务器的工作步骤

    第一步:Web浏览器向一个特定的服务器发出Web页面请求。

    第二步:Web服务器接收到Web页面请求后,寻找所请求的Web页面,并将所请求的Web页面传送Web浏览器。

    第三步:Web浏览器接收到所请求的Web页面,并将它显示出来。

    五、web服务器的主要作用

    1.向浏览器等Web客户端提供文档

    2.放置网站文件,让网络用户浏览

    3.放置数据文件,提供下载

    参考资料: 百度百科

    扩展阅读: 怎样搭建web服务器

    合作编辑: 李优  李优

    秀友百科词条内容均由网友提供,仅供参考。如发现词条内容有问题,请发邮件至info # wm23.com。

    展开全文
  • rt-thread应用篇(03)---基于STM32F429实现web服务器功能

    千次阅读 多人点赞 2020-10-26 22:52:44
    rt-thread应用篇(03)---基于STM32F429实现web服务器功能

    目录

    参考示例

    前言

    一、需使用的组件与软件包及其ENV配置

    1、文件系统相关组件与软件包

    1.1、DFS 框架

    1.2、fal 软件包

    1.3、SFUD 组件

    2、网络通信相关组件和软件包

    2.1、SAL组件

    2.2、netdev组件

    2.3、协议栈组件

    2.4、netutils工具集软件包

    2.5、webnet软件包

    二、添加驱动和初始化代码

    1、SPI FLASH驱动

    2、网卡驱动

    3、FAL配置

    4、格式化块设备

    三、web服务器开发基础

    1、HTTP简介

    1.1、工作原理

    1.2、消息结构

    2、HTML简介

    2.1、HTML 网页结构

    2.2、HTML 标签

    2.3、HTML 属性

    3、CSS简介

    4、CGI技术简介

    5、SSI简介

    四、web服务器应用程序设计

    1、网页制作

    1.1、效果图

    1.2、CGI类型与SSI标签

    2、功能实现

    2.1、自定义注册CGI执行函数

    2.2、自定义注册SSI执行函数

    3、页面文件上传

    4、启动webnet

    5、解决的问题


    参考示例

    网络协议栈驱动移植笔记

    在 STM32F407 上应用网络功能

    在 STM32F429 上应用文件系统

    SPI Flash 文件系统例程

    前言

    1、此次实现的web服务器是使用了rtthread的webnet软件包来实现的。WebNet 软件包是 RT-Thread 自主研发的,基于 HTTP 协议的 Web 服务器实现,它不仅提供设备(HTTP Seerver)与 HTTP Client 通讯的基本功能,而且支持多种模块功能扩展,满足开发者对嵌入式设备服务器的功能需求。要将WebNet软件包用起来,基础的网络通信功能肯定是需要的,同时还需要能对 静态页面 进行存储、上传 等功能,所以WebNet的使用还需要文件系统相关的组件网络通信相关的组件的支持,通过这些组件和软件包可以快速搭建好一个在STM32开发web服务器的环境。在搭建好环境后,先使用HBuilder(HTML5的Web开发IDE)制作好你的网页,然后将这些网页使用tftp工具上传到/webnet目录下,最后使用webnet软件包提供的SSI、CGI等功能模块实现web服务器与浏览器之间的交互

    2、使用的硬件为  正点原子的阿波罗STM32F429开发板

    3、在ENV中选中的组件或软件包,如果开启了包管理器自动更新或者手动使用 pkgs --update 命令,就能自动将选择的软件包更新到BSP中;然后再使用 scons --target=xxx 命令编译BSP时,选择的软件包相关源代码就会被自动添加进工程中并进行编译

    一、需使用的组件与软件包及其ENV配置

    1、文件系统相关组件与软件包

    1.1、DFS 框架

    DFS 框架 是 RT-Thread 提供的虚拟文件系统组件,全称为 Device File System,即设备虚拟文件系统。DFS 框架为应用程序提供统一的 POSIX 文件和目录操作接口,如 read、write、poll/select 等。DFS 框架支持多种类型的文件系统,如 FatFS、RomFS、DevFS 等,并提供普通文件、设备文件、网络文件描述符的管理。

    1.2、fal 软件包

    fal 全称为 Flash Abstraction Layer,即 Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API。并提供了将分区创建成 MTD 设备的 API

    1.3、SFUD 组件

    SFUD 是一款开源的串行 SPI Flash 通用驱动库。现有市面的大部分串行 Flash,用户只需要提供 SPI 或 QSPI 的读写接口,SFUD 就可以识别并驱动。同时 RT-Thread 提供了 FAL 针对 SFUD 的驱动移植,可以使两个组件无缝连接

    2、网络通信相关组件和软件包

    2.1、SAL组件

    SAL 套接字抽象层,通过它 RT-Thread 系统能够适配下层不同的网络协议栈,并提供给上层统一的网络编程接口,方便不同协议栈的接入。套接字抽象层为上层应用层提供接口有:accept、connect、send、recv 等。具有如下特点:

    • 抽象、统一多种网络协议栈接口;
    • 提供 Socket 层面的 TLS 加密传输特性;
    • 支持标准 BSD Socket API;
    • 统一的 FD 管理,便于使用 read/write poll/select 来操作网络功能;

    2.2、netdev组件

    netdev 网卡层,主要作用是解决多网卡情况设备网络连接和网络管理相关问题,通过 netdev 网卡层用户可以统一管理各个网卡信息和网络连接状态,并且可以使用统一的网卡调试命令接口

    2.3、协议栈组件

    协议栈层包括几种常用的 TCP/IP 协议栈,例如嵌入式开发中常用的轻型 TCP/IP 协议栈 lwIP 以及 RT-Thread 自主研发的 AT Socket 网络功能实现等。这些协议栈或网络功能实现直接和硬件接触,完成数据从网络层到传输层的转化。这里使用的是lwip

    2.4、netutils工具集软件包

    netutils软件包中汇集了 RT-Thread 可用的全部网络小工具集合,这里主要使用TFTP小工具,TFTP (Trivial File Transfer Protocol, 简单文件传输协议)是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为 69 ,比传统的 FTP 协议要轻量级很多,适用于小型的嵌入式产品上。在板卡上开启TFTP Server后,就可以在PC上使用TFTP Client软件将HTML网页文件上传到板卡的SPI FLASH中。

    2.5、webnet软件包

    官网有很详细的介绍,WebNet 软件包功能特点:

    • 支持 HTTP 1.0/1.1
    • 支持 CGI 功能
    • 支持 ASP 变量替换功能
    • 支持 AUTH 基本认证功能
    • 支持 INDEX 目录文件显示功能
    • 支持 ALIAS 别名访问功能
    • 支持 SSI 文件嵌入功能
    • 支持文件上传功能
    • 支持预压缩功能
    • 支持缓存功能
    • 支持断点续传功能

    浏览器访问设备 IP 地址不显示页面信息

    • 原因:设置的根目录地址错误。
    • 解决方法:确定设置的根目录地址(/webnet)和设备文件系统上创建的目录地址一致,确定根目录下有页面文件。也就是说必须先在块设备上初始化文件系统,且在文件系统中有 /webnet 这个文件夹,同时页面文件也已经上传到了跟目录下。

    二、添加驱动和初始化代码

    1、SPI FLASH驱动

    1.1、在spi_flash_init.c中添加如下内容,注册softspi1总线,注册softspi10设备并挂载到softspi1总线上;使能SFUD驱动W25Q64块设备

    #include <rtthread.h>
    #include "spi_flash.h"
    #include "spi_flash_sfud.h"
    #include "drv_soft_spi.h"
    
    #if defined(BSP_USING_SPI_FLASH)
    static int rt_hw_spi_flash_init(void)
    {
        __HAL_RCC_GPIOG_CLK_ENABLE();
        rt_soft_spi_device_attach("softspi1", "softspi10", GPIOG, GPIO_PIN_10);
    
        if (RT_NULL == rt_sfud_flash_probe("W25Q64", "softspi10"))
        {
            return -RT_ERROR;
        }
    
        return RT_EOK;
    }
    INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
    #endif

    1.2、在ENV中开启模拟SPI,开启BSP_USING_SOFT_SPIBSP_USING_SOFT_SPI1宏定义,这样在scons构建工程时,drv_soft_spi.c 就能自动添加进工程中

    2、网卡驱动

    2.1、网卡驱动部分rtthread已经在drv_eth.c/h中写好了,唯一要改的就是在phy_reset.c中添加PHY网卡的复位,添加如下内容

    #define ETH_RESET_IO    GET_PIN(H, 3)                //PHY RESET PIN
    /* phy reset */
    void phy_reset(void)
    {
        rt_pin_write(ETH_RESET_IO, PIN_HIGH);
        rt_thread_mdelay(100);
        rt_pin_write(ETH_RESET_IO, PIN_LOW);
        rt_thread_mdelay(100);
    }
    
    int phy_init(void)
    {
        rt_pin_mode(ETH_RESET_IO, PIN_MODE_OUTPUT);
        rt_pin_write(ETH_RESET_IO, PIN_LOW);
        return RT_EOK;
    }
    INIT_BOARD_EXPORT(phy_init);

    2.2、在ENV中选中网卡驱动,开启 BSP_USING_ETH PHY_USING_LAN8720A宏定义,这样在scons构建工程时,drv_eth.c phy_reset.c 就能自动添加进工程中

    3、FAL配置

    3.1、在 fal_cfg.h中定义 flash 设备、flash 设备表、flash 分区表。flash设备表中,nor_flash0是使用了SFUD接口实现片外SPI FLASH操作的fal_flash设备,具体实现在FAL针对 SFUD 的移植文件fal_flash_sfud_port.c中。stm32_onchip_flash_xx 是直接操作单片机片内FLASH的fal_flash设备,具体实现在 drv_flash_f4.c

    /* flash device table */
    #define FAL_FLASH_DEV_TABLE                              \
    {                                                        \
    	&stm32_onchip_flash_16k,                                         \
        &stm32_onchip_flash_64k,                                         \
        &stm32_onchip_flash_128k,                                        \
        &nor_flash0,                                         \
    }
    /* ====================== Partition Configuration ========================== */
    #ifdef FAL_PART_HAS_TABLE_CFG
    
    /* partition table */
    #define FAL_PART_TABLE                                                                                                     \
    {                                                                                                                          \
        {FAL_PART_MAGIC_WROD, "bl", 		"onchip_flash_16k",  0 , FLASH_SIZE_GRANULARITY_16K , 0}, \
        {FAL_PART_MAGIC_WROD, "easyflash",  "onchip_flash_64k",  0 , FLASH_SIZE_GRANULARITY_64K , 0}, \
        {FAL_PART_MAGIC_WROD, "app",        "onchip_flash_128k", 0 , FLASH_SIZE_GRANULARITY_128K, 0}, \
    	{FAL_PART_MAGIC_WROD, "fs",        	FAL_USING_NOR_FLASH_DEV_NAME, 0 , 4 * 1024 * 1024, 0}, \
    	{FAL_PART_MAGIC_WROD, "tgfx",       FAL_USING_NOR_FLASH_DEV_NAME, 4 * 1024 * 1024 , 4 * 1024 * 1024, 0}, \
    }

    3.2、在 spi_flash_init.c 中调用fal_init()初始化该组件

    #if defined(PKG_USING_FAL)
    int fs_init(void)
    {
        /* partition initialized */
        fal_init();
    	return 0;
    }
    INIT_COMPONENT_EXPORT(fs_init);
    #endif

    4、格式化块设备

    4.1、将FAL的"fs"分区挂载到根目录下,用于存储静态网页,第一次挂载的时候可能会失败,因为该分区还没有文件系统,需要先在 "fs"分区创建elmFAT文件系统。此时可以在系统起来后,直接在shell中输入 mkfs -t elm fs 命令对“fs”分区进行格式化

    #if defined(RT_USING_DFS_ELMFAT)
    #define FS_PARTITION_NAME "fs"
    int elm_fatfs_init(void)
    {
        /* partition initialized */
    //    elm_init();
    	//dfs_mkfs("elm", "fs"); /* 在fs块设备上创建elm文件系统*/
      
    	/* Create a block device on the "fs" partition of spi flash */
        struct rt_device *flash_dev = fal_blk_device_create(FS_PARTITION_NAME);
        if (flash_dev == NULL){
            rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME);
        } else {
            rt_kprintf("Create a block device on the %s partition of flash successful.\n", FS_PARTITION_NAME);
        }
    	
    	/* mount the file system from "fs" partition of spi flash. */
        if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
        {
            LOG_I("Filesystem initialized!");
        }
        else
        {
            LOG_E("Failed to initialize filesystem!");
            LOG_D("You should create a filesystem on the block device first!");
        }
    	return 0;
    }
    INIT_COMPONENT_EXPORT(elm_fatfs_init);

    三、web服务器开发基础

    1、HTTP简介

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从服务器传输超文本到本地浏览器的传送协议。

    1.1、工作原理

    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。默认端口为80。HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

    HTTP三点注意事项:

    • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
    • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    1.2、消息结构

    客户端请求消息格式:由四个部分组成,分别是:请求行(request line)、请求头部(header)、空行、请求数据

    示例:

    GET /hello.txt HTTP/1.1
    User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
    Host: www.example.com
    Accept-Language: en, mi
    
    xxxxxxxxxxxxxx

    服务器响应消息格式:也由四个部分组成分别是:状态行、消息报头、空行、响应正文

    2、HTML简介

    超文本标记语言(HyperText Markup Language),是一种用于创建网页的标准标记语言。HTML 运行在浏览器上,由浏览器来解析。

    2.1、HTML 网页结构

    2.2、HTML 标签

    HTML 标记标签通常被称为 HTML 标签 (HTML tag)。

    • HTML 标签是由尖括号包围的关键词,比如 <html>
    • HTML 标签通常是成对出现的,比如 <b> 和 </b>
    • 标签对中的第一个标签是开始标签,第二个标签是结束标签
    • 开始和结束标签也被称为开放标签和闭合标签

    2.3、HTML 属性

    • HTML 标签可以设置属性
    • 属性可以在元素中添加附加信息
    • 属性一般描述于开始标签
    • 属性总是以名称/值对的形式出现,比如:name="value"
    • 一个标签中可以同时设置多个属性,属性之间需要用空格隔开
    <a href="http://www.runoob.com">这是一个链接</a> <h1>这是<font color="red" size="10">一个</font>网页</h1>

    3、CSS简介

    CSS 指层叠样式表 (Cascading Style Sheets),样式表定义如何显示 HTML 元素,就像 HTML 中的字体标签和颜色属性所起的作用那样。样式通常保存在外部的 .css 文件中。我们只需要编辑一个简单的 CSS 文档就可以改变所有页面的布局和外观。根据CSS样式在HTML中被引用的方式可分为以下三种类型:

    内部样式表:包含含HTML文件的head标签中,在body中的所以标签的可以使用

    <style type="text/css"> p{color:red;font-size:40px;}</style>

    外部样式表:外部独立的.css文件中,通过在HTML文件中引用这个.css文件使用其样式

    <link rel="stylesheet" type="text/css" href="css文件路径" />

    内联样式:直接写在标签的开始标签中,只对该标签有效

    <p style="color:red;font-size:40px;"> </p>

    4、CGI技术简介

    公共网关接口(Common Gateway Interface),是外部应用程序与web服务器之间的接口标准。CGI规范允许web服务器执行外部程序,并将它们的输出发送给web浏览器,CGI在物理上是一段程序,运行在服务器上,提供同客服端HTML页面的接口。绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或经相应的信息反馈给浏览器,CGI程序使网页具有交互功能,比如通过web来处理浏览器提交的表单数据。如下图,一个表单在浏览被提交,发送给web被处理的过程:

    1、登录网页

    2、提交表单(Checkbox, Radio button, selection list etc)

    3、CGI程序处理

    4、返回处理结果

    5、SSI简介

    服务器侧包含(server side include),是一种类似于ASP的基于服务器的网页制作技术。是指将HTML内容发送到浏览器之前,先使用SSI指令将文本、图形、或变量数据信息包含到网页中,再发给浏览器解析。对于在多个文件中重复出现的文本或图形,使用SSI包含技术是一种简便的方法,只需将内容存入一个包含文件中即可,而不必将内容写入到所有的文件,通过一个非常简单的语句即可调用包含文件,此语句指示web服务器将内容插入到网页的位置。

    实现SSI功能的原理也很简单,就是在发送网页文件的时候遍历整个文件,查找文件中的SSI指令,如果出现有<!--#include file="xxx" --> 指令,则将xxx文件的内容嵌入到网页中;如果出现有<!--#include virtual="xxx" --> 指令,则匹配注册好的xxx名称,如果有注册则执行其回调函数。想想如果发送每个网页的时候都这么去查找,效率肯定很低,而且很多网页并没有文件或变量需要嵌入,所以使用SSI指令的网页有特殊的扩展名,默认有 .stm、.shtm、.shtml,查找前会先匹配文件的扩展名,如果不是SSI默认的扩展名文件则不回配置SSI指令。如下图,浏览器请求一个.shtml扩展名的文件:

    1、用户请求SSI页面(后缀名是 .shtm .shtml .ssi .xml 的特殊的html网页)

    2、服务器根据页面SSI标签(<!--#include file="xxx" -->或<!--#include virtual="xxx" -->)动态插入数据。

    3、服务器返回动态生成的页面

    四、web服务器应用程序设计

    1、网页制作

    一个网页主要由三部分构成:结构、表现、行为。结构:用于描述页面的结构;表现:用于控制页面中元素的样式;行为:用于响应用户的操作。

    此次设计的有如下几个网页,网页使用HBuilder编写

    1.1、效果图

    1.2、CGI类型与SSI标签

    1、在需要提交表单的页面中,将表单的action属性填写成web服务器可识别的URL,表明向何处提交你的表单,这样wen服务器在收到表单数据后,就会去执行跟action匹配的自定义注册好的CGI执行函数。在rtthread的webnet中默认的CGI类型是/cgi-bin开头的,需要注意!!

    <form action="cgi-bin/ethip" method="post" target="nm_iframe">
    ...
    </form>

    2、在需要动态嵌入变量或文件的.shtml页面中,需要通过注释的方式定义好SSI标签,这样web服务器在发送这个页面的时候就会去匹配页面中的SSI标签,然后去执行跟SSI标签名称匹配的自定义注册好的SSI回调函数。如下,实时获取传感器数据的HTML

    <table>
    	<tr>
            <th height="50" colspan="2"><div align="center"><span class="font1">传感器实时数据</span></div><hr /></th>
    	<tr>
    	
    	<tr>
            <td class="td_left">温度:</td>
            <td class="td_right"><span class="font2"><!--#include virtual="sensor_temp" --> ℃</span></td>
    	</tr>
    	
    	<tr>
            <td class="td_left">湿度:</td>
            <td class="td_right"><span class="font2"><!--#include virtual="sensor_humit" --> %RH</span></td>
    	</tr>
    	
    	<tr>
            <td class="td_left">太阳能电压:</td>
            <td class="td_right"><span class="font2"><!--#include virtual="sensor_adc" --> mV</span></td>
    	</tr>
    	
    </table>
    

    2、功能实现

    2.1、自定义注册CGI执行函数

    需要在启动web服务器之前注册好你的CGI执行函数,我这里注册的函数如下

    以通过网页远程控制板卡为例,浏览器给web服务器发送的数据如下:

    程序解析过程如下:

    static void cgi_remotectl_handler(struct webnet_session* session)
    {
    /* defined the LED0 pin: PH2 */
    #define LED0_PIN    GET_PIN(H, 2)
    /* defined the BEEP pin: PE3 */
    #define BEEP_PIN    GET_PIN(E, 3)
      
    	struct webnet_request* request;
        const char* mimetype;  
        const char *led1,*beep,*relay;
    	char led1_value=0,beep_value=0,relay_value=0;
    		
        RT_ASSERT(session != RT_NULL);
    
        /* get mimetype */
        mimetype = mime_get_type(".html");
    
    	request = session->request;
    	
        /* set http header */
        session->request->result_code = 200;
        webnet_session_set_header(session, mimetype, 200, "Ok", -1);
    
        /* 解析 */
    	led1 = webnet_request_get_query(request, "led1");
    	beep = webnet_request_get_query(request, "beep");
    	relay = webnet_request_get_query(request, "relay");	
    	led1_value = atoi(led1);
    	beep_value = atoi(beep);
    	relay_value = atoi(relay);
    	if (led1_value) rt_pin_write(LED0_PIN, PIN_LOW);
    	else rt_pin_write(LED0_PIN, PIN_HIGH);
    
    	if (beep_value) rt_pin_write(BEEP_PIN, PIN_HIGH);
    	else  rt_pin_write(BEEP_PIN, PIN_LOW);
    }

    2.2、自定义注册SSI执行函数

    rtthread实现的webnet中只实现了在网页中嵌入文件的功能,即只识别 <!--#include file="xxx" --> 标签,需要修改下 wn_module_ssi.c 实现 <!--#include virtual="xxx" --> 标签的识别与处理。同理需要在启动web服务器之前注册好你的SSI执行函数,如上图所示。我这里以获取以太网IP地址为例,在浏览器请求 ethip.shtml 的时候,web服务器会执行注册好的回调函数

    在回调函数中直接将网卡的IP地址发送给浏览器

    static void ssi_eth_ipaddr_value_handler(struct webnet_session* session)
    {
        struct netdev *netdev = netdev_get_by_name("e0");
        webnet_session_printf(session, "%s", inet_ntoa(netdev->ip_addr));
    }

    3、页面文件上传

    开启RT-Thread 的设备虚拟文件系统后,需要将静态页面上传到文件系统中服务器的根目录下(这里根目录为 /webnet),需要依次执行下面操作:

    1、使用 mkdir webnet 命令创建 WebNet 软件包根目录 /webnet,并使用 cd webnet 命令进入该目录;

    2、使用 mkdir admin mkdir upload mkdir download命令创建 /webnet/admin/webnet/upload/webnet/download,用于 AUTH 功能、 upload 功能和download功能的测试

    3、将设计的所有网页依次上传到设备 /webnet 目录中。(可以使用 TFTP 工具上传文件,具体操作方式参考 TFTP 使用说明)

    4、启动webnet

    设备启动,网络连接成功,创建目录和上传文件成功之后,就可以启动例程,测试 WebNet 软件功能来了,过程如下:在 Shell 命令行输入 webnet_test 命令即可启动 WebNet 服务器

    msh /webnet>webnet_test
    [D/wn.log] server initialize success.
    [I/wn] RT-Thread webnet package (V2.0.0) initialize success.

    5、解决的问题

    1、在浏览器获取不到网页的问题

    获取的网页需要写成绝对地址,比如获取/webnet/frame_table.html页面时,需要写成 /frame_table.html,不能只写成 frame_table.html

    2、在提交完表单后会切换当前的页面,有时候其实是不需要切换的,还停留在当前页面。这时候可以巧妙运用 iframe,在页面中放置一个面积为0的iframe,使其跳转在iframe中完成,即实际跳转了,只是不可见

    <iframe id="id_iframe" name="nm_iframe" style="display:none;"></iframe>
    <form action="cgi-bin/ethip" method="post" target="nm_iframe">

    3、动态实时刷新页面

    <meta charset="utf-8" http-equiv="refresh" content="1">

    4、登录的时候,先判断用户名和密码,不对的话打印提示信息

    <script type="text/javascript">
    function check(form)
    {
        var a = form.username.value;
        var b = form.password.value;
    
        if (a != "admin")
        {
            alert("User name error,Please input correct user name!");
        }
        else
        {
            if (b != "admin")
            {
                alert("Pass word error,Please input correct pass word!");
            }
            else
            {
                form.submit();
            }
        }
     }
    </script>
    
    <input type="button" name="login" id="" style="position:absolute; left:48%;" value="登录" onclick="check(form)"/>

    展开全文
  • WEB服务器】什么是WEB服务器

    千次阅读 2022-02-07 16:15:10
    Web服务器一般指的是“网站服务器”,是某种驻留在因特网上的计算机程序,可以向请求终端提供服务,主要功能时存储、处理和传递网页给“客户”,传递内容一般是HTML文档、图像、样式表或脚本等,也可以放置网站文件...

    一、概述

            Web服务器一般指的是“网站服务器”,是某种驻留在因特网上的计算机程序,可以向请求终端提供服务,主要功能时存储、处理和传递网页给“客户”,传递内容一般是HTML文档、图像、样式表或脚本等,也可以放置网站文件以供浏览或下载。

           WEB服务器也称为WWW(Word Wide Web)服务器,核心功能就是提供网页信息浏览服务,严格来说Web服务器只负责处理Http协议请求,发送静态页面的内容。

            目前主流的web服务器主要是Apache、Nginx、IIS,还有较多使用的Tomcat、Jetty、WebSphere,WebLogic,Kerstrel等。下图为市场占有率历史数据,Apache占有率较高,但是在前1K网站排名中,Nginx占有率最高。

    二、Web服务器工作原理

           首先要通过TCP协议的三次握手建立与目标Web服务器的连接,然后HTTP协议生成针对目标Web服务器的HTTP请求报文,通过TCP、IP等协议发送到目标Web服务器上。HTTP协议是基于TCP协议的应用层协议,用于用户代理和服务器之间的通信,Web服务器是被动的,只有终端客户发起请求时才会响应。web服务器一般是一次请求一次回应,一问一答的工作方式:

    1. 用户代理发起资源请求,发起的通常(但不限于)是URL(统一资源标志符,Uniform Resource Identifier),发起动作类型GET/POST/DELETE/PUT等;
    2. 用户代理解析URL获取目标域名,交由DNS解析(使用者通常提供的是域名或者IP:端口);
    3. 建立TCP链接完成HTTP协商(完成双方的协议、内容格式、加密等);
    4. 用户代理把请求的内容封装成HTTP数据包发送给服务器;
    5. 服务器接收到资源请求后按照之前的协商解包数据;
    6. 服务器将用户需要的内容打包成HTTP数据包并返回给用户,完成一次工作流程。

    1、在应用层HTTP协议的基本过程

    http通信通常发生在TCP/IP连接之上,默认使用TCP协议的80端口,也就是说这一过程有:

    1. 建立连接。通过申请Socket套接字实现,用户打开一个Socket并将其绑定在端口上。
    2. 发送请求。客户端将请求发送到服务器的监听端口上完成一次请求动作。
    3. 发送响应。服务器监听请求并处理之后将响应内容消息发回客户端。
    4. 关闭连接。客户端和服务器双方关闭Socket结束TCP/IP会话。

    2、在传输层TCP协议的基本过程

           上面也说过HTTP在TCP协议上。客户端和服务器在连接、数据交互过程中需要实现的有:

    1. 服务器绑定端口&监听端口;
    2. 客户端发动请求;
    3. 服务器响应连接请求;
    4. 建立连接;
    5. 交互数据,接收或发送;
    6. 关闭通信结束会话;

    以上的2~4的三次握手和6的四次挥手。在2的时候通常包含多客户端的高并发,这也是web服务器关注的重点之一。

    三次握手建立连接

    四次挥手释放连接

    3、Web服务在服务器端的工作原理

           Web业务在服务器端主要是在干什么呢?或者说服务器自己需要做哪些事情呢?

    1. TCP监听端口,以建立和用户代理之间的连接,完成连接后,后续的HTTP请求则不再进入监听直到释放。
    2. 预处理会先从TCP报文中获取HTTP请求;依据双方协商解密解包等;服务器在依据自生配置进行安全处理。
    3. 预处理。URL+请求动作来确定用户的资源处理方式,分配到静态或动态资源处理模块。
    4. 静态资源处理模块负责检索“静态资源”,HTML/JS/CSS/图片/视频等,内容通常为字符流或者字节流。
    5. 动态资源处理模块运行业务逻辑处理,依据不同条件返回不通内容,内容形式同静态资源。
    6. 后处理。与预处理类似的发送响应信息前的准备流程。
    7. 资源输出模块把响应信息封装成HTTP报文扔到TCP中。

    说明下,静态资源和动态资源是从服务器处理信息方式或者说是响应请求内容的方式来说的。

    静态资源可以简单的理解成文本、HTML、图片、JS等,内容是固定的,无需处理、无需查询数据库就可以直接发给请求者,你要什么我就给什么。

    动态资源则是需要服务器程序进行处理,根据不同条件在页面也显示不同的数据,好处就是内容的更新不需要修改页面,缺点就是速度上没有静态资源响应快。客户端在获取动态资源,先将请求交给web的一个存储点,存储点链接数据库,数据库处理数据并发给服务器,服务器再发给客户端渲染展示。

    展开全文
  • Web服务器功能

    千次阅读 2014-06-04 17:51:55
    单线程web服务器多线程web服务器复用的I/O服务器复用的多线程web服务器 第三、处理请求 一旦web服务器收到了请求,就可以根据方法、资源和首部来对请求进行处理 第四、对资源的映射及访问 web服务器是资源服务器,
  • WEB服务器端技术

    千次阅读 2022-04-11 17:39:07
    WEB服务器端技术 客户端是与用户交互的唯一接口,对于软件测试人员来说不可掉以轻心,那么服务器端又需要我们了解哪些技术呢? 事实上,对于Web系统来说,相比于客户端技术,服务器端技术更是深不可测,其各类技术...
  • 搭建Web服务器

    千次阅读 2021-01-14 18:44:51
    搭建Web服务器 下载VMware & CentOS Linux ISO 安装Vmware虚拟机,如果安装过的同学可以跳过这一步,直接到达安装CentOS的步骤。 可以从VMware官网上下载,也可以从我的百度网盘下载,提取码:Yd5i 点击...
  • web 服务器有哪些

    万次阅读 多人点赞 2018-08-27 16:53:49
    什么是web服务器 "网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了"网络服务",即它把存储或计算环节"外包"...
  • web服务器、应用服务器和常见的服务器概念

    千次阅读 多人点赞 2020-04-17 16:36:01
    什么是web服务器,什么是应用服务器? 浏览器的编译原理是什么? http的头文件为何要这样配置? Nginx,Apache等为何要这样操作? 不同的服务器软件有什么作用? 而网上关于http的实战讲解一般都是以操作为主,涉及...
  • 文章目录网络模型TCP服务器的概念Wed服务器的概念netstate 工具嵌入式系统,常用开源Web服务器移植BOA到Ubuntu下载BOA源码传输到虚拟机进行解压编译BOA修改BOA配置文件测试BOA启动boa创建一个HTML文件并放入到www...
  • WEB服务器有哪几种

    千次阅读 2020-11-03 10:22:00
    如今的Web服务器有很多种,大家在做项目的时候根据自己的需求进行灵活的选择。下面小编就给大家分享一下目前都有哪些Web服务器。  1.Apache  Apache也被叫做httpd服务器,是目前使用最广泛的web服务器,它被应用...
  • web服务器和应用服务器以及web应用框架 web服务器: 负责处理http请求,响应静态文件,常见的有Apache,Nginx以及微软的IIS. 应用服务器: 负责处理逻辑的服务器。比如php、python的代码,是不能直接通过nginx这种...
  • 搭建Web服务器建网站的步骤

    千次阅读 2022-01-18 22:00:32
    搭建Web服务器建网站过程: 1、当然是启用功能了 window控制面板-->程序与功能-->启用或关闭Window功能,会弹出这么个界面: 选择Internet Information Services选项,按照下图图...
  • 8种最佳开源Web服务器

    千次阅读 2020-08-18 14:21:29
    自1991年发布第一台Web服务器以来,这是一段漫长的历程。长期以来,Apache是唯一值得一提的Web服务器。但是,随着时间的流逝,其他开源Web服务器也越来越受欢迎。 在本指南中,我们将介绍一些最佳的开源Web服务器更...
  • Web服务器的安装与配置

    万次阅读 多人点赞 2020-12-04 16:46:53
    Web服务器的安装与配置前言一、IIS服务器的安装与配置遇到的问题解决方法二、 Apache 的安装与配置遇到的问题解决办法三、Tomcat 的安装与配置遇到的问题解决办法四、 WAMP的安装与配置遇到的问题解决方法 ...
  • 简单介绍Web服务器的配置方法

    千次阅读 2021-08-11 10:47:21
    关于Web服务器的配置方法如果不说的具体一些的话,恐怕一些不是高手的用户就会比较难懂,因此本教程就结合实例给大家说说吧。近日,笔者将学校服务器的操作系统升级为Windows Server 2003,在Web服务器的配置过程中...
  • 使用node.js构建一个web服务器(适合自学)

    千次阅读 多人点赞 2021-10-14 14:54:02
    先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。
  • WEB服务器与应用服务器的区别

    千次阅读 2019-10-15 10:59:21
    一.简述 WEB服务器与应用服务器的区别: 1.WEB服务器: 理解WEB服务器,首先你要理解什么是WEB?WEB你可以简单理解为你所看到的HTML页面就是WEB的数据元素,处理这些数据元素的应用软件就叫W...
  • 3、常见的WEB服务器 目前,最主流的WEB服务器有以下几个: IIS Apache Tomcat Nginx 3.1 IIS服务器 Internet Information Services(简称IIS),是微软公司推出的WEB服务器组件,也是Windows Server默认,特有的...
  • 一、什么是WEB服务器  Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求Web服务器可以响应一个静态页面或图片,进行页面跳转或者把动态响应...
  • 主机访问虚拟机Web服务器

    千次阅读 2021-01-04 16:24:04
    ①主机访问虚拟机Web服务器 基本步骤(虚拟机上启动httpd): 1、安装httpd:yum install httpd 2、启动httpd:systemctl start httpd.service 3、关闭firewall:systemctl stop firewalld.service 设置虚拟机...
  • 今天分享一下从搭建web服务器,到向服务器发送图片,以及加载图片的整体实现。 因为是Demo演示,所以尽可能的简单、详细且实用,有什么错误敬请指正。 先看一下效果图: 文章参考:Unity向Web服务器上传和下载图片 ...
  • IIS Web服务器的安装与配置

    万次阅读 2022-02-24 16:45:40
    1、打开控制面板,搜索“程序与功能”; 2、点击进入“程序和功能”,选择“启用和关闭Windows功能”; 3、点击“启用或关闭Windows功能”,弹出小窗口,找到“Internet Information Services”,选择如下...
  • Web服务器的分类及常见的web服务器

    千次阅读 2019-01-11 12:29:27
    web服务器的分类 管理静态内容的 - 网页内容一旦设计好,就不能在运行过程中改变 常见的 apache, nginx 80 管理动态内容的 - 可以根据用户的不同,展示不同的网页,或是内容来自于数据库(交互) java 编写的: ...
  • 免费web服务器Tomcat

    万次阅读 2021-08-02 05:48:21
    轻量级简单web服务器 Tomcat简述Tomcat是什么?下面这段是对Tomcat的一个百度解释:Tomcat三协议:说白了Tomcat就是一个web服务器,主要用于网页制作的使用应为它的免费开源、大多数的协议规范都能在上面实现所以用...
  • Java中常用WEB服务器和应用服务器

    万次阅读 2018-06-29 15:20:31
    一、web服务器和应用服务器的区别 Web服务器传送页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是...
  • 如何搭建自己的本地服务器,Web服务器

    万次阅读 多人点赞 2020-08-21 16:53:11
    搭建本地服务器,Web服务器——保姆级教程! 本文首发于https://chens.life/How-to-build-your-own-server.html。 先上图!大致思路就是如此。 前言 暑假因为疫情在家无事可做,便白嫖了阿里云大半年的虚拟主机。...
  • Web服务器是什么意思?

    千次阅读 2020-12-22 10:36:05
    Web服务器是什么意思?...Web服务器,也称为“WWW服务器”( 英文全写:World Wide Web,翻译成中文:万维网或环球信息网 ),主要功能是“提供网上信息浏览服务”。 WWW 是Internet(互联网)的多媒体信息查询工具
  • Web应用程序  (1)什么是Web应用程序  应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览 器端/服务器端应用程序,这类应用程序一般借助浏览器来运行。 ...
  • c++实现简单的web服务器搭建

    千次阅读 2021-01-25 16:33:22
    本文使用c++ socket编程进行简单的web服务器搭建,出来了GET请求

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,082,211
精华内容 432,884
关键字:

web服务器功能