众所周知,Http协议是基于Tcp协议的基础上产生的浏览器到服务器的通信协议 ,其根本原理也是通过socket进行通信。

使用HTTP协议通信,需要注意其返回的响应报文格式不能有任何问题。

响应报文,一共包括4个部分,分别是响应行,响应头,空行,响应体,并且每项数据之间必须使用/r/n隔开。

空行是区分响应头和响应体的必要数据,不能省略。

HTTP静态Web服务器主要开发思路如下:

1.导入socket模块

2.创建socket对象

3.设置端口复用,解决端口阻塞问题

4.绑定端口及ip,在绑定端口及IP后,客户端只能通过绑定的IP及端口给服务器发送请求报文。

5.设置监听,

注意:设置监听成功后,原socket变成被动套接字,不能够进行数据的收发。

6.等待客户端(浏览器)链接(发送请求)

7.使用链接成功后返回的新socket进行数据的收发。

注意:此处返回数据应为HTTP响应报文。

 # 1.导入模块
import socket def main():
# 2.创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3.设置端口复用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 4.绑定端口
server_socket.bind(('', 8001))
# 5.设置监听
server_socket.listen(128)
# 设置循环接收客户端连接,实现多客户端连接
while True:
# 6.接收客户端连接
client_socket, ip_port = server_socket.accept()
print("客户端:%s 上线了,使用端口为:%s" % ip_port)
# 7.接收数据
recv_data = client_socket.recv(1024).decode('utf-8')
if recv_data:
# print('接收的数据为:', recv_data)
# 获取http请求报文中的指定路径
# split()方法不指定参数时,默认以空白字符(\t,\n,空格)分割
# 获取到的路径信息分割后,会形成三部分存放到列表中
# 1.请求提交的方式:GET/POST
# 2.请求路径信息及参数信息
# 3.HTTP协议及版本
page_recv_data = recv_data.split()[1]
print('请求的资源路径为:', page_recv_data)
# 判断接受到的路径信息是否包含参数
# HTTP协议中,参数格式为:/index.html?name=666&age=12
if '?' in page_recv_data:
real_recv_page = page_recv_data.split('?')[0]
else:
real_recv_page = page_recv_data
try:
# 8.发送数据 # 接收指定的路径信息,并读取文件信息
# 注意f-string只能在3.6及以上版本使用
data = f'static{real_recv_page}'
print(data)
with open(data, 'rb') as file:
page_data = file.read()
except Exception as e:
# 8.1 当文件不存在时,编写HTTP协议如下格式:
http_line = 'HTTP/1.1 / 404 NOT FOUND\r\n'
http_header = 'Server: PWS/1.0\r\n'
http_body = '<h1>Page Not Found!</h1>'
send_data = (http_line + http_header + '\r\n' + http_body).encode()
client_socket.send(send_data)
else:
# 8.1 当文件存在时,编写HTTP协议如下格式:
http_line = 'HTTP/1.1 / 200 ok\r\n'
http_header = 'Server: PWS/1.0\r\n'
send_data = (http_line + http_header + '\r\n').encode() + page_data
client_socket.send(send_data)
finally:
# 断开与客户端连接
client_socket.close()
else:
print('客户端:%s,端口号:%s 下线了' % ip_port)
break # 9.关闭套接字
# 关闭服务器
# server_socket.close() # 入口
if __name__ == '__main__':
main()

Python之HTTP静态Web服务器开发的更多相关文章

  1. 04-HTTP协议和静态Web服务器

    一.HTTP协议(HyperText Transfer Protocol)     超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...

  2. 超简易静态Web服务器

    使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar

  3. python网络-静态Web服务器案例(29)

    一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...

  4. 第十八篇:简易版web服务器开发

    在上篇有实现了一个静态的web服务器,可以接收web浏览器的请求,随后对请求消息进行解析,获取客户想要文件的文件名,随后根据文件名返回响应消息:那么这篇我们对该web服务器进行改善,通过多任务.非阻塞 ...

  5. Harp – 内置常用预处理器的静态 Web 服务器

    Harp 是一个基于 Node.js 平台的静态 Web 服务器,内置流行的预处理器,支持把 Jade, Markdown, EJS, Less, Stylus, Sass, and CoffeeSc ...

  6. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  7. python超简单的web服务器

    今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py   1 2 3 #!/usr/bin/python import Simp ...

  8. python自带的web服务器

    python自带的web服务器 python自带的包可以建立简单的web服务器 BaseHTTPServer 提供基本的web服务和处理类 SimpleHTTPServer 包含执行get请求的Sim ...

  9. 用HTTP核心模块配置一个静态Web服务器

    静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...

随机推荐

  1. PyCharm安装及使用教程

    1  PyCharm下载 PyCharm的下载安装非常简单,可以直接到Jetbrains公司官网下载,具体步骤如下: (1)打开Pycharm官网http://www.jetbrains.com,选择 ...

  2. 苹果审核ipv6海外解决思路-About APP Store

    原始简书文章地址(也是我自己的) 首先声明,一我不负责涉及你们内部服务器. 二是好好读文章,别人能过,你们也能过 苹果6月1日出的IPV6协议阻碍了国内大多数积极开发者,我司也不外乎,经过三次被拒后, ...

  3. thinkphp5.1长连接-单例模式测试!

    在控制器中  使用以下代码测试 for ($i = 0; $i < 1000; $i++) { $tmp['name'] = 'f_'.$i; $tmp['times'] = date('Y-m ...

  4. 过滤广告(只能发布 [a-zA-z0-9及汉字,;?.]) ,排除其他特殊符号

      /** * 过滤广告(只能发布 [a-zA-z0-9及汉字,;?.]) ,排除其他特殊符号 * Created by 1 on 2015/8/19. */ public class FilterA ...

  5. MBR分区表的备份与还原

    MBR分区表的备份与还原 MBR分区的存储 从下图可以看出,MBR分区前446字节是boot loader:接下来64字节是分区表:再然后就是三个主分区加一个拓展分区. 一.备份分区表,要跳过前446 ...

  6. 深入理解计算机系统 第八章 异常控制流 Part1 第二遍

    第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 500~507 页,共 8 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/101651 ...

  7. SpringBoot 源码解析 (三)----- Spring Boot 精髓:启动时初始化数据

    在我们用 springboot 搭建项目的时候,有时候会碰到在项目启动时初始化一些操作的需求 ,针对这种需求 spring boot为我们提供了以下几种方案供我们选择: ApplicationRunn ...

  8. 一个ip, 两个域名, 两个ssl, 访问多个不同的项目

    在前面一篇中说过, 入了好几个坑. 后来使用了nginx+tomcat配置的方式. 终于成功了. 因为头一次使用nginx, 不知道具体怎么操作, 于是我在操作的时候, 按照以下几个步骤执行的: 导航 ...

  9. hdu 5901 Count primes (meisell-Lehmer)

    Count primes Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  10. nyoj 74-小学生算术(进位问题)

    74-小学生算术 内存限制:64MB 时间限制:3000ms 特判: No 通过数:23 提交数:53 难度:1 题目描述: 很多小学生在学习加法时,发现“进位”特别容易出错.你的任务是计算两个三位数 ...