37,719
社区成员
发帖
与我相关
我的任务
分享
import sys
import socket
import multiprocessing
import re
HTTP_SEVER_DIR = '.'
class HTTPserver(object):
def __init__(self,port):
self.server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.server_socket.bind(('',port))
self.server_socket.listen(5)
self.response_headers = ''
def start_response(self,status,headers):
response_headers = 'HTTP 1.1 %s\r\n'%status
for header in headers:
response_headers = response_headers + '%s:%s'%(header[0],header[1]) + '\r\n'
self.response_headers = response_headers
def handle_client(self,client_socket):
request_data = client_socket.recv(1024).decode('utf-8')
print(request_data)
request_start_line = request_data.splitlines()[0]
file_name = re.match(r'\w+ +(/[^ ]*) ',request_start_line).group(1)
print(file_name)
#file_name = request_start_line
if file_name.endswith('.py'):
m = __import__(file_name[1:-3])
env = {
}
response_body = m.application(env,self.start_response)
response_data = self.response_headers +'\r\n' + response_body
elif '/' == file_name:
file_name = 'index.html'
try:
with open(HTTP_SEVER_DIR + file_name,'rb') as f:
file_data = f.read()
f.close()
except:
response_start_line = 'HTTP 1.1 200 OK\r\n'
response_headers = 'Server Lindr\r\n'
response_body = '\r\nThis file is not found'
response_data = response_start_line + response_headers + response_body
else:
response_start_line = 'HTTP 1.1 200 OK\r\n'
response_headers = 'Server Lindr\r\n'
response_body = '\r\n' + file_data.decode('utf-8')
#response_headers = '\r\nhello word3
response_data = response_start_line + response_headers + response_body
client_socket.send(response_data.encode('gbk'))
client_socket.close()
def start(self):
while 1:
client_socket,client_addr = self.server_socket.accept()
print('[%s,%s]用户上线了'%client_addr)
server_process = multiprocessing.Process(target=self.handle_client,args=(client_socket,))
server_process.start()
client_socket.close()
def main():
http_sever = HTTPserver(8888)
http_sever.start()
if __name__ == '__main__':
main()