该代码在原有基础上利用多线程实现了多客户端浏览器同时操作的功能,对请求的类型进行分析,用不同的处理方法进行处理
from socket import *
from threading import Threadimport time
ADDR = ('0.0.0.0',8000)
#存放静态网页的目录
STATIC_DIR = './static'
#httpserver类封装服务器功能
class HTTPServer(object):
def __init__(self,addr):
#套接字创建
self.sockfd = socket()
self.sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
self.sockfd.bind(addr)
self.sockfd.listen(5)
#为对象添加属性
self.name = 'HttpServer'
self.port = 8000
self.address = addr
#监听客户端的连接请求,循环创建新的线程处理
def serve_forever(self):
print("listen to port 8000")
while True:
connfd,clientAddr = self.sockfd.accept()
#创建新的线程处理具体请求
clientThread = Thread(target = self.handleRequest,\
args = (connfd,))
clientThread.setDaemon(True)
clientThread.start()
def handleRequest(self,connfd):
#接收客户端请求
request = connfd.recv(1024).decode()
requestHeadlers = request.splitlines()
#请求行
print(connfd.getpeername,":",requestHeadlers[0])
getRequest = requestHeadlers[0].split(' ')[1]
if getRequest[-3:] != '.py':
if getRequest = '/':
getFilename = STATIC_DIR +"/index.html"
else:
getFilename = STATIC_DIR + getRequest
try:
f = open(getFilename)
#打开文件失败就说明,该网页不存在返回404
except Exception:responseHeaders = 'HTTP/1.1 404 not found\r\n'
responseHeaders += '\r\n'
responseBody = "===Sorry,the page not found==="
else:
responseHeaders = 'HTTP/1.1 200 ok\r\n'
responseHeaders += '\r\n'
responseBody = f.read()
finally:
response = responseHeaders + responseBody
connfd.send(response.encode())
else:
#通过函数得到响应体
responseBody = self.application()
responseHeaders = 'HTTP/1.1 200 ok\r\n'
responseHeaders += '\r\n'
response = responseHeaders + responseBody
connfd.send(response.encode())
#获取你要使用的外部函数,变为属性
def setApp(self,application):
self.application = application
def app():
return time.ctime()
if __name__ == "main":
httpd = HTTPServer(ADDR)
httpd.setApp(app)
#启动服务器
httpd.serve_forever()