python写网页服务器端,用python编写一个web静态服务器

6de4c4eab5ac89ca1791507aa16ca532.png

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

d49c61b387589fcef81903ec8aabe219.png

1ff3067fa156928639ad10e6c547d2d1.png

解释:python

以上就算大概的测试成功了,其中代码中有两处须要注意的地方:

web

(1)

浏览器

77fccf65a99de86ed893c3572d426ac2.png

这里关闭conn,是由于建立子进程的时候,子进程已经从父进程中复制过了conn,因此能够关闭父进程中的conn了。socket

(2)

测试

8db1e04dd32914232d6dd5b764830381.png

这里文件都用二进制打开,以及二进制的形式组合字符串最好。由于当咱们要访问一个html文件时,如里html文件里面有图片的连接地址,图片以二进制打开,不能解码为字符器与响应报文组合了。因此不如一块儿都是二进制来组合。

网站

(3)咱们访问一个页面为何连了四个客户端?3d

第一个是获取exc8.html文件

code

第二个是exc8.html文件中的人物图片的连接地址的访问,因此还会发送一个http请求

server

第三个也是exc8.html文件中的RESUME的图片地址的访问

第四个是favicon.ico,是浏览器试图获取这个网站的logo图片。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值