Python實現簡單的HTTP協議

1、HTTP簡介
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。

2、HTPP原理
HTTP協議工作於客戶端-服務端架構上。瀏覽器作爲HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。
Web服務器有:Apache服務器,IIS服務器(Internet Information Services)等。Web服務器根據接收到的請求後,向客戶端發送響應信息。HTTP默認端口號爲80,但是你也可以改爲8080或者其他端口。
HTTP三點注意事項:
HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
HTTP是媒體獨立的:這意味着,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
在這裏插入圖片描述2、使用Python實現簡單的操作
http服務端

import socket
def Create_server():
    sockdf = socket.socket()
    sockdf.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    # 設置端口立即重啓
    sockdf.bind(('0.0.0.0', 8000))
    sockdf.listen(5)
    return sockdf


def read_html():
    f = open('index.html', 'r')
    return f.read()


def request(data, conndf):
    if not data:
        return
    data = data.split(' ')
    if data[1] == '/':
       response = "HTTP/1.1 200 OK\r\n"
       response += "Content-Type:text/html\r\n"
       response += "\r\n"
       response += read_html()
    else:
        response = "HTTP/1.1 404 Not Found\r\n"
        response += "Content-Type:text/html\r\n"
        response += "\r\n"
        response += "<h1>Sorry.......<h1>"

    conndf.send(response.encode())


def Server():
    sockdf = Create_server()
    print('Waiting Connect..........')
    while True:
        try:
            conndf, addr = sockdf.accept()
        except KeyboardInterrupt as e:
            break
        data = conndf.recv(2048)
        print("Connect from {0}".format(addr))
        request(data.decode(), conndf)


Server()

http客戶端測試

import socket
sockdf = socket.socket()        # 創建套接字
# 設置端口立即重用
sockdf.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sockdf.bind(('0.0.0.0', 8888))  # 綁定地址
sockdf.listen(5)        # 監聽
print('Waiting connect......')
conndf, addr = sockdf.accept()  # 等待客戶端的連接
print("connect from:{0}".format(addr))
data = conndf.recv(1024)    # 收信息
print(data.decode())
# 組織http響應
response = """HTTP/1.1 200 OK
Content-Type:text/html;charset=utf-8

你好    
"""
conndf.send(response.encode())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章