2019-11-18 Python

一葡粒、49_按需返回頁(yè)面的http服務(wù)器

"""

http(超文本傳輸)協(xié)議: 基于Tcp

Tcp類似于2人通話可以接收到(穩(wěn)定);

Cdp類似于廣播, 有可能接收不到

"""

"""根據(jù)用戶的需求返回相應(yīng)的頁(yè)面"""

import socket

import re

def service_client(new_socket):

"""為客戶端返回?cái)?shù)據(jù)"""

? ? # 1漩怎、接收瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求, 即http請(qǐng)求

# -->例GET /index.html HTTP/1.1 .....

# http://127.0.0.1:7890/

# http://127.0.0.1:7890/index.html

? ? requst = new_socket.recv(1024).decode("utf-8")

"""【.decode:解碼】"""

? ? # print("-*-" * 20)

# print(requst)

? ? requst_lines = requst.splitlines()

print("")

print("-*-" *20)

print(requst_lines)

# GET / HTTP/1.1

# GET /index.html HTTP/1.1

# get post put del.....

? ? ret = re.match(r"[^/]+/([^ ]*)", requst_lines[0])

file_name =""

? ? if ret:

file_name = ret.group(1)

print("*" *50, file_name)

if file_name =="/":

file_name ='/inedx.html'

? ? # 2、返回http格式的數(shù)據(jù)給瀏覽器

? ? try:

# f = open("../buickmall/indexhtml", "rb")

? ? ? ? f =open("../buickmall" + file_name, "rb")

"""【rb:二進(jìn)制讀】"""

? ? except:

response ="HTTP/1.1 404 NOT FOUND\r\n"

? ? ? ? response +="\r\n"

? ? ? ? response +="---file not found---"

? ? ? ? new_socket.send(response.encode("utf-8"))

"""如果網(wǎng)址或(進(jìn)程)出錯(cuò)時(shí)該給用戶顯示什么"""

? ? else:

html_coutent = f.read()

f.close()

# 2.1 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Header

? ? ? ? response ="HTTP/1.1 200 OK\r\n"

? ? ? ? response +="\r\n"

? ? ? ? """【\r\n: 換行(兼容所有的瀏覽器)】"""

? ? ? ? # 2.2 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Body

# response += "

hehehe

"

# 將Response Header發(fā)送給瀏覽器

? ? ? ? new_socket.send(response.encode("utf-8"))

"""【send: 發(fā)送【encode: 編碼】"""

? ? ? ? # 將Response Body發(fā)送給瀏覽器

? ? ? ? new_socket.send(html_coutent)

# 關(guān)閉套接字

? ? new_socket.close()

def main():

"""用來(lái)整體控制"""

? ? # 1、創(chuàng)建套接字

? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

"""選擇讓服務(wù)端先關(guān)閉"""

? ? # 2谁鳍、綁定; 參數(shù)("任意服務(wù)端ip", 端口)

? ? tcp_server_socket.bind(("", 7890))

# 3、變?yōu)楸O(jiān)聽(tīng)的套接字; 【listen:最大鏈接數(shù)】

? ? tcp_server_socket.listen(128)

while True:

# 4轩性、等待新客戶端的連接; 變量[新客戶端的套接字, 客戶端的IP和媳、端口]

? ? ? ? new_socket, client_addr = tcp_server_socket.accept()

# 5格遭、為這個(gè)客戶端服務(wù)

? ? ? ? service_client(new_socket)

# 6、關(guān)閉監(jiān)聽(tīng)套接字

? ? tcp_server_socket.close(new_socket)

if __name__ =='__main__':

main()

二留瞳、50_http協(xié)議復(fù)習(xí)

請(qǐng)求和響應(yīng)都會(huì)分頭和體

三拒迅、51_多進(jìn)程服務(wù)器

"""使用多進(jìn)程完成http服務(wù)器"""

import multiprocessing

"""導(dǎo)入多進(jìn)程包"""

import socket

import re

"""線程間共享全局變量; 進(jìn)程間不共享"""

def service_client(new_socket):

"""為客戶端返回?cái)?shù)據(jù)"""

? ? # 1、接收瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求, 即http請(qǐng)求

# -->例GET /index.html HTTP/1.1 .....

# http://127.0.0.1:7890/

# http://127.0.0.1:7890/index.html

? ? requst = new_socket.recv(1024).decode("utf-8")

"""【.decode:解碼】"""

? ? # print("-*-" * 20)

# print(requst)

? ? requst_lines = requst.splitlines()

print("")

print("-*-" *20)

print(requst_lines)

# GET / HTTP/1.1

# GET /index.html HTTP/1.1

# get post put del.....

? ? ret = re.match(r"[^/]+/([^ ]*)", requst_lines[0])

