-
基于STM32F429使用RT-Thread实现web服务器功能
2020-10-26 22:52:44目录 参考示例 前言 一、需使用的组件与软件包及其ENV配置 1、文件系统相关组件与软件包 1.1、DFS 框架 1.2、fal 软件包 1.3、SFUD 组件 2、网络通信相关组件和软件包 ...三、web服务器开发基础 1、HTTP简介目录
参考示例
前言
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_SPI和BSP_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 服务器功能模块设计(部分实现)
2017-01-03 13:27:43认准一件事后,就朝着这一件事走.做一个httpserver服务器,完整的代码,完整的设计.每个程序员都应该尝试下写博客 ...今天确定下web server的框架.linux下使用libevent作为基础框架来搭建这个web serve正好这段时间多,公司没啥项目.做一个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/598041.先看完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服务器的功能
2014-06-04 17:51:55单线程web服务器多线程web服务器复用的I/O服务器复用的多线程web服务器 第三、处理请求 一旦web服务器收到了请求,就可以根据方法、资源和首部来对请求进行处理 第四、对资源的映射及访问 web服务器是资源服务器,第一、建立连接
接受一个客户端连接
第二、接受请求报文
web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来
web服务器处理结构分类:
- 单线程web服务器
- 多线程web服务器
- 复用的I/O服务器
- 复用的多线程web服务器
第三、处理请求
一旦web服务器收到了请求,就可以根据方法、资源和首部来对请求进行处理
第四、对资源的映射及访问
web服务器是资源服务器,负责发送预先创建好的资源
第五、构建响应
web服务器识别出资源后,就执行请求方法中描述的动作,并且构建响应状态码、响应首部、响应主题
响应报文通常包括:
- MIMEL类型的content-type
- content-length
- 实体内容
重定向:
web服务器有时会返回重定向响应而不是成功的报文,可以将浏览器重定向到其他地方去执行请求,状态码是3XX,重定向可能出现如下几种情况:
1.永久搬离的资源 ,状态码是301
2.临时搬离的资源,如果资源被临时移走或重命名,服务器可能希望将客户端重定向到新的位置上去,但因为是临时的,服务器希望客户端仍然会使用老的URL,并且收藏夹的url也不会发生变化,返回303状态码
第六、发送响应
服务器跟客户端会有多个连接,有些事空闲的,有些事持久的,对非持久连接,发送报文后,应该关闭。
对于持久连接,要正确地计算content-length,否则客户端就不知道什么时候响应结束了,因为多个HTTP请求在一个TCP连接上跑,对于多媒体类型,用分块传输的方式,如果content-length错误,事务处理的另一端就无法精确地检测出一条报文的结束和另一条报文的开始
第七、记录日志
-
搭建web服务器OTA功能
2018-03-28 14:51:12网上已经有很多搭建的方式了,我这里用最简单的方法搞定下载功能 ...搭建web服务器下载功能: 首先下载apache:sudo apt-get install apache 然后 sudo vim /etc/apache2/sites-available/000-default.con...网上已经有很多搭建的方式了,我这里用最简单的方法搞定下载功能
对IOT产品的开发一个必不可少的功能就是设备的OTA功能,因为完美的程序员,很多产品随着时间更加的优化,等等
搭建web服务器下载功能:
首先下载apache:sudo apt-get install apache
然后 sudo vim /etc/apache2/sites-available/000-default.conf
请注意在下面不换行
DocumentRoot /var/www/html<Directory /var/www> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory>
接着修改目录权限:sudo chmod -R 775 /var/www
由ubuntu的IP地址通过浏览器进入,可以直接进入到了apache的欢迎页面,然后在/var/www目录下可以添加任意的文件开始注意了,这个时候会发现文件除了bin 文件别的都是只能网页打开的,像压缩文件、txt、7z文件都不能进行下载。
解决方法:在 /etc/mime.types 找到这个选项application/octet-stream 在后面添加文件后缀比如 7z等格式就可以下载了(要sudo service apache2 restart)
/etc/mime.types 是apache很重要的文件配置,很多文件格式都在里面,具体的请百度
-
c#实现Web服务器
2014-10-31 18:23:49学习C#时,经常会遇到Web服务器功能的程序设计问题,这里将介绍C#实现Web服务器功能的程序设计问题的解决方法。 C#实现Web服务器功能的程序设计 根据HTTP协议的作用原理,实现GET请求的Web服务器程序的方法... -
扩展 Tomcat Web 服务器的功能
2014-03-05 14:42:23尽管 Apache Tomcat 的实现与其他 Web 服务器略有不同,但是本教程为许多高级管理任务提供了一种符合逻辑且简洁的执行方法,有助于成功地驻留、部署和管理多个 Java™ 2 Platform, Enterprise Edition(J2EE)Web ... -
基于WEB服务器CGI接口实现留言板功能
2016-12-06 19:57:33WEB服务器CGI接口功能的实现 -
Web服务器和应用服务器
2013-01-27 14:09:58WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。正是因为有了WWW... -
Win10 IIS Web服务器安装与配置
2018-01-04 21:53:00这几天课程实训,使用 IIS 配置服务器,课本上内容太久,老师也没有讲过,自己摸索了一下,所以记录一下 安装 IIS 打开程序和功能,选择左边启用或关闭 Windows 功能,建议根据下图勾选,确定后等待安装完成 打开 ... -
WEB服务器
2011-12-24 15:59:55WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。正是因为有了WWW... -
WEB服务器与应用服务器
2015-06-15 21:50:39Web服务器(Web Server)通俗的讲,Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主 要支持的协议就是HTTP,所以通常情况下HTTP... -
功能服务器比拼大擂台――Web服务器篇
2005-10-26 19:19:00笔者曾在 《Web服务器选购指南》 一文中简要地介绍了在选购Web服务器方面应注意的事项。 本篇着重要介绍的是对几款典型Web服务器进行综合比较,通过一些Web服务器测试方法总结出其选购原则。 本篇所要介绍的几款W -
如何使用nodejs创建Web服务器
2017-06-04 17:03:33Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL,与客户端的网络浏览器配合。 大多数 web 服务器都... -
WEB服务器、应用程序服务器、HTTP服务器区别
2019-08-29 10:12:37WEB服务器、应用程序服务器、HTTP...Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTT... -
Web服务器、HTTP服务器及应用服务器的区别?
2018-07-17 12:49:10Web服务器是指驻留在Internet上的计算机程序,它的基本功能是提供Web信息浏览服务。因为Web服务器主要支持的协议就是HTTP协议,所以通常情况下WEB服务器和HTTP服务器说的是同一回事。应用服务器是指通过各种协议把商... -
web服务器排名
2018-05-29 18:21:07(1)ApacheApache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自"a patchy ... -
WEB服务器与应用服务器区别
2019-08-13 22:23:04版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。...通俗的讲,Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户... -
web服务器与应用服务器
2012-03-15 18:04:21关于应用服务器和web服务器的整合,有很多的资料了,可是都讲的半生不熟的。根据这几天整合tomcat 和 iis 的经验,再次聊聊这个话题。 首先我们应该对应用服务器和web服务器有一个清晰的概念。所谓的应用服务器... -
应用服务器和web服务器的区别
2018-07-19 10:48:46Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主 要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的(有没有... -
区分Web服务器、HTTP服务器、应用程序服务器
2018-04-04 16:58:08在学习前端的过程中。进程听到和看到web服务器、HTTP服务器、应用程序服务器,但一直不知道它们有什么区别,迷惑...其主要功能是传送页面使浏览器可以浏览,又因为它主要支持HTTP协议,所以通常情况下web服务器和HT... -
web服务器、应用服务器、web应用框架的关系
2018-08-03 14:53:15web服务器:负责处理http请求,响应静态文件,常见的有Apache,Nginx以及微软的IIS. 应用服务器:负责处理逻辑的服务器。比如php、python的代码,是不能直接通过nginx这种web服务器来处理的,只能通过应用服务器来... -
如何在WEB服务器上配置SSI功能
2007-01-05 11:58:00如何在我的WEB服务器上配置SSI功能?在一些WEB服务器上(如IIS 4.0/SAMBAR 4.2),包含 #include 指令的文件必须使用已被映射到 SSI 解释程序的扩展名;否则,Web 服务器将不会处理该SSI指令;默认情况下,扩展名 .... -
web服务器、应用服务器、http服务器区别
2013-05-21 23:21:17Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的(有没有 -
无法再web服务器上启动调试,web服务器未能找到请求资源
2018-11-19 18:29:20无法再web服务器上启动调试,web服务器未能找到请求资源,出现此问题,排除过其他解决方案,最有可能问题是自己的window关闭或者打开功能,某些关闭掉了,重新设置下就可以。我的电脑是win10,win7自己百度; ... -
常见web服务器
2013-08-13 14:29:33Web服务器也称为WWW CWORLD WIDE WEB)服务器、HTTP服务器,其主要功能是提 供网上信息浏览服务。 Unix和Linux平台下的常用Web服务器有Apache,Nginx,Lighttpd,Tomcat,IBM WebSphere 等,其中应用最广泛的是...
-
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
2014年重庆理工大学《计算机网络基础A》期末考试试卷.pdf
-
Navicat Premium.rar
-
Anaconda换国内源2021最新攻略,请别清华源啦!来试试北京外国语大学的源吧~
-
人事管理系统-Java类代码资源
-
前后端socket通信.zip
-
如何在python idle中能够一键清屏.zip
-
春江水暖鸭先知.zip
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
2014年重庆理工大学《软件质量保证与测试》两套期末考试试卷.pdf
-
云开发后台+微信扫码点餐小程序+cms网页管理后台 含后厨端和用户端
-
C++ 判断字符串是否是整数或浮点数
-
基于微信的同城小程序、校园二手交易小程序 毕业设计毕设源码使用教程
-
嵘泰股份首次公开发行股票招股说明书.pdf
-
MySQL 管理利器 mysql-utilities
-
IDEA maven plugin Cannot resolve symbol ‘xxx‘问题解决
-
2014年重庆理工大学《物联网技术导论》期末考试试卷.pdf
-
区块链公开课(上).pdf
-
FactoryTalk View StudioV10.0备份HMI步骤.docx
-
MySQL 高可用工具 DRBD 实战部署详解