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路由出了问题,经调 ...
随机推荐
- IO 字节流学习
复制图片和MP3 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Fil ...
- Effective C++ 45-48
45.弄清c++在幕后为你所写.所调用的函数. 假设设置一个空类,c++编译器会声明下面函数:拷贝构造函数.赋值运算符,析构函数,一对取地址运算符函数(const和非const).而假设你没有声明不论 ...
- Android ORMLite ForeignCollection关联外部集合
<Android ORMLite ForeignCollection关联外部集合> Android ORMLite ForeignCollection关联外部集合的功能,适合层 ...
- 关于ffmpeg的安装具体步骤和说明
一.windows安装: 直接下载地址: https://ffmpeg.zeranoe.com/builds/ https://ffmpeg.zeranoe.com/builds/win64/stat ...
- Java中接口和抽象类的比較
Java中接口和抽象类的比較-2013年5月写的读书笔记摘要 1. 概述 接口(Interface)和抽象类(abstract class)是 Java 语言中支持抽象类的两种机制,是Java程序设计 ...
- setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】
本文转载自:http://blog.csdn.net/u011321546/article/details/9293547 首先要加头文件:iomanip 一:setprecision 作用:控制输出 ...
- bzoj3047:Freda的传呼机&&bzoj2125: 最短路
完结撒花!!!!!!!!!!! 最后一题填坑1A仙人掌WWWWWWW我真流弊 首先把环拆开,环中每一个点连向环的根,然后搞LCA,答案就是套路的d[x]+d[y]-d[lca]*2 然后就可以发现,其 ...
- hdoj--1418--抱歉(水题)
抱歉 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hihocoder 1677 翻转字符串 splay
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,小Hi希望对S进行K次翻转操作. 每次翻转小Hi会指定两个整数Li和Ri,表示要将S[Li..Ri]进行 ...
- 混个脸熟 -- go
一.第一个项目:hello world src/day1/example1/main.go package main import "fmt" func main(){ fmt.P ...