file_name =""

? ? if ret:

file_name = ret.group(1)

print("*" *50, file_name)

if file_name =="/":

file_name ='/inedx.html'

? ? # 2撼港、返回http格式的數(shù)據(jù)給瀏覽器

? ? try:

# f = open("../buickmall/indexhtml", "rb")

? ? ? ? f =open("../buickmall" + file_name, "rb")

"""【rb:二進(jìn)制讀】"""

? ? except:

response ="HTTP/1.1 404 NOT FOUND\r\n"

? ? ? ? response +="\r\n"

? ? ? ? response +="---file not found---"

? ? ? ? new_socket.send(response.encode("utf-8"))

"""如果網(wǎng)址或(進(jìn)程)出錯(cuò)時(shí)該給用戶顯示什么"""

? ? else:

html_coutent = f.read()

f.close()

# 2.1 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Header

? ? ? ? response ="HTTP/1.1 200 OK\r\n"

? ? ? ? response +="\r\n"

? ? ? ? """【\r\n: 換行(兼容所有的瀏覽器)】"""

? ? ? ? # 2.2 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Body

# response += "

hehehe

"

# 將Response Header發(fā)送給瀏覽器

? ? ? ? new_socket.send(response.encode("utf-8"))

"""【send: 發(fā)送【encode: 編碼】"""

? ? ? ? # 將Response Body發(fā)送給瀏覽器

? ? ? ? new_socket.send(html_coutent)

# 關(guān)閉套接字

? ? new_socket.close()

def main():

"""用來(lái)整體控制"""

? ? # 1坪它、創(chuàng)建套接字

? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

"""選擇讓服務(wù)端先關(guān)閉"""

? ? # 2、綁定; 參數(shù)("任意服務(wù)端ip", 端口)

? ? tcp_server_socket.bind(("", 7890))

# 3帝牡、變?yōu)楸O(jiān)聽(tīng)的套接字; 【listen:最大鏈接數(shù)】

? ? tcp_server_socket.listen(128)

while True:

# 4往毡、等待新客戶端的連接; 變量[新客戶端的套接字, 客戶端的IP、端口]

? ? ? ? new_socket, client_addr = tcp_server_socket.accept()

# 5靶溜、為這個(gè)客戶端服務(wù)

? ? ? ? p = multiprocessing.process(target=service_client, args=(new_socket,))

"""作用: 創(chuàng)建一個(gè)子進(jìn)程【args里面的是元組, 所以要加一個(gè)逗號(hào)"""

? ? ? ? p.start()

new_socket.close()

# 6开瞭、關(guān)閉監(jiān)聽(tīng)套接字

? ? tcp_server_socket.close(new_socket)

if __name__ =='__main__':

main()

四、52_多線程服務(wù)器

"""使用多線程完成http服務(wù)器"""

import threading

"""導(dǎo)入線程包"""

import socket

import re

"""線程間共享全局變量; 進(jìn)程間不共享"""

def service_client(new_socket):

"""為客戶端返回?cái)?shù)據(jù)"""

? ? # 1罩息、接收瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求, 即http請(qǐng)求

# -->例GET /index.html HTTP/1.1 .....

# http://127.0.0.1:7890/

# http://127.0.0.1:7890/index.html

? ? requst = new_socket.recv(1024).decode("utf-8")

"""【.decode:解碼】"""

? ? # print("-*-" * 20)

# print(requst)

? ? requst_lines = requst.splitlines()

print("")

print("-*-" *20)

print(requst_lines)

# GET / HTTP/1.1

# GET /index.html HTTP/1.1

# get post put del.....

? ? ret = re.match(r"[^/]+/([^ ]*)", requst_lines[0])

file_name =""

? ? if ret:

file_name = ret.group(1)

print("*" *50, file_name)

if file_name =="/":

file_name ='/inedx.html'

? ? # 2嗤详、返回http格式的數(shù)據(jù)給瀏覽器

? ? try:

# f = open("../buickmall/indexhtml", "rb")

? ? ? ? f =open("../buickmall" + file_name, "rb")

"""【rb:二進(jìn)制讀】"""

? ? except:

response ="HTTP/1.1 404 NOT FOUND\r\n"

? ? ? ? response +="\r\n"

? ? ? ? response +="---file not found---"

? ? ? ? new_socket.send(response.encode("utf-8"))

"""如果網(wǎng)址或(進(jìn)程)出錯(cuò)時(shí)該給用戶顯示什么"""

? ? else:

html_coutent = f.read()

f.close()

# 2.1 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Header

? ? ? ? response ="HTTP/1.1 200 OK\r\n"

? ? ? ? response +="\r\n"

? ? ? ? """【\r\n: 換行(兼容所有的瀏覽器)】"""

