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()





最新文章

  1. RNN 入门教程 Part 2 – 使用 numpy 和 theano 分别实现RNN模型
  2. mac os x安装ngigx+php fastcgi+mysql+memcache详细流程
  3. ISO/IEC 9899 C语言标准(非官方翻译)
  4. 集合的知识点梳理(List,Set,不包含泛型)
  5. SpringMVC静态资源处理[转]
  6. 恒天云 3.0:打造基于OpenStack的私有云新模式
  7. 特定用户QQ群聊天记录导出的实现
  8. linq 多条件查询 where 拼接+分页
  9. eclipse 编辑 python 中文乱码的解决方案
  10. PHPSTORM实用快捷键
  11. ExtJs4 笔记(10) Ext.tab.Panel 选项卡
  12. ASP.NET MVC应用程序使用异步及存储过程
  13. qrcode生成二维码插件
  14. JAVA - 深入JAVA 虚拟机 3
  15. Python基础之模块、数据类型及数据类型转换
  16. 移动端300ms点击事件的延迟
  17. Cookie、session和localStorage、以及sessionStorage之间的区别
  18. 构建微服务开发环境3————Java应用的优秀管理工具Maven的下载安装及配置
  19. Android中R文件的丢失问题以及aapt.exe停止工作如何解决
  20. c/c++ 继承与多态 容器与继承3

热门文章

  1. 【leetcode_easy】541. Reverse String II
  2. JAVA数据结构和算法 2-数组
  3. 单例Bean注册表接口SingletonBeanRegistry
  4. Memcache分布式锁
  5. JS中删除数组中的元素方法
  6. 在vue的element图片的上传及回调
  7. JavaSE基础(十一)--Java数组
  8. DataNode 详解及HDFS 2.X新特性
  9. C++11 thread condition_variable mutex 综合使用
  10. vue中使用第三方插件animate.css实现动画效果