#coding=utf-8
import socket
import sys
from multiprocessing import Process
import reclass WSGIServer(object):addressFamily = socket.AF_INETsocketType = socket.SOCK_STREAMrequestQueueSize = 5def __init__(self, serverAddress):#创建一个tcp套接字self.listenSocket = socket.socket(self.addressFamily,self.socketType)#允许重复使用上次的套接字绑定的portself.listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#绑定self.listenSocket.bind(serverAddress)#变为被动,并制定队列的长度self.listenSocket.listen(self.requestQueueSize)self.servrName = "localhost"self.serverPort = serverAddress[1]def serveForever(self):'循环运行web服务器,等待客户端的链接并为客户端服务'while True:#等待新客户端到来self.clientSocket, client_address = self.listenSocket.accept()#方法2,多进程服务器,并发服务器于多个客户端newClientProcess = Process(target = self.handleRequest)newClientProcess.start()#因为创建的新进程中,会对这个套接字+1,所以需要在主进程中减去依次,即调用一次closeself.clientSocket.close()def setApp(self, application):'设置此WSGI服务器调用的应用程序入口函数'self.application = applicationdef handleRequest(self):'用一个新的进程,为一个客户端进行服务'self.recvData = self.clientSocket.recv(2014)requestHeaderLines = self.recvData.splitlines()for line in requestHeaderLines:print(line)httpRequestMethodLine = requestHeaderLines[0]getFileName = re.match("[^/]+(/[^ ]*)", httpRequestMethodLine).group(1)print("file name is ===>%s"%getFileName) #for testif getFileName[-3:] != ".py":if getFileName == '/':getFileName = documentRoot + "/index.html"else:getFileName = documentRoot + getFileNameprint("file name is ===2>%s"%getFileName) #for testtry:f = open(getFileName)except IOError:responseHeaderLines = "HTTP/1.1 404 not found\r\n"responseHeaderLines += "\r\n"responseBody = "====sorry ,file not found===="else:responseHeaderLines = "HTTP/1.1 200 OK\r\n"responseHeaderLines += "\r\n"responseBody = f.read()f.close()finally:response = responseHeaderLines + responseBodyself.clientSocket.send(response)self.clientSocket.close()else:#处理接收到的请求头self.parseRequest()#根据接收到的请求头构造环境变量字典env = self.getEnviron()#调用应用的相应方法,完成动态数据的获取bodyContent = self.application(env, self.startResponse)#组织数据发送给客户端self.finishResponse(bodyContent)def parseRequest(self):'提取出客户端发送的request'requestLine = self.recvData.splitlines()[0]requestLine = requestLine.rstrip('\r\n')self.requestMethod, self.path, self.requestVersion = requestLine.split(" ")def getEnviron(self):env = {}env['wsgi.version']      = (1, 0)env['wsgi.input']        = self.recvDataenv['REQUEST_METHOD']    = self.requestMethod    # GETenv['PATH_INFO']         = self.path             # /index.htmlreturn envdef startResponse(self, status, response_headers, exc_info=None):serverHeaders = [('Date', 'Tue, 31 Mar 2016 10:11:12 GMT'),('Server', 'WSGIServer 0.2'),]self.headers_set = [status, response_headers + serverHeaders]def finishResponse(self, bodyContent):try:status, response_headers = self.headers_set#response的第一行response = 'HTTP/1.1 {status}\r\n'.format(status=status)#response的其他头信息for header in response_headers:response += '{0}: {1}\r\n'.format(*header)#添加一个换行,用来和body进行分开response += '\r\n'#添加发送的数据for data in bodyContent:response += dataself.clientSocket.send(response)finally:self.clientSocket.close()#设定服务器的端口
serverAddr = (HOST, PORT) = '', 8888
#设置服务器静态资源的路径
documentRoot = './html'
#设置服务器动态资源的路径
pythonRoot = './wsgiPy'def makeServer(serverAddr, application):server = WSGIServer(serverAddr)server.setApp(application)return serverdef main():if len(sys.argv) < 2:sys.exit('请按照要求,指定模块名称:应用名称,例如 module:callable')#获取module:callableappPath = sys.argv[1]#根据冒号切割为module和callablemodule, application = appPath.split(':')#添加路径套sys.pathsys.path.insert(0, pythonRoot)#动态导入module变量中指定的模块module = __import__(module)#获取module变量中制定的模块的application变量指定的属性application = getattr(module, application)httpd = makeServer(serverAddr, application)print('WSGIServer: Serving HTTP on port {port} ...\n'.format(port=PORT))httpd.serveForever()if __name__ == '__main__':main()

