—static:静态文件目录
—templates:前端页面模板文件(index.html和main.html)
——application.py:监听和处理收发数据
——request:解析http请求
——response:用来封装和发送数据的模块
——runserver:服务器启动模块
具体的代码如下:
application.py
import socket
import threading
from response import HttpResponse
from request import HttpRequest
class WSGIServer():
def __init__(self, host='localhost', port = 8080, connectSize = 100):
'''
:param port: 服务器的端口号
:parm connectSize: 默认的并发数量
'''
self.__host = host
self.__port = port
self.__connectSize = connectSize
pass
def startServer(self):
'''
服务器主程序
:return:
'''
server = None
try:
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((self.__host, self.__port))
server.listen(self.__connectSize)
while True:
print("====服务器启动成功:http://" + self.__host + ":" + str(self.__port))
clientConn, clienAddr = server.accept()
# 定义独立的线程,处理每一个用户请求
wt = WorkThread(clientConn, clienAddr)
wt.start()
pass
except socket.gaierror as g:
print(g)
finally:
if server:
server.close()
class WorkThread(threading.Thread):
def __init__(self, connection, addr, bufferSize = 8096):
threading.Thread.__init__(self)
self.__connection =connection
self.__addr = addr
self.__bufferSize = bufferSize
pass
def run(self):
receiveMsg = self.__connection.recv(self.__bufferSize)
receiveMsg = receiveMsg.decode("utf-8")
request = HttpRequest()
params = request.parseRequest(receiveMsg)
responseText = ""
response = HttpResponse()
if params['Accept'].find('text/html') >= 0:
url = 'templates/index.html'
if params['url'] == '/':
url = 'templates/index.html'
else:
url = 'templates' + params['url']
if params['url'] == url:
if params.get('data_params').get('userName') != 'zhangsan':
url = 'templates/index.html'
responseText = response.responseHeader('text.html', 200) + "\n" + response.responseBodyText(url)
responseText = response.responseHeader('text.html', 200) + "\n" + response.responseBodyText(url)
self.__connection.send(responseText.encode('utf-8'))
elif params['Accept'].find('image/') >= 0:
url = params['url']
self.__connection.send(response.responseHeader('image/', 200).encode('utf-8'))
self.__connection.send("\n".encode('utf-8'))
self.__connection.send(response.responseBodyBinary(url[1:]))
self.__connection.close()
pass
pass
request.py
class HttpRequest():
def parseRequest(self, requestText):
params = {}
lineArray = requestText.split('\r\n')
row = 1
isBody = False
bodyText = ""
for line in lineArray:
if row == 1 :
array = line.split(' ')
params['method'] = array[0]
params['url'] = array[1]
params['httptype'] = array[2]
row += 1
elif line.strip() == "":
isBody = True
elif not isBody:
array = line.split(':')
params[array[0]] = line[len(array[0])+2:]
pass
elif isBody:
bodyText += line
pass
params['body'] = bodyText
dataParams = {}
bodyText = bodyText.strip()
if params.get('Content-Type') == 'application/x-ww-form-urlencoded' and params['method'] == 'POST':
array = bodyText.split('&')
for data in array:
key_value = data.split("=")
dataParams[key_value[0]] = key_value[1]
params['data_params'] = dataParams
return params
pass
pass
response.py
class HttpResponse():
def responseHeader(self, contentType, responseCode):
header ="http/1.1 200 OK\r\n"
if contentType == 'text/html':
header += "Content-Type: text/html\r\n" + \
"X-Ua-Compatible: IE=Edge,chrome=1\r\n"
elif contentType == "image/":
header += "Content-Type: text/html\r\n" + \
"X-Ua-Compatible: IE=Edge,chrome=1\r\n"
return header
def responseBodyText(self, url):
body = ""
with open(url, 'r') as fp:
body = fp.read()
return body
def responseBodyBinary(self, url):
body = b""
with open(url, 'rb') as fp:
body = fp.read()
return body
runserver.py
from application import WSGIServer
if __name__ == '__main__':
# 创建服务器对象
wsgiServer = WSGIServer()
wsgiServer.startServer()
pass
然后是实现结果: