返回固定页面:
import socket
def main():
web_sock = socket.socket()
web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
web_sock.bind(('',9999))
web_sock.listen(128)
while True:
#接收一个新的连接请求
get_sock, get_adress = web_sock.accept()
#接收数据 数据一定要接收
ret = get_sock.recv(4096)
#响应报文和发送
#拼接响应体报文
resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
#读取网页资源 rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
file = open('./static/index.html','rb')
body_data = file.read()
file.close()
#with open写法
# with open('./static/index.html','rb')as file:
# body_data = file.read()
get_sock.send(resp_data.encode(encoding='gbk') + body_data)
#关闭
get_sock.close()
if __name__ == '__main__':
main()
返回固定页面时候读取当前文档下index页面作为固定页面,并把读取出的页面作为响应体加在响应报文中,在send中编码时候使用了gbk形式的编码是因为在google页面中打开时候发现utf-8解码是乱码才改用gbk的。
返回指定页面
1.在判断这块主要是增加了判断用户离开页面
2.判断用户输入的路径,对recv接收的信息进行解码并对字符串进行分割处理,从而获取需要的文件路径并添加到响应报文的响应体。
import socket
def main():
web_sock = socket.socket()
web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
web_sock.bind(('',9999))
web_sock.listen(128)
while True:
#接收一个新的连接请求
get_sock, get_adress = web_sock.accept()
#接收数据 数据一定要接收
ret = get_sock.recv(4096)
#完善:判断用户是否离开
if len(ret) == 0:
print('用户离开')
get_sock.close()
continue
#解析请求报文,得到请求资源中的资源路径
ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
#判断当/时候返回主页面
if ret_road == '/':
ret_road = '/index.html'
#响应报文和发送
#拼接响应体报文
resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
#读取网页资源 rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
file = open('./static' + ret_road,'rb')
body_data = file.read()
file.close()
#with open写法
# with open('./static/index.html','rb')as file:
# body_data = file.read()
#发送数据
get_sock.send(resp_data.encode(encoding='gbk') + body_data)
#关闭
get_sock.close()
if __name__ == '__main__':
main()
添加异常捕获完善代码
异常捕获是为了当用户使用时候输入错误的名称时报错的基础上再进行完善。
import socket
def main():
web_sock = socket.socket()
web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
web_sock.bind(('',9999))
web_sock.listen(128)
while True:
#接收一个新的连接请求
get_sock, get_adress = web_sock.accept()
print('用户%s 进入' % str(get_adress))
#接收数据 数据一定要接收
ret = get_sock.recv(4096)
#完善:判断用户是否离开
if len(ret) == 0:
print('用户离开')
get_sock.close()
continue
#解析请求报文,得到请求资源中的资源路径
ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
#判断当/时候返回主页面
if ret_road == '/':
ret_road = '/index.html'
try:
#响应报文和发送
#读取网页资源 rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
file = open('./static' + ret_road,'rb')
body_data = file.read()
file.close()
#with open写法
# with open('./static/index.html','rb')as file:
# body_data = file.read()
except Exception as e:
with open('./static/404.html','rb') as file:
body_data = file.read()
resp_data = 'HTTP/1.1 404 Not Found\r\nServer:HANYAN/1.1\r\n\r\n'
else:
resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
finally:
#发送数据
get_sock.send(resp_data.encode(encoding='gbk') + body_data)
#关闭
get_sock.close()
if __name__ == '__main__':
main()
整体Web服务器的搭建已完成,在下篇写线程的多用户和面向对象版的。
static练习文件:
百度网盘链接:https://pan.baidu.com/s/1gsqNx5U4498zqcSGPbAu2w
提取码:ekgt