HTTPServer

#coding=utf-8
‘’’
HTTP Server v2.0
多线程并发
可以做request解析
能够返回简单的数据
使用类进行封装
‘’’

from socket import *
from threading import Thread
import sys

#封装httpserver功能
class HTTPServer(object):
def init(self,server_addr,static_dir):
#对象属性
self.server_address=server_addr
self.static_dir=static_dir
self.ip=server_addr[0]
self.port=server_addr[1]
#创建套芥子
self.create_socket()

def create_socket(self):
    self.sockfd = socket()
    self.sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    self.sockfd.bind(self.server_address)

def serv_forever(self):
    self.sockfd.listen(5)
    print('Listen to the port %d'%self.port)
    while True:
        try:
            connfd,addr=self.sockfd.accept()
        except KeyboardInterrupt:
            self.sockfd.close()
            sys.exit("退出服务器")
        except Exception as e:
            print(e)
            continue                    
        #创建线程处理客户端请求
        clientThread=Thread(target=self.handle,args=(connfd,))    
        clientThread.setDaemon(True)
        clientThread.start()
#具体处理客户端请求
def handle(self,connfd):
    #接收客户端请求    
    request=connfd.recv(4096)
    if not request:
        return
    #按行切割
    requestHeaders = request.splitlines()
    print(connfd.getpeername(),":",\
    requestHeaders[0])
    #获取具体请求内容
    get_request=str(requestHeaders[0]).split(' ')[1]

    if get_request=='/' or get_request[-5:]=='.html':
        self.get_html(connfd,get_request)
    else:
        self.get_data(connfd,get_request)
    connfd.close()    
#给客户端发送网页
def get_html(self,connfd,get_request):
    if get_request == '/':
          filename = self.static_dir+"/index.html"
    else:
        filename = self.static_dir+get_request
    try:
        f = open(filename)
    except Exception:
        #没找到网页
        responseHeaders="HTTP/1.1 404 Not found\r\n"
        responseHeaders += '\r\n'
        responseBody = "Sorry,not found the page"
    else:
        #如果找到网页则返回网页
        responseHeaders="HTTP/1.1 200 OK\r\n"
        responseHeaders += '\r\n'
        responseBody=' '
        while True:
            data=f.read(1024)
            if not data:
                break
            responseBody += data
        f.close()    
    finally:
        response=responseHeaders+responseBody
        connfd.send(response.encode())

def get_data(self,connfd,get_request):
    urls=['/time','/tedu','/python']

    if get_request in urls:

        if get_request=='/time':
            import time
            responseBody=time.ctime()
        elif get_request=='/web':
            responseBody='Web Feame'    
        elif get_request=='/python':
            responseBody='Python'
        responseHeaders='HTTP/1.1 200 OK\r\n'
        responseHeaders+='\r\n'
    else:
        responseHeaders = "HTTP/1.1 404 Not found\r\n"
        responseHeaders += '\r\n'
        responseBody = "<h1>None</h1>"

    response = responseHeaders+responseBody
    connfd.send(response.encode())    

#提供服务器地址和静态文件路径
server_addr=(‘0.0.0.0’,8000)
static_dir=(’/home/tarena/test/wangluobiancheng /day09/static’)
#创建服务器对象
httpd=HTTPServer(server_addr,static_dir)
#调用函数启动服务
httpd.serv_forever()

猜你喜欢

转载自blog.csdn.net/weixin_43528118/article/details/84329306