这个动态web服务器的思路是在静态服务器的基础上添加对URL的判断,如果URL中带有脚本信息,那么服务器会去执行脚本而不是直接返回静态界面

#-*-coding:utf-8-*-
import sys
import re
from socket import *
from multiprocessing import Process#设置静态文件根目录
HTTP_ROOT_DIR = "./html"WSGI_PYTHON_DIR = "./wsgipython"class HTTPServer(object):''''''def __init__(self):self.tcp_socket = socket(AF_INET, SOCK_STREAM)self.tcp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)def start(self):self.tcp_socket.listen(128)while True:try:cli_socket, addrs = self.tcp_socket.accept()print("%s  %s:用户已连接" % (addrs[0], addrs[1]))p = Process(target=self.handle_client, args=(cli_socket,))p.start()cli_socket.close()except:print("服务器已经关闭")cli_socket.close()tcp_socket.close()def start_response(self, status, headers):self.response_start = "HTTP/1.1 " + status + "\r\n"server_headers = ""for header in headers:server_headers += "%s: %s\r\n"%headerself.response_headers = server_headersdef handle_client(self,cli_socket):# 接收数据request_data = cli_socket.recv(1024)# 解析HTTP报文协议 request_dataprint("requst_data:", request_data)# 处理响应数据request_lines = request_data.splitlines()print(request_lines)request_da = request_lines[0]# 获取用户想要的请求名file_name = re.match(r"\w+ +(/[^ ]*) ", request_da.decode("utf-8")).group(1)if file_name.endswith(".py"):# 处理py文件m = __import__(file_name[1:-3])env = {}response_body = m.application(env, self.start_response)response_start_line = self.response_startresponse_header = self.response_headerselse:# 判定一下特殊情况,字符串写在左侧可以避免把“==”写成“=”时当成赋值语句if "/" == file_name:file_name = "/index.html"# 打开请求文件try:f = open(HTTP_ROOT_DIR + file_name, "rb")file_data = f.read()f.close()except IOError:response_start_line = "HTTP/1.1 404 Not Found\r\n"response_header = "Server: My server\r\n"response_body = "Not Found"else:# 构造响应数据response_start_line = "HTTP/1.1 200 OK\r\n"response_header = "Server: My server\r\n"response_body = file_data.decode("utf-8")response = response_start_line + response_header + "\r\n" + response_bodyprint("response data:", response)# 发送数据cli_socket.send(bytes(response, "utf-8"))# cli_socket.send(response)# 关闭套接字cli_socket.close()print("链接已经断开")def bind(self, port):self.tcp_socket.bind(port)def main():sys.path.insert(1,WSGI_PYTHON_DIR)http_server = HTTPServer()http_server.bind(("",8000))http_server.start()if __name__ == '__main__':main()

一个简单的动态web服务器相关推荐

  1. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  2. 一个简单的静态web服务器实现

    看完tomcat原理后,想自己用java仿一个简单的tomcat,先实现一个静态的web服务器.需要的技术有java网络编程(tcp/ip协议.http协议.socket等基础知识) 源码下载链接ht ...

  3. 一个简单的静态web服务器

    用python的socket写的一个简单多进程服务器 #-*-coding:utf-8-*- import re from socket import * from multiprocessing i ...

  4. AndServer,一个Android端的web服务器

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 大家好,今天跟大家介绍一个让原生Android也可以做Web开发的开源项目--AndServer. 开 ...

  5. 教你如何安装一个免费的专用Web服务器

    所有伟大的站点背后都有一个伟大的服务器.  在这篇指南里,我会告诉你如何搭建一个专用的服务器(包括Apache,MySql,和PHP), 使用那台在屋子里无所事事的旧电脑和一些免费的软件. 快速概览 ...

  6. 一个简单的python日志服务器

    一个简单的python日志服务器,主要目的是搜集各python logging记录的日志,将其简单汇总.源码如下: # -*- coding: utf-8 -*- ''' Created on 201 ...

  7. 一个简单的PHP Web论坛

    1.需求分析 通过发表文章开始新的讨论话题 发表文章来回复已有的文章 查看发表的文章 查看论坛中的交谈话题 查看文章之间的关系,也就是,查看哪篇文章是另外文章的回复 2.解决方案 2.1 论坛设计 2 ...

  8. 简单的动态网站java,Java实践:一个简单的动态数组实现

    一个简单的动态数组实现 基于数组实现 添加10w的容量 在删除 所有 容量 平均是 0.4秒 这个效率是可观的 下面来一起看看代码package com.array; import java.util ...

  9. 《UNP》随笔——“实现一个简单的回射服务器”存在的不足(信号处理)

    尽管实现了一个简单的回射服务器,但依旧存在一些不足: 服务端的子进程结束的时候,由于父进程未对子进程发送的SIGCHLD信号进行处理,会导致子进程进入僵死状态.这一点该如何解决? 客户端A向服务端B发 ...

最新文章

  1. php正则表达式2,php正则表达式(2)
  2. 如何快速融入团队(八)
  3. python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例
  4. 2014北京三险一金缴存比例
  5. Android Binder机制(1501210451 张志康)
  6. Clion 2020.2 使用 C++20 等C++标准 编程
  7. PE文件结构详解(六)重定位
  8. EFCore查缺补漏(二):查询
  9. github搜索技巧_和逛知乎、刷微博一样高效使用 GitHub
  10. 5v继电器模块实物接线_电气工程师都收藏的西门子S71200PLC接线图设计大全
  11. Bootstrap(5)栅格系统
  12. 如何提高企业数据质量
  13. 为DPDK eal动态库添加新函数 ld不过的问题
  14. 51单片机C语言延时函数怎么定义和使用
  15. shell脚本基础教程,快速上手
  16. Mac系统开发常见问题-Mac登录界面多了一个其他账户选项
  17. 【电子产品】关于指纹考勤机识别率下降
  18. 畅游Python 二十二:网页开发技术方案:AJAX
  19. 非容器化Jenkins连接Kubernetes
  20. 火狐(firefox)浏览器插件开发简明教程

热门文章

  1. Very Deep Convolutional Networks for Large-scale Image Recognition(vggnet)
  2. flask-sqlalchemy分表解决方案
  3. Applied Functional Analysis(Applications to Mathematical Physics ) E.Zeidler
  4. Android中ScrollView嵌套WebView
  5. 隆重推荐一本虚拟化方面的重量级图书
  6. asp.net弹出alert提示框
  7. MySQL数据库同步神器 - Gravity - 比Datax好用
  8. 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解
  9. 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
  10. LayoutInflater.inflate()方法两个参数和三个参数