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静态服务器的更多相关文章

  1. Node.js Web 开发框架大全《静态文件服务器篇》

    这篇文章与大家分享优秀的 Node.js 静态服务器模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能 ...

  2. Nodejs实现web静态服务器对多媒体文件的支持

    前几天,一个同事说他写的web静态服务器不支持音视频的播放,现简单实现一下. 原理:实现http1.1协议的range部分. 其实这一点都不神秘,我们常用的下载工具,如迅雷,下载很快,还支持断点续传, ...

  3. 08.Web服务器-4.Web服务器动态资源请求

    1 浏览器请求动态页面过程 2 WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会 ...

  4. Web静态服务器

    Web静态服务器 编程微刊 Web静态服务器-1-显示固定的页面 #coding=utf-8 import socket def handle_client(client_socket): " ...

  5. Web前端页面的浏览器兼容性测试心得(一)搭建测试用本地静态服务器

    自从实习以来,我体验了由一个人编程再到多人协作编程的转换.同时也接触了很多新鲜事物,学到了很多东西.工作时,常常需要多个人协同测试一张H5页面(PC.手机.平板等跨设备测试),也会经常把页面给PM或老 ...

  6. Web服务器、Web容器、Application服务器、反向代理服务器的区别与联系

    在Web开发中,经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server).反向代理服务器(Reverse Proxy ...

  7. JavaEE中Web服务器、Web容器、Application服务器区别及联系

    在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...

  8. 常见的web容器与应用程序服务器区别及对比

    tomcat 类型:servlet容器和HTTP web服务器 功能:实现了一些J2EE特性包括Java Servlet.JSP页面.Java EL和websocket,还有纯java的http we ...

  9. WEB服务器、应用程序服务器、HTTP服务器区别

    很清晰的解释了WEB服务器.应用程序服务器.HTTP服务器区别 转载自 http://www.cnblogs.com/zhaoyl/archive/2012/10/10/2718575.html WE ...

  10. Asp.net web api部署在某些服务器上老是404

    asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问,却又OK. 这时,便可以确定是WebAPI路由出了问题,经调 ...

随机推荐

  1. JDK框架简析--java.lang包中的基础类库、基础数据类型

    题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含 ...

  2. Codeforces Round #276 (Div. 1) A. Bits 贪心

    A. Bits   Let's denote as  the number of bits set ('1' bits) in the binary representation of the non ...

  3. 【Ubuntu】基本操作 (条目=11)

    定义 NAME 为要操作的对象名 定义 DIR 为文件所在的绝对路径 所有操作默认在普通用户下进行 所有软件包默认是指Debian包(deb包) 1.查看进程 top 2.强制结束进程 PID由top ...

  4. bzoj 4025 二分图 分治+并查集/LCT

    bzoj 4025 二分图 [题目大意] 有n个点m条边,边会在start时刻出现在end时刻消失,求对于每一段时间,该图是不是一个二分图. 判断二分图的一个简单的方法:是否存在奇环 若存在奇环,就不 ...

  5. EasyUI TreeGrid 悬浮效果

    /* 鼠标悬停扩展*/ (function (hasgrid) { if (hasgrid) { /** * 表格提示 */ $.extend($.fn.datagrid.methods, { too ...

  6. Jmeter - 服务器性能检测

    在对系统做压力测试时,往往需要对服务的性能进行监控,包括CPU,Memory,IO,还有网络情况进行监控. Jemter有个一插件,能很好的支持这些性能监控.原理是服务器启动服务之后,测试机发起请求, ...

  7. java 实现将java对象转为yaml文件

    首先我们建两个类,以下两个类展示的是一个学生拥有多个手机号码联系人. 先是学生类: package com.ming.yaml.beans; import java.util.ArrayList; i ...

  8. android黑科技系列——Apk混淆成中文语言代码

    一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Ja ...

  9. 酷派 5267 刷入第三方 recovery教程 刷机 ROOT

    准备工作: 一台电脑: 酷派5267手机: 一张内存卡: 下载好刷机资料:  http://pan.baidu.com/s/1i4LoVh7 备用下载: http://pan.baidu.com/s/ ...

  10. (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:  List list = new ArrayList();  list.add(“Hello”);  list.add(“World”);  list.add(“Learn”); //此时list 为Hello World Learn  rever

    import java.util.ArrayList; import java.util.List; public class AA { public static void main(String[ ...