简易web server之python实现
网络编程一项基本功是socket编程,包括TCP socket,UDP socket的客户端、服务器端编程。
应用层的各路协议如http,smtp,telnet,ftp等都依赖于传输层的TCP或者UDP,具体讲就是这两种socket为应用层提供传输功能。
利用tcp socket能编写web server,它处理client端发起的http请求,然后发送响应。
TCP是面向连接的协议,也就是发送数据前需要双方发送控制字来建立连接(俗称三次握手),是client和server上的一个「欢迎套接字」进行通信,当成功连接上后,server端生成一个「连接套接字」,专门用于和这个客户互相发送数据。连接套接字和欢迎套接字是同一进程中不同线程,这样一来只有一个进程因此端口需要做出改变。高性能的web server一般都是这么搞的。
接下来我们动手写个web server
比如《计算机网络——自顶向下方法》第二章的一个题目:
用python开发一个简单web server,它仅能处理一个请求:当用户连接时创建套接字;从这个连接接受HTTP请求;解释该请求以确定所请求的文件;从服务器文件系统中获得请求的文件;创建一个由请求的文件组成的HTTP响应报文;经TCP连接想请求的浏览器发送响应。若请求的文件不存在则返回“404 not found”
不难写出答案:
#coding:utf-8
from socket import *
host = '' #对应本机所有ip地址
port = 8899 #TCP socket端口
address = (host, port)
serverSocket = socket(AF_INET, SOCK_STREAM) #创建TCP socket
serverSocket.bind(address) #绑定地址
serverSocket.listen(1) #开始监听
while True:
try:
connectionSocket, clientAddr = serverSocket.accept() #获取「连接套接字」
message = connectionSocket.recv(1024) #获得http报文
filename = message.split()[1] #获得URI,去掉首部'/'就是文件名
f = open(filename[1:])
outputdata = f.readlines() #逐行读出文件内容并存到list中
connectionSocket.send('HTTP/1.1 200 OK\r\n\r\n') #发response行
for i in range(0, len(outputdata)):
connectionSocket.send(outputdata) #把文件各行数据塞到response中
connectionSocket.close() #关闭数据连接
except IOError:
connectionSocket.send("404 not found") #文件不存在时异常处理
connectionSocket.close()
serverSocket.close()
简易web server之python实现的更多相关文章
- python搭建简易Web Server
如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等.那么, Python可能帮助你,使用Python可以完成一个简单的内建 HTT ...
- 使用Python创建一个简易的Web Server
Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...
- 小测几种python web server的性能
http://blog.csdn.net/raptor/article/details/8038476 因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-ws ...
- Python Web Server Gateway Interface -- WSGI
了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给 ...
- Notes on PEP333 (Python Web Server Gateway Interface)
This note is about PEP3333- Python Web Server Gateway Interface. Refer to (Source: http://legacy.pyt ...
- 【Python Programe】WSGI (Web Server Gateway Interface)
Part1: What is a Web server? 一个位于物理服务器上的网络服务器(服务器里的服务器),等待客户端去发送request,当服务器接收到request,就会生成一个respons ...
- python web server gateway interface (wsgi ) notes
前言: 注:如果需要得到支持批Python3.x以及包含了勘误表,附录,和说明的更新版规范,请查看PEP 3333 摘要: 这篇文档详细说明了一套在web服务器与Python web应用程序(web框 ...
- a simple and universal interface between web servers and web applications or frameworks: the Python Web Server Gateway Interface (WSGI).
WSGI is the Web Server Gateway Interface. It is a specification that describes how a web server comm ...
- python搭建web server
假设你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比方:Apache,ISS等.那么, Python 可能帮助你.使用Python能够完毕一个简单的内建 HT ...
随机推荐
- MapReduce(二)常用三大组件
mapreduce三大组件:Combiner\Sort\Partitioner 默认组件:排序,分区(不设置,系统有默认值) 一.mapreduce中的Combiner 1.什么是combiner C ...
- day5-python基础
- ctsc2009 移民站选址
分析:非常非常好的一道题! 首先需要对问题进行转化: 行列无关,对于行单独处理,对于列单独处理 必然存在一个最优方案使得每一个新站与旧站重合. 转化1很显然,对于转化2,是一类非常经典的“中位数问题” ...
- jeecms上传文件限制导致413-Request Entity Too Large
1:spring mvc 上传限制大小 配置是否允许在上传文件的大小 <bean id="multipartResolver" class="org.spring ...
- powerdesigner中把表的描述复制到Name
'****************************************************************************** '* File: comment2nam ...
- 解决vue路由与锚点冲突
传统的锚点定位会与vue-router中的路由设置存在冲突,解决方法自定义锚点跳转: html: <ul> <li><a href="" @click ...
- hdu 1846 Brave Gam
Brave Game http://acm.hdu.edu.cn/showproblem.php?pid=1846 Time Limit: 1000/1000 MS (Java/Others) ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
- 【代码优化】调用optional delegates的最佳方法
[转载请注明出处]http://www.cnblogs.com/lexingyu/p/3932475.html 本文是以下两篇blog的综合脱水,感谢两位作者为解放码农生产力所做的深入思考=.= Sm ...
- Java 中的几种线程池这么用才是对的
为什么要使用线程池 虽然大家应该都已经很清楚了,但还是说一下.其实归根结底最主要的一个原因就是为了提高性能. 线程池和数据库连接池是同样的道理,数据库连接池是为了减少连接建立和释放带来的性能开销.而线 ...