import socket
import re
import os
import sys# 由于前面太繁琐,可以用类封装一下,也可以分几个模块
class HttpServer(object):def __init__(self,port):# 1、服务器创建负责监听的socketself.socket_watch = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2、设置地址重用self.socket_watch.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 3、绑定监听的端口self.socket_watch.bind(('', port))# 4、设置监听队列self.socket_watch.listen(128)def handle_client(self,socket_con):"""接收来自客户端的请求,并接收请求报文,解析,返回"""# 1、服务器接收客户端的请求报文request = socket_con.recv(4096).decode()# 2、截取请求报文,获取请求行request_lines = request.split("\r\n")# 3、获取请求行request_line = request_lines[0]# GET /a/ab/c.html HTTP/1.1# 通过正则表达式 匹配出请求行中请求资源路径res = re.match(r"\w+\s+(\S+)",request_line)# 获取资源路径path = res.group(1)# 将资源路径和我的web文件夹的绝对路径拼接(自己填写)path ="# 本地绝对路径" + path# 在判断是文件还是文件夹之前,首先要判断你这个路径在服务器中是否存在if not os.path.exists(path):response_line = 'HTTP/1.1 404 Not Found\r\n'response_head = 'Server:skylark 2.0\r\n'response_head += 'Content-type:text/html;charset=utf-8\r\n'response_body = '你请求'+ path +'不存在'response = response_line + response_head + '\r\n' +response_bodysocket_con.send(response.encode())socket_con.close()returnelse:# 判断用户请求的是文件还是文件夹if os.path.isfile(path):# 如果文件存在 读取页面数据,然后返回response_line = "HTTP/1.1 200 OK\r\n"response_head = "Server:skylark 2.0\r\n"# 注意请求图片需要使用"rb"的方式进行读取file = open(path,"rb")# response_body 是二进制所以不用再次编码response_body = file.read()response = response_line.encode() + response_head.encode() +"\r\n".encode() +response_bodysocket_con.send(response)socket_con.close()returnelse:if path.endswith("/"):# 例如 www.baidu.com/images# 用户请求的文件夹# 1、判断该文件夹下是否有默认的文件,如果有,则返回,如果没有# index.html default.htmldefault_document = False# 如果允许你访问我目录下的默认文档if default_document:# 判断用户访问的文件夹下是否有index.html 或者 default.htmlif os.path.exists(path + '/index.html'):response_line = 'HTTP/1.1 200 OK\r\n'response_head = 'Server:skylark 2.0\r\n'file = open(path+'/index.html', 'rb')response_body = file.read()response = response_line.encode() + response_head.encode() +'\r\n'.encode()+response_bodysocket_con.send(response)socket_con.close()returnelif os.path.exists(path + '/default.html'):response_line = 'HTTP/1.1 200 OK\r\n'response_head = 'Server:skylark 2.0\r\n'file = open(path + '/default.html', 'rb')response_body = file.read()response = response_line.encode() + response_head.encode() + '\r\n'.encode() + response_bodysocket_con.send(response)socket_con.close()returnelse:# 访问的目录下,既没有index.html 也没有default.htmlresponse_line = 'HTTP/1.1 404 Not Found\r\n'response_head = 'Server:skylark 2.0\r\n'response_head += 'Content-Type:text/html;charset=utf-8\r\n'response_body = 'index.html 或者 default.html 不存在'response = response_line +response_head +'\r\n' +response_bodysocket_con.send(response.encode())socket_con.close()# 2、判断服务器是否开启了目录浏览else:# 判断你是否开启了目录浏览dir_browsing = Trueif dir_browsing:# 把用户请求的文件夹中所有的文件和文件夹以目录的形式返回到页面中# 获取用户请求的文件夹list_names = os.listdir(path)response_line = 'HTTP/1.1 200 OK\r\n'response_head = 'Server:skylark 2.0\r\n'# 动态的拼接页面,将目录中的文件或者文件夹的名称以HTML页面的方式返回给浏览器response_body = '<html><head><body><ul>'for item in  list_names:response_body +="<li><a href = '#'>"+item+"</a></li>"response_body+='</ul></body></head></html>'response =response_line + response_head +'\r\n' +response_bodysocket_con.send(response.encode())socket_con.close()returnelse:# 用户请求的路径没有斜线# 重定向到+斜线的目录下response_line = 'HTTP/1.1 302 Found\r\n'response_head = 'Server:skylark 2.0\r\n'response_body = 'redirect'+ path +'/'response = response_line +response_head +'\r\n' +response_bodysocket_con.send(response.encode())socket_con.close()def run_server(self):# 5、通过循环,不停的接收来自客户端的连接请求while True:socket_con, con_adds = self.socket_watch.accept()# 注意将con_adds转成字符串print('客户端:%s连接成功!!!' % str(con_adds))# 接收来自客户端的请求,并接收请求报文,解析,返回self.handle_client(socket_con)def main():# sys.argv方法的用法如下:# 在终端输入 python3 面向对象封装的web服务器.py 8888# 在使用解释器执行任意py文件的时候,可以传入不止一个参数,会以字符串的形式用列表保存起来# 但是列表的第一个参数[0]位是它自己。所以传入的参数是从[1]第二位开始的# 所以在上面输入8888以后,调取这个列表的[1]下标就会传入这个8888作为进到下面的代码# 再转换一下类型为int就相当于用户指定端口了port = int(sys.argv[1])http_server = HttpServer(port)http_server.run_server()if __name__ == '__main__':main()

  

