簡易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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM