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. 【JavaScript】正則表達式

    正則表達式,也不是第一次与它见面了.在我们学习ASP.NET视频的时候,验证控件的那个实例中.就有提到过它. 那个时候.都是在控件的属性中自己设置的,用的原理就是正則表達式,当时得感觉就是方便,强大, ...

  2. activeMQ公布订阅模式中中经常使用工具类

    package com.jms; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.j ...

  3. codeforces #262 DIV2 B题 Little Dima and Equation

    题目地址:http://codeforces.com/contest/460/problem/B 这题乍一看没思路.可是细致分析下会发现,s(x)是一个从1到81的数,不管x是多少.所以能够枚举1到8 ...

  4. 在win10 64 bit上安装theano

    在windows10上安装theano,过程例如以下: 1.准备工作.先安装Anaconda 64位.然后执行 conda install mingw libpython 2.先安装pycuda,能够 ...

  5. STM32F103频率和AD採集项目总结

    刚刚做了我的第一个嵌入式项目----基于STM32F103的频率和AD採集系统. 是一个大系统的一个部分.没用操作系统,使用库函数编写,尽管东西非常easy.可是对于我这个还没入门的菜鸟来说还是有点难 ...

  6. yum install tomcat

    安装tomcat6 yum install tomcat6 tomcat6-webapps tomcat6-admin-webapps 启动tomcat6 service tomcat6 start ...

  7. React-Router 中文简明教程(上)

    概述 说起 前端路由,如果你用过前端 MV* 框架构建 SPA 应用(单页面应用),对此一定不陌生. 传统开发中的 路由,是由服务端根据不同的用户请求地址 URL,返回不同内容的页面,而前端路由则将这 ...

  8. 到底什么是nandflash,norflash,sdram,emmc,rom,ram【转】

    本文转载自:http://blog.sina.com.cn/s/blog_6dd8f2b70101le26.html 最近被nandflash,norflash,sdram,emmc,rom,ram搞 ...

  9. maven变量

    一.pom文件,maven内置变量 ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputD ...

  10. CentOS7 内核参数优化

    # allow testing with buffers up to 128MBnet.core.rmem_max = 134217728net.core.wmem_max = 134217728# ...