zoukankan      html  css  js  c++  java
  • 简易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
    
    ')	#发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()
    
    Greatness is never a given, it must be earned.
  • 相关阅读:
    git常用指令 github版本回退 reset
    三门问题 概率论
    如何高效的学习高等数学
    数据库6 关系代数(relational algebra) 函数依赖(functional dependency)
    数据库5 索引 动态哈希(Dynamic Hashing)
    数据库4 3层结构(Three Level Architecture) DBA DML DDL DCL DQL
    梦想开始的地方
    java String字符串转对象实体类
    java 生成图片验证码
    java 对象之间相同属性进行赋值
  • 原文地址:https://www.cnblogs.com/zjutzz/p/4298865.html
Copyright © 2011-2022 走看看