08.Web服务器-3.Web静态服务器
1、显示固定的页面
from socket import *
from multiprocessing import *
import os
def handleClient(clientSocket):
#用一个新的进程,为一个客户端进行服务
data = clientSocket.recv(1024).decode('utf-8')
print(data)
responseHeaderLines = "HTTP/1.1 200 OK"+os.linesep
responseHeaderLines += "k1:v1"+os.linesep
responseHeaderLines += "k2:v2" + os.linesep
responseHeaderLines += os.linesep
responseBody = "hello <h1>老王八</h1>"
response = responseHeaderLines + responseBody
clientSocket.send(response.encode('utf-8'))
clientSocket.close()
if __name__ == '__main__':
#作为程序的主控制入口
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(("", 82))
serverSocket.listen()
while True:
print('服务端等待客户端连接......')
clientSocket, clientAddr = serverSocket.accept()
Process(target=handleClient, args=(clientSocket,)).start()
print('%s-%s 连接成功......' % (clientAddr[0], clientAddr[1]))
2、显示需要的页面
from socket import *
from multiprocessing import *
import os
# 设置静态文件根目录
HTML_ROOT_DIR = "./html"
def handleClient(clientSocket):
data = clientSocket.recv(1024)
data = data.decode('utf-8')
"""解析请求报文"""
# 提取用户请求的文件名,如果是get请求携带参数要处理?
file_name = data.splitlines()[0].split(' ')[1]
#如果是/一般表示请求首页
if "/" == file_name:
file_name = "/index.html"
# 打开文件,读取内容
try:
#模拟一个运行中的异常
#num=1/0
with open(HTML_ROOT_DIR + file_name, "rb") as file:
file_data = file.read()
# 构造响应数据
response_start_line = "HTTP/1.1 200 OK"+os.linesep
response_headers = "Server: My server"+os.linesep
response_body = file_data.decode("utf-8")
except FileNotFoundError:
response_start_line = "HTTP/1.1 404 Not Found"+os.linesep
response_headers = "Server: My server"+os.linesep
with open(HTML_ROOT_DIR + '/404.html', "r",encoding='utf-8') as file:
response_body = file.read()
except:
response_start_line = "HTTP/1.1 500 ERROR" + os.linesep
response_headers = "Server: My server" + os.linesep
with open(HTML_ROOT_DIR + '/error.html', "r",encoding='utf-8') as file:
response_body = file.read()
response_headers += "Content-Type:text/html;charset=utf-8" + os.linesep
response = response_start_line + response_headers + os.linesep + response_body
#print("response data:", response)
# 向客户端返回响应数据
clientSocket.send(response.encode('utf-8'))
# 关闭客户端连接
clientSocket.close()
if __name__ == '__main__':
"""作为程序的主控制入口"""
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(("", 6788))
serverSocket.listen()
while True:
print('服务端等待客户端连接......')
clientSocket, clientAddr = serverSocket.accept()
Process(target=handleClient, args=(clientSocket,)).start()
print('%s-%s 连接成功......' % (clientAddr[0], clientAddr[1]))
3、符合面向对象思想设计类实现
from socket import *
from multiprocessing import *
import os
# 设置静态文件根目录
HTML_ROOT_DIR = "./html"
class MyHttpServer(object):
"""服务器类"""
def __init__(self):
"""初始化,创建了一个TCP服务端对象"""
self.server_socket = socket(AF_INET, SOCK_STREAM)
def bind(self, port=5678):
"""绑定端口号"""
self.server_socket.bind(("", port))
def start(self):
"""开始监听"""
self.server_socket.listen()
while True:
client_socket, client_address = self.server_socket.accept()
print("[%s, %s]用户连接上了" % client_address)
Process(target=self.handle_client, args=(client_socket,)).start()
def handle_client(self,client_socket):
"""处理客户端的请求"""
data = client_socket.recv(1024)
data = data.decode('utf-8')
"""解析请求报文"""
# 提取用户请求的文件名,如果是get请求携带参数要处理?
file_name = data.splitlines()[0].split(' ')[1]
# 如果是/一般表示请求首页
if "/" == file_name:
file_name = "/index.html"
# 打开文件,读取内容
try:
# 模拟一个运行中的异常
# num=1/0
with open(HTML_ROOT_DIR + file_name, "rb") as file:
file_data = file.read()
# 构造响应数据
response_start_line = "HTTP/1.1 200 OK" + os.linesep
response_headers = "Server: My server" + os.linesep
response_body = file_data.decode("utf-8")
except FileNotFoundError:
response_start_line = "HTTP/1.1 404 Not Found" + os.linesep
response_headers = "Server: My server" + os.linesep
with open(HTML_ROOT_DIR + '/404.html', "r", encoding='utf-8') as file:
response_body = file.read()
except:
response_start_line = "HTTP/1.1 500 ERROR" + os.linesep
response_headers = "Server: My server" + os.linesep
with open(HTML_ROOT_DIR + '/error.html', "r", encoding='utf-8') as file:
response_body = file.read()
response_headers += "Content-Type:text/html;charset=utf-8" + os.linesep
response = response_start_line + response_headers + os.linesep + response_body
# print("response data:", response)
client_socket.send(response.encode('utf-8'))
client_socket.close()
if __name__ == '__main__':
myHttpServer = MyHttpServer()
myHttpServer.bind()
myHttpServer.start()
08.Web服务器-3.Web静态服务器的更多相关文章
- Node.js Web 开发框架大全《静态文件服务器篇》
这篇文章与大家分享优秀的 Node.js 静态服务器模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能 ...
- Nodejs实现web静态服务器对多媒体文件的支持
前几天,一个同事说他写的web静态服务器不支持音视频的播放,现简单实现一下. 原理:实现http1.1协议的range部分. 其实这一点都不神秘,我们常用的下载工具,如迅雷,下载很快,还支持断点续传, ...
- 08.Web服务器-4.Web服务器动态资源请求
1 浏览器请求动态页面过程 2 WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会 ...
- Web静态服务器
Web静态服务器 编程微刊 Web静态服务器-1-显示固定的页面 #coding=utf-8 import socket def handle_client(client_socket): " ...
- Web前端页面的浏览器兼容性测试心得(一)搭建测试用本地静态服务器
自从实习以来,我体验了由一个人编程再到多人协作编程的转换.同时也接触了很多新鲜事物,学到了很多东西.工作时,常常需要多个人协同测试一张H5页面(PC.手机.平板等跨设备测试),也会经常把页面给PM或老 ...
- Web服务器、Web容器、Application服务器、反向代理服务器的区别与联系
在Web开发中,经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server).反向代理服务器(Reverse Proxy ...
- JavaEE中Web服务器、Web容器、Application服务器区别及联系
在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...
- 常见的web容器与应用程序服务器区别及对比
tomcat 类型:servlet容器和HTTP web服务器 功能:实现了一些J2EE特性包括Java Servlet.JSP页面.Java EL和websocket,还有纯java的http we ...
- WEB服务器、应用程序服务器、HTTP服务器区别
很清晰的解释了WEB服务器.应用程序服务器.HTTP服务器区别 转载自 http://www.cnblogs.com/zhaoyl/archive/2012/10/10/2718575.html WE ...
- Asp.net web api部署在某些服务器上老是404
asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问,却又OK. 这时,便可以确定是WebAPI路由出了问题,经调 ...
随机推荐
- javascript打开本地应用
function openShell(){ if(window.ActiveXObject){ var cmd = new ActiveXObject('WScript.Shell') cmd.Run ...
- 新随笔(三)什么时候使用button,什么时候使用文字链接
新随笔(三)什么时候使用button.什么时候使用文字链接 你为什么在这个地方用button而不用文字链接呢? 这是刚才我问一个设计师的问题. 她抬头看我,眼神迷茫.说:"没什么为什么呀,我 ...
- 【译文】利用STAN做贝叶斯回归分析:Part 2 非正态回归
[译文]利用STAN做贝叶斯回归分析:Part 2 非正态回归 作者 Lionel Hertzogn 前一篇文章已经介绍了怎样在R中调用STAN对正态数据进行贝叶斯回归.本文则将利用三个样例来演示怎样 ...
- android中的back键处理
Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台,而回到桌面的尴尬情况,在Android上有两种方法来获取该按钮的事件. 1.直接获取按钮按下事件,此方法兼容Andro ...
- Linux:命令gedit
首先,gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器.它使用GTK+编写而成,因此它十分的简单易用,有良好的语法高亮,对中文支持很好,支持包括gb2312.gbk在内的多种字符编码. ...
- 的Linq未提交之前插入/修改时重新查询不准确问题
来园子已经两年了,每次都是看,这次咱也写一次. 说一下今天遇到的Linq问题: 每一次插入流水表时,都需要查找表中最大的流水号+1,并且将该流水号返回,但是在同一个SubmitChange之内插入多条 ...
- stack 栈
其实今天我们主要讲的是搜索,但是留作业不知道怎么就突然全变成栈了. 其实栈和队列没什么区别,只是一个先进先出,一个先进后出.基本操作也是一样的. 栈(stack)又名堆栈,它是一种运算受限的线性表.其 ...
- B4010 菜肴制作 拓扑排序(附随机跳题代码)
今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...
- django自带url模板标签的使用
django模板中url标签和view中的reverse(博客地址)功能相同,都是通过制定处理视图来返回一个url. 使用方法: {% url userEdit 12 %} 或者 {% url use ...
- Java并发基础知识点详解
1.synchronized与Lock区别 父类有synchtonized,子类调用父类的同步方法,是没办法同步的,因为synchronized不是修饰符,不会被继承下来. synchronized ...