import socket
import re
from multiprocessing import Process
HOME_DIR = '.\html'
class MyWeb(object):
"""建立web类"""
def __init__(self):
"""建立server对象"""
self.server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 重复使用绑定的信息
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def bind(self,port):
"""邦定端口号"""
self.server.bind(('', port))
def start(self):
"""开始监听客户端的连接"""
self.server.listen(10)
while True:
conn, address = self.server.accept()
print("客户端[%s]链接进来了" % str(address))
p = Process(target=self.receive_request, args=(conn,))
p.start()
#(1)建立子进程的时候,子进程已经从父进程中复制过了conn,因此能够关闭父进程中的conn了
conn.close()
def receive_request(self, conn):
"""接收客户端的连接"""
request_info = conn.recv(1024).decode()
#print(request_info)
self.handle_request(request_info, conn)
def handle_request(self, request, conn):
"""处理客户端的请求信息"""
relative_path = request.splitlines()[0].split()[1]
print(request)
#(2)
path = re.sub('/', r'\\', relative_path)
self.response_info(conn, path)
def response_info(self, conn, relative_path):
"""将页面返回给浏览器"""
filename = HOME_DIR+relative_path
if '\\' == relative_path:
filename = HOME_DIR+'\index.html'
print(filename)
try:
f = open(filename, 'rb') #(3)有多是图片,图片为二进制数据
response_body = f.read()
f.close()
except IOError as e:
response_start = b'HTTP/1.1 400 Not Found\r\n'
response_head = b'server: localhost\r\n'
response_body = b'No found the file'
else:
response_start = b'HTTP/1.1 200 OK\r\n'
response_head = b'server: localhost\r\n'
response_info = response_start+response_head+b'\r\n'+response_body
conn.send(response_info)
conn.close()
if __name__ == '__main__':
my_web = MyWeb()
my_web.bind(8989)
my_web.start()
测试:html
解释:python
以上就算大概的测试成功了,其中代码中有两处须要注意的地方:
web
(1)
浏览器
这里关闭conn,是由于建立子进程的时候,子进程已经从父进程中复制过了conn,因此能够关闭父进程中的conn了。socket
(2)
测试
这里文件都用二进制打开,以及二进制的形式组合字符串最好。由于当咱们要访问一个html文件时,如里html文件里面有图片的连接地址,图片以二进制打开,不能解码为字符器与响应报文组合了。因此不如一块儿都是二进制来组合。
网站
(3)咱们访问一个页面为何连了四个客户端?3d
第一个是获取exc8.html文件
code
第二个是exc8.html文件中的人物图片的连接地址的访问,因此还会发送一个http请求
server
第三个也是exc8.html文件中的RESUME的图片地址的访问
第四个是favicon.ico,是浏览器试图获取这个网站的logo图片。