网络动态服务器-2-传递数据给应用相关推荐

  1. ntp授时服务器(NTP网络时间服务器)应用公交数据网络

    ntp授时服务器(NTP网络时间服务器)应用公交数据网络 ntp授时服务器(NTP网络时间服务器)应用公交数据网络 随着城市经济社会发展以及人口和机动车快速增长,建设新城市交通体系,改善城市公共交通运 ...

  2. 动态加载子节点_微信小游戏开发之场景切换和常驻节点传递数据

    主题 场景切换 场景间数据传递方式 小游戏全局背景音效 特别说明 CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文档中有些知识点的 ...

  3. 服务器虚拟化架构设计,服务器虚拟化与数据中心I/O网络架构设计

    这是关于网络架构设计两部分系列中的第一篇.想了解关于在网络架构中整合I/O虚拟化方面的知识,请点击第二篇:如何将I/O虚拟化整合到网络体系架构中. 服务器虚拟化对于数据中心I/O网络架构的需求非常强烈 ...

  4. 组件通信-父组件为子组件传递数据-静态数据//动态数据 // 数据校验

    组件通信-父组件为子组件传递数据-静态数据 <!DOCTYPE html> <html lang="en"><head><meta cha ...

  5. 【Vue 组件化开发 三】父组件给子组件传递数据、组件通信(父传子、子传父)、父访问子(children、ref)、动态组件(is、component)

    目录 一.前言 完整内容请关注: 二.父组件给子组件传递数据 1.使用props属性,父组件向子组件传递数据 1.使用组件的props属性 2.向cmessage对象传值 2. props属性使用 1 ...

  6. 第三节:微信小程序模拟动态加载服务器返回json数据

    上一节虽然完成了新闻的静态展示页面,但是实际开发中,数据通常是请求服务器返回的json数据,这时候就需要页面动态加载显示服务器返回的数据. 在完成的静态页面的代码上,需要做相应的修改,首先需要编写po ...

  7. 【Android RTMP】RTMPDump 推流过程 ( 独立线程推流 | 创建推流器 | 初始化操作 | 设置推流地址 | 启用写出 | 连接 RTMP 服务器 | 发送 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. Java 层传入的 RTMP 推流地址处理 二. RTMPDump 推流线程 三. 创建 RTMP 对象 四. 初始化 RTMP 对象 五. 设置 RTMP ...

  8. 设计数据层组件并在层间传递数据

    Angela Crocker.Andy Olsen 和 Edward Jezierski Microsoft Corporation 2002年8月 适用于:     Microsoft® .NET ...

  9. 网络基础服务器 与SMP、NUMA、MPP 三大体系结构科普

    OSI和TCP/IP是很基础但又非常重要的知识,很多知识点都是以它们为基础去串联的,作为底层,掌握得越透彻,理解上层时会越顺畅.今天这篇网络基础科普,就是根据OSI层级去逐一展开的. 01 计算机网络 ...

最新文章

  1. Git命令配置学习笔记
  2. Go语言学习之旅01--变量与数据
  3. Constraint4:default约束
  4. JVM插桩之一:JVM字节码增强技术介绍及入门示例
  5. 在驱动和应用程序间共享内存
  6. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
  7. cocos2d-x-3.x 动作(5)序列动作
  8. 向量除法能用计算机吗,为什么向量没有除法
  9. java流读写_java流概述以及文件读写示例
  10. 常量池在堆还是方法区_详解Java 虚拟机(第③篇)——String 类和常量池
  11. RS232通信之C++实现---PC端
  12. bzoj 1295: [SCOI2009]最长距离(SPFA)
  13. 面向对象chapter2
  14. Scikit-Learn (1.Sklearn提供的常用数据集 - 自带的小数据集)
  15. 《信号与系统学习笔记》—信号与系统(二)
  16. Java、JSP毕业设计管理系统
  17. 手推SVM(二)-核方法
  18. project甘特图导出图片_Project2013教程-常见视图-甘特图
  19. 从JPG和JPEG图片获取压缩比详细教程
  20. 青海电大随学随考计算机,[青海电大]17秋随学随考心理学作业4题目

热门文章

  1. go语言 os.Rename() cannot move the file to a different disk drive 怎么办
  2. Java 面向对象 之 接口 火车票实例
  3. python之字符编码(二)
  4. Listview条目删除完,显示默认的图片的数据
  5. CentOs6.5 更新python2.7,以及tab自动补全
  6. 低版本wordpress运行在PHP5.4上如何关闭warning信息
  7. /proc/sys/net/ipv4 详解2
  8. spring的环境配置(beans profile=xxx)
  9. 实现 Virtual DOM 下的一个 VNode 节点
  10. 在IIS服务器上安装SSL证书