返回用户指定页面的web服务器
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服务器的更多相关文章
- 返回固定页面的web服务器
import socket def handle_client(socket_con): """ 接收来自客户端的请求,并接收请求报文,解析,返回 "" ...
- 一个简单的NodeJs静态页面的web服务器
主要功能 1 显示www文件夹下静态html或文本类型的文件. 2 缺省访问文件功能. 通过config.js的defaultfile属性设置 3 如果文件夹下没有缺省文件,显示文件夹下文件列表 4 ...
- 通过Web Api 和 Angular.js 构建单页面的web 程序
通过Web Api 和 Angular.js 构建单页面的web 程序 在传统的web 应用程序中,浏览器端通过向服务器端发送请求,然后服务器端根据这个请求发送HTML到浏览器,这个响应将会影响整个的 ...
- 域名ip自动跳转 跳转指定页面的js
域名ip自动跳转 跳转指定页面的js 为了应对百度审核,需要客户的网站在个别地区跳转到另一个页面,就搞到了这段代码,屡试不爽,超实用.下面把地址换成你要访问的网站url地址或者文件url地址即可.超实 ...
- 微信公众号页面的web页面键盘弹起问题
今天开发的过程中,遇到了一个小问题,是这样的, UI的设计稿中有个底部的按钮是相对于屏幕定位的,但是这个页面还有一个输入框:具体情况请看下图: 这就造成了当我们输入框获取焦点的时候,键盘弹起,下面的 ...
- Web服务器-服务器开发-返回固定页面的HTTP服务器(3.3.1)
@ 目录 1.注意 2.代码 关于作者 1.注意 浏览器解析的时候偶\r\n才算一个换行符 发送的str要编码,这里使用的是utf8 其他的都和上一篇没有什么区别 这里主要返回的是固定的网址 2.代码 ...
- node.js连接数据库登录注册,修改用户(页面的ajax请求)
首先给大家看一下目录结构,结构如下: index.html 首页(显示所有的用户信息) login.html 登录页 register.html 注册页 db.js 配置链接数据库参数 dbhelpe ...
- 一个简单的定向python爬虫爬取指定页面的jpg图片
import requests as r import re resul=r.get("http://www.imooc.com/course/list") urlinfo=re. ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
随机推荐
- 04-cglib(code generator library)代理(没有接口)
1 UserServiceProxyFactory4代码 package www.test.c_proxy; import java.lang.reflect.Method; import org.s ...
- [PHP]AES加密----PHP服务端和Android客户端
本文采取128位AES-CBC模式加密和解密 1.首先对服务端安装mcrypt: sudo apt-get install php5-mcrypt php5-dev sudo php5enmod mc ...
- anaular js loadding效果
以前用的jquery的时候,用ajax实现,比较好弄,下面是angularjs的方式: //body下面增加div <div data-loading></div> //dir ...
- Xtrareport二之固定数据绑定
已经了解了XtraReport的初步用法,现在在进一步了解数据绑定 我们还是先不整高深的,先来个写死的,让我们的数据库可以通过报表呈现先 1. 准备 还在上节基础上,选中设计器report的page ...
- mysql关键字执行顺序
from on join where group by having select distinct union order by 昨天去58面试,之前的java基础和数据结构算法之类的都还可以,最后 ...
- [COM Interop学习小结]实现一个C#调用C++的示例
最近在研究产品的架构代码,发现其中涉及到Com组件技术,即项目中的C# Project会通过Com接口来调用C++ Project中的方法,研究一下,实现一个小的例子,供自己学习. 一. 什么是COM ...
- AIR Native Extension for iOS 接入第三方sdk 如何实现 AppDelegate 生命周期
作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/6492385.html 原创文章,转载请注明作者和出处,未经允许不可用于商业营利活动 去年到今年做 ...
- Azure 媒体服务换新锁,更安全更方便,新钥匙请收好!
不知道有多少人已经把家里的门锁换成了数字化的指纹锁?沿用了几百上千年的传统门锁,在技术的帮助下无疑变得更方便,不用带钥匙,还能远程控制和操作,最重要的是,终于不用担心「衣果(luǒ)着」出门扔垃圾,风 ...
- ssh配置解释
http://vbird.dic.ksu.edu.tw/linux_server/0310telnetssh_2.php /etc/ssh/sshd_config Port 29922 #Addres ...
- XFS: Cross Frame Script (跨框架脚本) 攻击。
一.Cross Frame Script (跨框架脚本) 攻击什么是Cross Frame Script?很简单,做个实验就知道了.把下面的这段HTML代码另存为一个html文件,然后用ie浏览器打开 ...