import socket
import re
import os def 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服务器的更多相关文章

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

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

  2. 一个简单的NodeJs静态页面的web服务器

    主要功能 1 显示www文件夹下静态html或文本类型的文件. 2 缺省访问文件功能. 通过config.js的defaultfile属性设置 3 如果文件夹下没有缺省文件,显示文件夹下文件列表 4 ...

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

    通过Web Api 和 Angular.js 构建单页面的web 程序 在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的 ...

  4. 域名ip自动跳转 跳转指定页面的js

    域名ip自动跳转 跳转指定页面的js 为了应对百度审核,需要客户的网站在个别地区跳转到另一个页面,就搞到了这段代码,屡试不爽,超实用.下面把地址换成你要访问的网站url地址或者文件url地址即可.超实 ...

  5. 微信公众号页面的web页面键盘弹起问题

    今天开发的过程中,遇到了一个小问题,是这样的,  UI的设计稿中有个底部的按钮是相对于屏幕定位的,但是这个页面还有一个输入框:具体情况请看下图: 这就造成了当我们输入框获取焦点的时候,键盘弹起,下面的 ...

  6. Web服务器-服务器开发-返回固定页面的HTTP服务器(3.3.1)

    @ 目录 1.注意 2.代码 关于作者 1.注意 浏览器解析的时候偶\r\n才算一个换行符 发送的str要编码,这里使用的是utf8 其他的都和上一篇没有什么区别 这里主要返回的是固定的网址 2.代码 ...

  7. node.js连接数据库登录注册,修改用户(页面的ajax请求)

    首先给大家看一下目录结构,结构如下: index.html 首页(显示所有的用户信息) login.html 登录页 register.html 注册页 db.js 配置链接数据库参数 dbhelpe ...

  8. 一个简单的定向python爬虫爬取指定页面的jpg图片

    import requests as r import re resul=r.get("http://www.imooc.com/course/list") urlinfo=re. ...

  9. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

随机推荐

  1. 【密码学】CSP的概念

    CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点: CSP是真正执行密码运算的独立模块 物理上一个CSP由两部分组成:一个动态连接库,一个签名文件 ...

  2. ios 你必须了解的系统定义宏使用

    1. UNAVAILABLE_ATTRIBUTE __attribute__((unavailable)) - (instancetype)init UNAVAILABLE_ATTRIBUTE; 告诉 ...

  3. GET和POST区别(转)

    作者:silence链接:https://www.zhihu.com/question/28586791/answer/153556269来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  4. 收藏 创建第一个mvc

    http://blog.csdn.net/sdtsfhh/article/details/8201956

  5. iDempiere 使用指南 生产插件(Manufacturing)安装过程

    Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...

  6. Struts2_HelloWorld_3

    struts.xml的配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  7. seleniumCSS用法

    http://sauceio.com/index.php/2009/10/selenium-tip-of-the-week-start-improving-your-locators/ http:// ...

  8. Oracle编程入门经典 第12章 事务处理和并发控制

    目录 12.1          什么是事务处理... 1 12.2          事务处理控制语句... 1 12.2.1       COMMIT处理... 2 12.2.2       RO ...

  9. Codeforces - Educational Codeforces Round 5 - E. Sum of Remainder

    题目链接:http://codeforces.com/contest/616/problem/E 题目大意:给定整数n,m(1≤n,m≤1013), 求(n mod 1 + n mod 2 + ... ...

  10. 数据库连接-ADO.NET

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huo065000/article/details/25830291       非常早就知道了ADO ...