import socket
import re
import 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 = '# 文件夹绝对路径' + pathprint(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_bodysocket_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_bodysocket_con.send(response.encode())socket_con.close()returnelse:# 资源存在以后判断是否是文件,是文件则直接读取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_bodysocket_con.send(response)socket_con.close()returnelse:if path.endswith('/'):# 如果是文件夹# 判断文件夹下是否有默认文件,如果有则返回,如果没有则判断服务器是否开启了目录浏览# 默认文件:index.html  default.html# 是否可以访问默认文件开关,True 开 ,False 关default_document = Falseif default_document:# 判断用户访问的文件夹下是否有index.html 或者 default.htmlif 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_bodysocket_con.send(response)socket_con.close()returnelif 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_bodysocket_con.send(response)socket_con.close()returnelse:# 如果没有上述两个页面,则可以返回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_bodysocket_con.send(response.encode())socket_con.close()# 不能访问默认文件情况下,判断服务器是否开启了目录浏览else:dir_browsing = Trueif 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_bodysocket_con.send(response.encode())socket_con.close()returnelse:# 用户请求的路径没有斜线# 重定向到+斜线的目录下,并显示重定向以后的路径(此处可以增加有斜线目录处理方式也就是上面的方法)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_bodysocket_con.send(response.encode())socket_con.close()def main():# 1、服务器创建负责监听的socketsocket_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()

  

转载于:https://www.cnblogs.com/wf-skylark/p/9027128.html

返回用户指定页面的web服务器相关推荐

  1. 返回固定页面的web服务器

    import socketdef handle_client(socket_con):"""接收来自客户端的请求,并接收请求报文,解析,返回""&qu ...

  2. 通过Web Api 和 Angular.js 构建单页面的web 程序

    在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的页面,比如说:用户通过一个连接导航到一个页面,会发送一个请求到服务器端, ...

  3. 静态页面与动态页面的web访问

    近期对web基础进行学习和整理 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(R ...

  4. 案例:返回固定页面的http服务器

    import socketdef service_client(new_socket):"""为这个客户端返回数据"""# 1. 接收浏览器 ...

  5. Java调用浏览器打开指定页面的5种方法(最全)

    package com.xbz;import java.awt.*; import java.lang.reflect.Method; import java.net.URI; import java ...

  6. java openurl不弹出新页面_Java调用浏览器打开指定页面的5种方法(最全)

    package com.xbz; import java.awt.*; import java.lang.reflect.Method; import java.net.URI; import jav ...

  7. Web服务器,Web容器和应用服务器的区别

    转载自http://www.2cto.com/os/201504/395183.html 1.什么是服务器? 2.Web服务器,Web容器和应用服务器的区别? 3.Apache和Tomcat的区别? ...

  8. Web 服务器错误代码大全

    目录 400 - 错误的请求. 401 - 访问被拒绝.IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因.这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: 401.1 ...

  9. 用Apache构建WEB服务器

    用Apache构建WEB服务器 作者:level Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一.Apache取自"a patchy serv ...

最新文章

  1. Tarjan求割点桥
  2. 人工智能2021截稿日期_APISE2021会议预览【人工智能amp;控制amp;模式识别】
  3. 023_运行时变量和范围
  4. english grammar in use 电子版_③ 采购笔记之节点与凭证、采购的进阶、采购合同要素。(电子版整理中)...
  5. disruptor小结--生产者代码
  6. 机器人植入情感芯片利与弊_马斯克活猪脑机接口试验成功!多芯片植入,硬币大小,实时读取脑电波,已被批准人脑实验...
  7. BOOTSTRAP学习之路(1)
  8. python中浮点型占几个字节_python的浮点数占多少个字节
  9. 2021年高压电工考试及高压电工模拟试题
  10. 试图速成的RPG Maker MV 学习笔记(二)
  11. Elasticsearch之近义词/同义词的使用
  12. 【文献阅读】ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information
  13. 自学神经网络系列 —— 8 前馈神经网络
  14. FastReport Mono 2023.1 Crack
  15. 《Qt on Android核心编程》介绍
  16. cloudfare dns_Cloudflare配置动态dns(ddns)
  17. ipados远程linux软件,JingOS Linux平板系统v0.6下载发布 支持多点触摸手势
  18. ELK+grok+华为防火墙USG6500会话日志
  19. 重磅!百度多模态模型ERNIE-ViL刷新5项任务纪录,并登顶权威榜单VCR
  20. termux是等于linux终端,termux终端

热门文章

  1. SQL SERVER出现大量一致性错误的解决方法
  2. Oracle 11.2.0.1 升级到 11.2.0.3 示例
  3. 衡阳a货翡翠,南平a货翡翠
  4. PaaS下半场,任重且道远
  5. 《Nmap渗透测试指南》—第6章6.4节IP欺骗
  6. [USACO5.3]校园网Network of Schools 缩点
  7. HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之全然具体解释
  8. 如何退出Activity?如何安全退出已调用多个Activity的Application?
  9. 多喜临门,BCH币价应声上涨
  10. BCH能达到它的宣传吗?现实世界压力测试即将到来!