分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

返回用户指定页面的web服务器

发布时间:2023-09-06 01:53责任编辑:白小东关键词:web服务器
import socketimport reimport osdef handle_client(socket_con): ???""" ????接收来自客户端的请求,并接收请求报文,解析,返回 ???""" ???# 1、服务器接收客户端的请求报文 ???request = socket_con.recv(4096).decode() ???# 以行切割请求报文为列表 ???res = request.split(‘\r\n‘) ???# 取第一位(请求行):GET / HTTP/1.1,并用正则切割GET / HTTP/1.1,取出路径位置 ???path = re.match(‘\w+\s(\S+)‘,res[0]) ???path = path.group(1) ???# 判断路径长度,大于一则拼接出路径,小于等于一则显示首页 ???if len(path) > 1: ???????# 路径取出,开始拼接资源路径(绝对路径自己填写) ???????path = ‘# 文件夹绝对路径‘ + path ???????print(path) ???else: ???????# 显示首页代码 ???????response_line = ‘HTTP/1.1 200 OK\r\n‘ ???????response_head = ‘Content-Type:text/html;charset=utf-8\r\n‘ ???????response_body = ‘‘‘ ???????????<html> ???????????<head> ???????????<title>首页</title> ???????????<style> ???????????body { ???????????????????width: 35em; ???????????????????margin: 0 auto; ???????????????????font-family: Tahoma, Verdana, Arial, sans-serif; ????????????????} ???????????</style> ???????????</head> ???????????<body> ???????????<h1>首页</h1> ???????????<p>欢迎来到首页</p> ???????????<p><em>感谢你的使用</em></p> ???????????</body> ???????????</html>‘‘‘ ???????response = response_line + response_head + ‘\r\n‘ + response_body ???????socket_con.send(response.encode()) ???????socket_con.close() ???# 路径大于一并取出之后判断资源是否存在 ???if not os.path.exists(path): ???????# 资源不存在则显示资源不存在界面 ???????response_line = ‘HTTP/1.1 404 NOT FOUND\r\n‘ ???????response_head = ‘Content-Type:text/html;charset=utf-8\r\n‘ ???????response_body = ‘‘‘ ???????????<html> ???????????<head> ???????????<title>错误</title> ???????????<style> ???????????????body { ???????????????????width: 35em; ???????????????????margin: 0 auto; ???????????????????font-family: Tahoma, Verdana, Arial, sans-serif; ???????????????} ???????????</style> ???????????</head> ???????????<body> ???????????<h1>你请求的资源不存在!</h1> ???????????<p>如果你想访问一个资源,请输入正确的资源路径</p> ???????????<p><em>感谢你的使用</em></p> ???????????</body> ???????????</html>‘‘‘ ???????response = response_line + response_head + ‘\r\n‘ + response_body ???????socket_con.send(response.encode()) ???????socket_con.close() ???????return ???else: ???????# 资源存在以后判断是否是文件,是文件则直接读取 ???????if os.path.isfile(path): ???????????response_line = ‘HTTP/1.1 200 OK\r\n‘ ???????????response_head = ‘Server:skylark 2.0\r\n‘ ???????????response_head += ‘Content-Type:*/*;charset:utf-8\r\n‘ ???????????f = open(path, ‘rb‘) ???????????response_body = f.read() ???????????response = response_line.encode() + response_head.encode() + ‘\r\n‘.encode() + response_body ???????????socket_con.send(response) ???????????socket_con.close() ???????????return ???????else: ???????????if path.endswith(‘/‘): ????????????????# 如果是文件夹 ????????????????# 判断文件夹下是否有默认文件,如果有则返回,如果没有则判断服务器是否开启了目录浏览 ????????????????# 默认文件:index.html ?default.html ????????????????# 是否可以访问默认文件开关,True 开 ,False 关 ????????????????default_document = False ????????????????if default_document: ????????????????????# 判断用户访问的文件夹下是否有index.html 或者 default.html ????????????????????if os.path.exists(path + ‘index.html‘): ????????????????????????response_line = ‘HTTP/1.1 200 OK\r\n‘ ????????????????????????response_head = ‘Server:skylark 2.0\r\n‘ ????????????????????????response_head += ‘Content-Type:*/*;charset:utf-8\r\n‘ ????????????????????????f = open(path + ‘index.html‘, ‘rb‘) ????????????????????????response_body = f.read() ????????????????????????response = response_line.encode() + response_head.encode() + ‘\r\n‘.encode() + response_body ????????????????????????socket_con.send(response) ????????????????????????socket_con.close() ????????????????????????return ????????????????????elif os.path.exists(path + ‘default.html‘): ????????????????????????response_line = ‘HTTP/1.1 200 OK\r\n‘ ????????????????????????response_head = ‘Server:skylark 2.0\r\n‘ ????????????????????????response_head += ‘Content-Type:*/*;charset:utf-8\r\n‘ ????????????????????????f = open(path + ‘default.html‘, ‘rb‘) ????????????????????????response_body = f.read() ????????????????????????response = response_line.encode() + response_head.encode() + ‘\r\n‘.encode() + response_body ????????????????????????socket_con.send(response) ????????????????????????socket_con.close() ????????????????????????return ????????????????????else: ????????????????????????# 如果没有上述两个页面,则可以返回404错误,或者302重定向 ????????????????????????response_line = "HTTP/1.1 404 Not Found\r\n" ????????????????????????response_head = "Server:skylark 2.0\r\n" ????????????????????????response_body = "index.html or default.html is not exist!!!" ????????????????????????response = response_line + response_head + "\r\n" + response_body ????????????????????????socket_con.send(response.encode()) ????????????????????????socket_con.close() ???????????????# 不能访问默认文件情况下,判断服务器是否开启了目录浏览 ????????????????else: ????????????????????dir_browsing = True ????????????????????if dir_browsing: ????????????????????????# 把用户请求的文件夹中所有的文件和文件夹以目录的形式返回到页面中 ????????????????????????# 获取用户请求的文件夹 ????????????????????????list_names = os.listdir(path) ????????????????????????response_line = ‘HTTP/1.1 200 OK\r\n‘ ????????????????????????response_head = ‘Server:skylark 2.0\r\n‘ ????????????????????????# 动态的拼接页面,将目录中的文件或者文件夹的名称以HTML页面的方式返回给浏览器 ????????????????????????response_body = ‘<html><head><body><ul>‘ ????????????????????????for item in list_names: ????????????????????????????response_body += "<li><a href = ‘#‘>" + item + "</a></li>" ????????????????????????response_body += ‘</ul></body></head></html>‘ ????????????????????????response = response_line + response_head + "\r\n" + response_body ????????????????????????socket_con.send(response.encode()) ????????????????????????socket_con.close() ????????????????????????return ???????????else: ???????????????# 用户请求的路径没有斜线 ???????????????# 重定向到+斜线的目录下,并显示重定向以后的路径(此处可以增加有斜线目录处理方式也就是上面的方法) ???????????????response_line = ‘HTTP/1.1 302 Found\r\n‘ ???????????????response_head = ‘Server:skylark 2.0\r\n‘ ???????????????response_head += ‘Content-Type:text/html;charset=utf-8\r\n‘ ???????????????response_body = ‘重定向‘ + path + ‘/‘ ???????????????response = response_line + response_head + ‘\r\n‘ + response_body ???????????????socket_con.send(response.encode()) ???????????????socket_con.close()def main(): ???# 1、服务器创建负责监听的socket ???socket_watch = socket.socket(socket.AF_INET,socket.SOCK_STREAM) ???# 2、设置地址重用 ???socket_watch.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ???# 3、绑定监听的端口 ???socket_watch.bind(("",8888)) ???# 4、设置监听队列 ???socket_watch.listen(128) ???# 5、通过循环,不停的接收来自客户端的连接请求 ???while True: ???????socket_con,con_adds = socket_watch.accept() ???????# 注意将con_adds转成字符串 ???????print("客户端:%s连接成功!!!" % str(con_adds)) ???????# 接收来自客户端的请求,并接收请求报文,解析,返回 ???????handle_client(socket_con)if __name__ == ‘__main__‘: ???main()

  

返回用户指定页面的web服务器

原文地址:https://www.cnblogs.com/wf-skylark/p/9027128.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved