网络编程一项基本功是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实现的更多相关文章

  1. python搭建简易Web Server

    如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等.那么, Python可能帮助你,使用Python可以完成一个简单的内建 HTT ...

  2. 使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  3. 小测几种python web server的性能

    http://blog.csdn.net/raptor/article/details/8038476 因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-ws ...

  4. Python Web Server Gateway Interface -- WSGI

    了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给 ...

  5. Notes on PEP333 (Python Web Server Gateway Interface)

    This note is about PEP3333- Python Web Server Gateway Interface. Refer to (Source: http://legacy.pyt ...

  6. 【Python Programe】WSGI (Web Server Gateway Interface)

    Part1: What is a Web server? 一个位于物理服务器上的网络服务器(服务器里的服务器),等待客户端去发送request,当服务器接收到request,就会生成一个respons ...

  7. python web server gateway interface (wsgi ) notes

    前言: 注:如果需要得到支持批Python3.x以及包含了勘误表,附录,和说明的更新版规范,请查看PEP 3333 摘要: 这篇文档详细说明了一套在web服务器与Python web应用程序(web框 ...

  8. 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 ...

  9. python搭建web server

    假设你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比方:Apache,ISS等.那么, Python 可能帮助你.使用Python能够完毕一个简单的内建 HT ...

随机推荐

  1. C 位段,位域

    百度百科解释的很好,地址如下: http://baike.baidu.com/link?url=9yb5izRj6S1TzsN--EVexN7BAEzSn3jGctSgcoLTwVfaCXmtfMj3 ...

  2. [CF1087D]Minimum Diameter Tree

    link 题目大意 有$n$个点的前边权为$0$的树,你要加入$S$边权总量,可以为分数,使得当前树的直径最小. 题目分析 题目过于毒瘤,导致于最后$1$个小时一直在做此题,没想到真的只是一个结论一样 ...

  3. 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用

    题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...

  4. bzoj3205 [Apio2013]机器人

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 953  Solved: 227[Submit][Status] ...

  5. 树莓派apt-get下载网速太慢

    因为学校有ipv6的原因,当我想用ipv4的时候用apt-get发现特别慢.找了很久终于找到了解决方案: Add -o Acquire::ForceIPv4=true when running apt ...

  6. 装饰器--decorator3

    装饰器添加返回值 import time def timer(func): def wrapper(*args,**kwargs): #wrapper包装的意思 start_time = time.t ...

  7. win32/linux 线程 log

    原文 #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32 #includ ...

  8. Java设计模式の命令模式

    意图: 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化:对请求排队或记录日志,以及支持可撤销的操作 动机: 将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来. 效果: 1).c ...

  9. WebApi连接数据库

    首先在web.config中加上语句连接语句: <connectionStrings> <add name="conn" connectionString=&qu ...

  10. MyBatis操作oracle的一些问题加载

    mybatis在更新数据或者插入数据为空的时候必须指定jdbcType类型 1:传入的参数是对象类型 User user =new User(); INSERT INTO t_user ( id, u ...