? ? ? ? # 2.2 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Body

# response += "

hehehe

"

# 將Response Header發(fā)送給瀏覽器

? ? ? ? new_socket.send(response.encode("utf-8"))

"""【send: 發(fā)送【encode: 編碼】"""

? ? ? ? # 將Response Body發(fā)送給瀏覽器

? ? ? ? new_socket.send(html_coutent)

# 關(guān)閉套接字

? ? new_socket.close()

def main():

"""用來(lái)整體控制"""

? ? # 1、創(chuàng)建套接字

? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

"""選擇讓服務(wù)端先關(guān)閉"""

? ? # 2瓷炮、綁定; 參數(shù)("任意服務(wù)端ip", 端口)

? ? tcp_server_socket.bind(("", 7890))

# 3葱色、變?yōu)楸O(jiān)聽(tīng)的套接字; 【listen:最大鏈接數(shù)】

? ? tcp_server_socket.listen(128)

while True:

# 4、等待新客戶端的連接; 變量[新客戶端的套接字, 客戶端的IP娘香、端口]

? ? ? ? new_socket, client_addr = tcp_server_socket.accept()

# 5苍狰、為這個(gè)客戶端服務(wù)

? ? ? ? p = threading.Thread(target=service_client, args=(new_socket,))

"""作用: 創(chuàng)建一個(gè)子進(jìn)程【args里面的是元組, 所以要加一個(gè)逗號(hào)"""

? ? ? ? p.start()

# new_socket.close()

# 6办龄、關(guān)閉監(jiān)聽(tīng)套接字

? ? tcp_server_socket.close(new_socket)

if __name__ =='__main__':

main()

五、53_協(xié)程服務(wù)器

"""使用gevent來(lái)實(shí)現(xiàn)http服務(wù)器"""

import gevent

from geventimport monkey

monkey.patch_all()

"""導(dǎo)入?yún)f(xié)程包等資源"""

import socket

import re

"""線程間共享全局變量; 進(jìn)程間不共享"""

def service_client(new_socket):

"""為客戶端返回?cái)?shù)據(jù)"""

? ? # 1淋昭、接收瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求, 即http請(qǐng)求

# -->例GET /index.html HTTP/1.1 .....

# http://127.0.0.1:7890/

# http://127.0.0.1:7890/index.html

? ? requst = new_socket.recv(1024).decode("utf-8")

"""【.decode:解碼】"""

? ? # print("-*-" * 20)

# print(requst)

? ? requst_lines = requst.splitlines()

print("")

print("-*-" *20)

print(requst_lines)

# GET / HTTP/1.1

# GET /index.html HTTP/1.1

# get post put del.....

? ? ret = re.match(r"[^/]+/([^ ]*)", requst_lines[0])

file_name =""

? ? if ret:

file_name = ret.group(1)

print("*" *50, file_name)

if file_name =="/":

file_name ='/inedx.html'

? ? # 2俐填、返回http格式的數(shù)據(jù)給瀏覽器

? ? try:

# f = open("../buickmall/indexhtml", "rb")

? ? ? ? f =open("../buickmall" + file_name, "rb")

"""【rb:二進(jìn)制讀】"""

? ? except:

response ="HTTP/1.1 404 NOT FOUND\r\n"

? ? ? ? response +="\r\n"

? ? ? ? response +="---file not found---"

? ? ? ? new_socket.send(response.encode("utf-8"))

"""如果網(wǎng)址或(進(jìn)程)出錯(cuò)時(shí)該給用戶顯示什么"""

? ? else:

html_coutent = f.read()

f.close()

# 2.1 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Header

? ? ? ? response ="HTTP/1.1 200 OK\r\n"

? ? ? ? response +="\r\n"

? ? ? ? """【\r\n: 換行(兼容所有的瀏覽器)】"""

? ? ? ? # 2.2 準(zhǔn)備給瀏覽器發(fā)送的數(shù)據(jù) :Body

# response += "

hehehe

"

# 將Response Header發(fā)送給瀏覽器

? ? ? ? new_socket.send(response.encode("utf-8"))

"""【send: 發(fā)送【encode: 編碼】"""

? ? ? ? # 將Response Body發(fā)送給瀏覽器

? ? ? ? new_socket.send(html_coutent)

# 關(guān)閉套接字

? ? new_socket.close()

def main():

"""用來(lái)整體控制"""

? ? # 1、創(chuàng)建套接字

? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

"""選擇讓服務(wù)端先關(guān)閉"""

? ? # 2翔忽、綁定; 參數(shù)("任意服務(wù)端ip", 端口)

? ? tcp_server_socket.bind(("", 7890))

# 3英融、變?yōu)楸O(jiān)聽(tīng)的套接字; 【listen:最大鏈接數(shù)】

