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.
  • 相关阅读:
    /etc/alternatives
    linux Link
    JVM程序计数器
    面向对象的内存分析
    SpringBoot项目简单实现给邮箱发送验证码
    注解式SQL Select语句判空
    SQL Update时参数判空:传入参数为空时不更新对应字段,不为空时才更新
    MySQL数据库误Update找回数据的方法
    用户-角色-权限系统概述
    将一个数组转换为List
  • 原文地址:https://www.cnblogs.com/zjutzz/p/4298865.html
Copyright © 2011-2022 走看看