-------  知识无价,汗水有情,如需搬运请注明出处,谢谢!

面向对象封装的web服务器相关推荐

  1. Python基础 3.4 HTTP协议和静态Web服务器

    HTTP协议和静态Web服务器 3.4.1 HTTP协议 1.HTTP协议介绍 全程:超文本传输协议 作用:规定浏览器和web服务器通信的数据格式 HTTP协议是在应用层的协议,基于传输层的TCP传输 ...

  2. nodejs项目实战教程08——创建静态Web服务器

    nodejs项目实战教程08--创建静态Web服务器 什么是Web服务器 目标 1. 访问web服务器上面的网站 1.1 创建服务器 1.2 读取服务器上的资源文件 2. 下载web服务器上的文件 方 ...

  3. python多任务、面向对象、命令行启动动态绑定端口号静态web服务器代码实现

    一.静态web服务器-多任务 多任务web服务器:使用多线程,比进程更节省资源,支持多用户同时访问,可以同时处理多个客户端请求 实现步骤 若客户端与服务端建立连接,则创建子线程,使用子线程处理客户端请 ...

  4. jquery封装的ajax方法获取web服务器时间

    解决方案: Ajax HTTP Head法 原理: 一般服务器在发送静态页面的时候(apache, nginx, lighttpd就目前所知)都是会在 HTTP 头里带一个Date的头信息的,那么我用 ...

  5. javascript对XMLHttpRequest异步请求的面向对象封装

    对XMLHttpRequest异步请求的面向对象封装,需要的朋友可以参考下 function CallBackObject() { this.XmlHttp = this.GetHttpObject( ...

  6. Linux下Web服务器开发

    代码下载地址:http://download.csdn.net/detail/u010959074/9572149 以下是项目介绍. 学习提示: 1. 在"桌面环境"中动手练习,若 ...

  7. web服务器理解和重要性

    认识web服务器? 我们作为程序员在pycharm中开发的AI项目,项目开发好了,只能在自己电脑运行成功,但是如何供各地的每个用户使用? 这就像百度一样,客户在浏览器通过www.baidu.com就能 ...

  8. iOS网络构架 与 web服务器 (三次握手)

    iOS中的网络构架 (从上层到下层依次为Cocoa\Web Kit\Core Foundation\OS\Hardware) Cocoa (面向对象的框架集) 包含基于OC的API Cocoa层是基 ...

  9. 2021年大数据ELK(二十二):采集Apache Web服务器日志

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 采集Apache Web服务器日志 一.需求 二.准备日志数据 三.使用Fil ...

最新文章

  1. 人工智能产业发展深度报告:格局、潜力与展望
  2. mysql巡检常用命令_mysql 常用命令
  3. AVL树---最简单的实现
  4. 学习python-day1
  5. iphone屏幕镜像如何全屏_苹果手机屏幕镜像如何连接电视
  6. 网站访问速度优化之二 - JS和CSS优化
  7. 【实战】SpringBoot整合多数据源
  8. php面试题之四——PHP面向对象(基础部分)
  9. Jmeter遇到打不开的问题
  10. 凹凸贴图、法线贴图、置换贴图
  11. 曲线之美(一)贝塞尔曲线
  12. 10 道 OOP 方面的 Java 面试题,祝你跳槽涨薪一臂之力
  13. java 汇编_大话+图说:Java 汇编指令——只为让你懂
  14. 794. 有效的井字游戏
  15. Bode Plots by Hand 徒手绘制波特图
  16. 让爱永不过期,三公仔给你“旧药换新”
  17. 北京拓保世纪:以硬技术为根本,用专业力量传递价值!
  18. 0711 - 在 iPic 周岁时,说说这款让我骄傲的产品
  19. CSS 滚动条: 自定义滚动条样式
  20. 强大的Http监控工具Fidder

热门文章

  1. Java HashSet的元素内容变化导致的问题
  2. VMWare File Format Learning Use VHD File To Boot VMWare CoreOS Docker Configuration And Runnin...
  3. 联想Z5 Pro划时代旗舰发布,屏占比95.06%售价1998元起
  4. owncloud搭建过程
  5. 0145129实验报告(五)
  6. tomcat中多个域名配置
  7. Windows 7安装Virtual Server 2005 R2 SP1
  8. 跨行业的Java程序员——农民造出了飞机,难道还是农民
  9. Q91:真实地模拟透明材质(Realistic Transparency)
  10. 语义化标签——HTML