? ? tcp_server_socket.listen(128)

while True:

# 4、等待新客戶端的連接; 變量[新客戶端的套接字, 客戶端的IP歇式、端口]

? ? ? ? new_socket, client_addr = tcp_server_socket.accept()

# 5驶悟、為這個(gè)客戶端服務(wù)

? ? ? ? gevent.spawn(target=service_client, args=(new_socket,))

"""作用: 創(chuàng)建一個(gè)子進(jìn)程【args里面的是元組, 所以要加一個(gè)逗號(hào)"""

? ? ? ? # new_socket.close()

# 6、關(guān)閉監(jiān)聽(tīng)套接字

? ? tcp_server_socket.close(new_socket)

if __name__ =='__main__':

main()

六贬丛、54_單進(jìn)程單線程非阻塞并發(fā)服務(wù)器

"""單進(jìn)程單線程非阻塞"""

import socket

import time

# 1撩银、創(chuàng)建一個(gè)Tcp服務(wù)端

tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

tcp_server_socket.bind(("", 7890))

"""綁定端口"""

tcp_server_socket.listen(128)

"""把套接字變?yōu)楸O(jiān)聽(tīng)的; 【listen(x):同時(shí)可以有x個(gè)客戶端連接】"""

tcp_server_socket.setblocking(False)

"""

【.recv():阻塞】

【.setblocking(False):設(shè)置套接字為非阻塞的方式】

"""

client_soket_list =list()

"""設(shè)置一個(gè)客戶端的空列表"""

while True:

time.sleep(1)

try:

# 2、阻塞中等待客戶端連接

? ? ? ? new_socket, new_addr = tcp_server_socket.accept()

except Exception as ret:

print("---沒(méi)有新的客戶端到來(lái)---")

else:

print("---只要沒(méi)有產(chǎn)生異常,就表明來(lái)了一個(gè)新的客戶端---")

new_socket.setblocking(False)

"""設(shè)置套接字為非阻塞的方式"""

? ? ? ? client_soket_list.append(new_socket)

for client_soketin client_soket_list:

try:

recv_data = new_socket.recv(1024).decode("utf-8")

"""【接收】:每次接收x個(gè)字節(jié)"""

? ? ? ? except Exception as ret:

# print(ret)? #方便用于進(jìn)行調(diào)試

? ? ? ? ? ? print("---這個(gè)客戶端沒(méi)有發(fā)送過(guò)來(lái)數(shù)據(jù)---")

else:

print("---沒(méi)有異常---")

print(recv_data)

if recv_data:

# 對(duì)方發(fā)送過(guò)來(lái)數(shù)據(jù)

? ? ? ? ? ? ? ? print("---客戶端發(fā)送過(guò)來(lái)了數(shù)據(jù)---")

else:

# 對(duì)方調(diào)用了close導(dǎo)致recv返回

? ? ? ? ? ? ? ? client_soket_list.remove(client_soket)

client_soket.close()

print("---客戶端已經(jīng)關(guān)閉了---")

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豺憔,一起剝皮案震驚了整個(gè)濱河市额获,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恭应,老刑警劉巖抄邀,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昼榛,居然都是意外死亡境肾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門胆屿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奥喻,“玉大人,你說(shuō)我怎么就攤上這事非迹』防穑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵憎兽,是天一觀的道長(zhǎng)冷离。 經(jīng)常有香客問(wèn)我,道長(zhǎng)纯命,這世上最難降的妖魔是什么西剥? 我笑而不...
    開(kāi)封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮亿汞,結(jié)果婚禮上瞭空,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好匙铡,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布图甜。 她就那樣靜靜地躺著,像睡著了一般鳖眼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚼摩,一...
    開(kāi)封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天钦讳,我揣著相機(jī)與錄音,去河邊找鬼枕面。 笑死愿卒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潮秘。 我是一名探鬼主播琼开,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼枕荞!你這毒婦竟也來(lái)了柜候?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤躏精,失蹤者是張志新(化名)和其女友劉穎渣刷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矗烛,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辅柴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞭吃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碌嘀。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歪架,靈堂內(nèi)的尸體忽然破棺而出股冗,到底是詐尸還是另有隱情,我是刑警寧澤牡拇,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布魁瞪,位于F島的核電站,受9級(jí)特大地震影響惠呼,放射性物質(zhì)發(fā)生泄漏导俘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一剔蹋、第九天 我趴在偏房一處隱蔽的房頂上張望旅薄。 院中可真熱鬧,春花似錦、人聲如沸少梁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凯沪。三九已至第焰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妨马,已是汗流浹背挺举。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烘跺,地道東北人湘纵。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滤淳,于是被迫代替她去往敵國(guó)和親梧喷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361