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. MyBatis对数据库的增删改查操作,简单演示样例

    之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...

  2. rnnlm源代码分析(八)

    系列前言 參考文献: RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读) Recurrent neural networ ...

  3. Oracle 静态监听注冊具体解释

    Oracle 静态监听注冊具体解释 网上有非常多关于oracle 监听静态注冊的文章.但大多都是简单说说,并没有具体的样例.这里,将结合linux as4 下的oracle 10gR2.0.1 举一个 ...

  4. USACO money packageDP

    裸0/1背包,就是从各种币种里面拿来凑足N元,求最多有多种方案.用dp[i][j]表示选前i个币种凑成j的方案数量 状态转移方程: dp[i][j] = dp[i- 1][j]    j < c ...

  5. Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求

    Elasticsearch源码分析—线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...

  6. 89. Ext.Button 按钮

    转自:http://www.cnblogs.com/lipan/archive/2011/12/13/2274797.html 从本篇开始讲基础控件,ExtJs对所有的UI控件都有它自己的一套封装.本 ...

  7. 浅讲ajax

    1.ajax入门案例 1.1 搭建Web环境 ajax对于各位来说,应该都不陌生,正因为ajax的产生,导致前台页面和服务器之间的数据传输变得非常容易,同时还可以实现页面的局部刷新.通过在后台与服务器 ...

  8. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

  9. MessagePack 新型序列化反序列化方案

    进入在学习redis的时候,在文中看到了关于MessagePack的简介,发现非常有意思,于是就花了点时间大致了解了下. MessagePack介绍: MessagePack is an effici ...

  10. 解决IE不支持Data.parse()的问题

    Date.parse()函数的返回值为Number类型,返回该字符串所表示的日期与 1970 年 1 月 1 日午夜之间相差的毫秒数. var nowtime = "2017-02-08&q ...