手写走通HTTP server 第二版本
HTTP server 2.0
1 接收客户请求
2 解析客户端请求
3 组合数据,形成HTTP response
4 将数据发送给客户端
升级 :
1 多线程接收客户端请求
2 基本的请求解析,根据请求返回数据(相应内容)
3 除了可以请求静态网页,也可以请求简单的数据
4 将功能封装在一个类中
#coding = utf-8
'''http 2.0
1多线程并发
2可以请求简单数据
3能进行简单请求解析
4结构使用类进行封装
'''
import socket, os, sys, traceback
from threading import Thread #封装具体的服务器功能
class HTTPserver(object):
def __init__(self,server_addr,server_static_dir):
self.server_addr = server_addr
self.server_static_dir = server_static_dir
self.ip = server_addr[0]
self.port = server_addr[1]
self.create_socket() def create_socket(self):#创建
self.sockfd = socket.socket()
self.sockfd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sockfd.bind(self.server_addr) def serve_forever(self):#启动
self.sockfd.listen()
print('listen the prot:%s' % self.port)
while True:
try:
confd, addr = self.sockfd.accept()
except KeyboardInterrupt:
self.sockfd.close()
sys.exit('服务器退出')
except Exception:
traceback.print_exc()
continue
# 创建新的线程处理请求
t = Thread(target=self.handle, args=(confd,))
t.Daemon = True
t.start() def handle(self, confd):
# 接收客户端请求
data = confd.recv(1024) # 解析请求内容
dataHeader = data.splitlines() # 获取具体请求内容
getRequest = str(dataHeader[0]).split(' ')[1]
urls = ['/','/index','/index_1','/index_2']
if getRequest == '/' or getRequest[-5:] == '.html':#获取主页
print('已进行来')
self.get_html(confd)
elif getRequest in urls: #获取下级页面
self.get_data(confd,getRequest)
else:
self.error_(confd)
confd.close() def get_data(self, confd,getReques):#获取页面数据
getReques = getReques.split('/')[1]
path =os.path.join(self.server_static_dir,getReques)
print(path)
with open(path+'.html','r') as f:
data = f.read()
response = 'HTTP/1.1 200 OK\r\n'
response +='\r\n'
response +=data
confd.send(response.encode()) def error_(self,confd):#出错处理
response = 'HTTP/1.1 404 NOT FUOUND\r\n'
response += '\r\n'
responseBOdy = 'SORRY,NOT PAGE'
response += responseBOdy
confd.send(responseBOdy.encode()) def get_html(self,confd):#首页处理
with open('index.html','r') as f:
data = f.read()
#print(data)
xieyi = 'HTTP/1.1 200 OK \r\n'
xieyi += '\r\n'
xieyi += data
confd.send(xieyi.encode()) if __name__ == '__main__':
server_addr = ('127.0.0.1', 8080)#地址
server_static_dir = os.getcwd()#静态页面目录 #生成对象
httpd = HTTPserver(server_addr, server_static_dir) #启动服务器
httpd.serve_forever()
手写走通HTTP server 第二版本的更多相关文章
- 手写走通HTTP server 第三版本
后台 后端 服务端 功能:逻辑处理 算法处理 磁盘交互(数据库 静态文件处理) 要求:健壮性,安全性 并发性能和处理速度 架构合理便于维护扩展 网站后端 httpserver + WebFr ...
- 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类
手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...
- 手写koa-static源码,深入理解静态服务器原理
这篇文章继续前面的Koa源码系列,这个系列已经有两篇文章了: 第一篇讲解了Koa的核心架构和源码:手写Koa.js源码 第二篇讲解了@koa/router的架构和源码:手写@koa/router源码 ...
- java24 手写服务器最终版本
手写服务器最终版本; <?xml version="1.0" encoding="UTF-8"?> <web-app> <serv ...
- -手写Spring注解版本&事务传播行为
视频参考C:\Users\Administrator\Desktop\蚂蚁3期\[www.zxit8.com] 0018-(每特教育&每特学院&蚂蚁课堂)-3期-源码分析-手写Spri ...
- 手写一个类SpringBoot的HTTP框架:几十行代码基于Netty搭建一个 HTTP Server
本文已经收录进 : https://github.com/Snailclimb/netty-practical-tutorial (Netty 从入门到实战:手写 HTTP Server+RPC 框架 ...
- 基于TensorFlow的手写中文识别(版本一)
具体效果实现: 第一次由于设备问题所以只训练了是一些个简单的字: 第二选了23个字训练了3000在字迹清晰下能够识别: 类似于默,鼠,鼓,这类文字也能识别,由于训练数据的问题,在测试的时候应尽量写在正 ...
- win10下通过Anaconda安装TensorFlow-GPU1.3版本,并配置pycharm运行Mnist手写识别程序
折腾了一天半终于装好了win10下的TensorFlow-GPU版,在这里做个记录. 准备安装包: visual studio 2015: Anaconda3-4.2.0-Windows-x86_64 ...
- 阿里第二轮面试:手写Java二叉树
阿里面试 现在很多公司在招聘开发岗位的时候,都会事先在招聘信息中注明面试者应当具备的知识技能,而且在面试的过程中,有部分对于技能掌握程度有严格要求的公司还会要求面试者手写代码,这个环节很考验面试者的基 ...
随机推荐
- thinkphp5 更改入口文件在主目录
默认thinkPHP入口文件在public/index.php,而在虚拟主机部署时,不能设置访问路径,因此需要将入口文件放置在主目录上. 一.主目录下新建index.php 复制以下内容 // 定义应 ...
- 关于react中遇到的问题记录说明
5.el表达式 dataSource = (userPage, orgList) => userPage.map(item => { const org = orgList.find(or ...
- Python 零基础知识学习
在开始学习Python之前,首先进入python shell ,输入:import this 命令,如下图所示: Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Py ...
- Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率
目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:第一步:将输入的数据复制一份到缓冲区,供OpenGL使用.而这块新出现的区域由VBO管理和表示.(若有多个输入 ...
- get_object_var 返回一个数组
语法:get_object_var($object),返回一个数组.获取$object对象中的属性,组成一个数组 实例: <?php class person{ public $name=&qu ...
- Charles系列三:Charles打断点(包含修改请求,修改返回的内容),模拟慢速网络(弱网测试),域名映射,过滤请求,接口调试,打压测试
一:Charles断点的使用(包含修改请求,修改返回的数据) 设置断点来修改请求和返回的数据,在开发过程中可以模拟多种响应.步骤如下: 1.添加断点方法有两种: 方法1:找到Charles中菜单项Pr ...
- 导入/导出 数据库/数据库表(wordpress做例子)
导入数据库: 1. 数据库层面: 没有wordpress的情况下,建立wordpress数据库 create database wordpress; 进入wordpress数据库 use wordpr ...
- eXosip的register注册
转载于:http://blog.sina.com.cn/s/blog_4868f98601018ioh.html 这个测试程序是从eXosip原有的测试程序改造的.原程序是tools 目录下的 sip ...
- Hystrix的概念
Netflix的 Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力. Hystrix的设计原则包括:资源隔离.熔断器.命令模 ...
- Linux系列(13)之程序与服务的概念
知道如何区分程序与进程吗? 知道如何产生进程吗? 知道进程之间的相关性吗? 知道进程调用的流程吗? 知道进程与服务的区别吗? 1.程序与进程的区别 bash就是一个程序,当我们登录之后系统就会给我们分 ...