bs架构的系统能连接mysql吗_HTTP、BS架构
Django 底層原理
快捷鍵
方向鍵
方向鍵本鍵如果活動(dòng)選項(xiàng)是選項(xiàng)按鈕或文件則為移動(dòng)焦點(diǎn);
方向鍵 + Win鍵(簡(jiǎn)稱Win鍵)使窗口全屏、最小化、靠左半邊、靠右半邊(部分版本不支持);
方向鍵+Shift鍵將連續(xù)的文字或文件選中
方向鍵(左右)+Ctrl鍵 在英文單詞或中文詞語間跳躍
方向鍵(上下)+Ctrl鍵 在段落開頭間跳躍
按Home(定位到行首)然后按Shift+End(行尾)或者 然后按Shift+↓ (下一行這個(gè)位置)
或者 按End(定位到行尾)然后按Shift+Home
ctrl
Ctrl+b 粗體 Bold
Ctrl+e 居中對(duì)齊 Encenter
Ctrl+f 查找 Find
Ctrl+h 替換 Huan
Ctrl+k 超級(jí)鏈接 King Link
win
Win鍵+E打開Windows資源管理器Explorer【即我的電腦、計(jì)算機(jī)】
Win鍵+R:運(yùn)行
Win鍵+Shift+S:Windows 自帶截圖
win鍵+PrtScSysRq鍵 快速截屏
HTTP
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議。HTTP是萬維網(wǎng)WEB的數(shù)據(jù)通信的基礎(chǔ)。
現(xiàn)今廣泛使用的一個(gè)版本——HTTP 1.1(已更新至2.0)
HTTP工作原理
HTTP協(xié)議定義Web客戶端如何從Web服務(wù)器請(qǐng)求Web頁面,以及服務(wù)器如何把Web頁面?zhèn)魉徒o客戶端。
HTTP協(xié)議采用了請(qǐng)求/響應(yīng)模型。
客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文,請(qǐng)求報(bào)文包含請(qǐng)求的方法、URL、協(xié)議版本、請(qǐng)求頭部和請(qǐng)求數(shù)據(jù)。服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng),響應(yīng)的內(nèi)容包括協(xié)議的版本、成功或者錯(cuò)誤代碼、服務(wù)器信息、響應(yīng)頭部和響應(yīng)數(shù)據(jù)。
響應(yīng)報(bào)文:比如"HTTP/1.1 200 OK"
以下是 HTTP 請(qǐng)求/響應(yīng)的步驟:
客戶端連接到Web服務(wù)器
一個(gè)HTTP客戶端,通常是瀏覽器,與Web服務(wù)器的HTTP端口(默認(rèn)為80)建立一個(gè)TCP套接字連接。例如,http://www.luffycity.com。
發(fā)送HTTP請(qǐng)求
通過TCP套接字,客戶端向Web服務(wù)器發(fā)送一個(gè)文本的請(qǐng)求報(bào)文,一個(gè)請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求頭部、空行和請(qǐng)求數(shù)據(jù)4部分組成。
服務(wù)器接受請(qǐng)求并返回HTTP響應(yīng)
Web服務(wù)器解析請(qǐng)求,定位請(qǐng)求資源。服務(wù)器將資源復(fù)本寫到TCP套接字,由客戶端讀取。一個(gè)響應(yīng)由狀態(tài)行、響應(yīng)頭部、空行和響應(yīng)數(shù)據(jù)4部分組成。
釋放連接TCP連接
若connection 模式為 close(無連接),則服務(wù)器主動(dòng)關(guān)閉TCP連接,客戶端被動(dòng)關(guān)閉連接,釋放TCP連接;若 connection 模式為 keepalive(短連接),則該連接會(huì)保持一段時(shí)間,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求;
客戶端瀏覽器解析HTML內(nèi)容
客戶端瀏覽器首先解析狀態(tài)行,查看表明請(qǐng)求是否成功的狀態(tài)代碼。然后解析每一個(gè)響應(yīng)頭,響應(yīng)頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法對(duì)其進(jìn)行格式化,并在瀏覽器窗口中顯示。
例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后會(huì)經(jīng)歷以下流程:
瀏覽器向 DNS 服務(wù)器請(qǐng)求解析該 URL 中的域名所對(duì)應(yīng)的 IP 地址;
域名(英語:Domain Name),又稱網(wǎng)域,是由一串用點(diǎn)分隔的名字組成的Internet上某一臺(tái)計(jì)算機(jī)或計(jì)算機(jī)組的名稱,用于在數(shù)據(jù)傳輸時(shí)對(duì)計(jì)算機(jī)的定位標(biāo)識(shí)(有時(shí)也指地理位置)。
由于IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質(zhì)等缺點(diǎn),人們?cè)O(shè)計(jì)出了域名,并通過域名服務(wù)器(DNS,Domain Name System)來將域名和IP地址相互映射,使人更方便地訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP地址數(shù)串。
解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立TCP連接;
瀏覽器發(fā)出讀取文件(URL 中域名后面部分對(duì)應(yīng)的路徑(文件))的HTTP 請(qǐng)求,該請(qǐng)求報(bào)文作為 TCP 三次握手中第三次握手(由客戶端發(fā)送)時(shí)的報(bào)文數(shù)據(jù)發(fā)送給服務(wù)器;
服務(wù)器對(duì)瀏覽器請(qǐng)求作出響應(yīng),并把對(duì)應(yīng)的 html 文本發(fā)送給瀏覽器;
釋放 TCP連接;
瀏覽器將該 html 文本渲染并顯示內(nèi)容;
HTTP特點(diǎn):
基于 請(qǐng)求-響應(yīng) 的模式
HTTP協(xié)議規(guī)定,請(qǐng)求從客戶端發(fā)出,最后服務(wù)器端響應(yīng)該請(qǐng)求并返回。換句話說,肯定是先從客戶端開始建立通信的,服務(wù)器端在沒有接收到請(qǐng)求之前不會(huì)發(fā)送響應(yīng)
無狀態(tài)保存
概念:
HTTP是一種不保存狀態(tài),即無狀態(tài)(stateless)協(xié)議,即HTTP協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。
只要連接中斷,就撤銷當(dāng)前所有信息,即每次開始時(shí)都是個(gè)完全空白的狀態(tài)
目的:
為了更快地處理大量事務(wù),確保協(xié)議的可伸縮性,而特意把HTTP協(xié)議設(shè)計(jì)成如此簡(jiǎn)單的。
弊端:
信息的不存儲(chǔ),對(duì)于必須要存儲(chǔ)某些信息的網(wǎng)站來說,意味著:
我輸入一個(gè)網(wǎng)頁并回車,一個(gè)套接字返回我要訪問的html,然后他就走了,然后當(dāng)我要進(jìn)行登陸操作時(shí),又來了一個(gè)套接字接待我,給我返回登陸的網(wǎng)頁,然后他也走了。我在輸入完信息后回車進(jìn)行登陸,又一個(gè)套接字過來拿著我的請(qǐng)求中的信息去數(shù)據(jù)庫里進(jìn)行比對(duì),檢驗(yàn)完后,它就走了,臨走前返回我一個(gè)登陸成功,這時(shí),如果我要進(jìn)行基于用戶的操作時(shí),一個(gè)新的套接字過來說,你還沒登陸啊,怎么能進(jìn)行這個(gè)操作,我....
基于上述情況,cookie由此誕生。
無連接
概念:
無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。
目的:
采用這種方式可以節(jié)省傳輸時(shí)間,并且可以提高并發(fā)性能,不能和每個(gè)用戶建立長久的連接,請(qǐng)求一次響應(yīng)一次,服務(wù)端和客戶端就中斷了。
優(yōu)勢(shì):
適用于重瀏覽型網(wǎng)頁,騰出線程來接待新用戶,防止占用套接字不發(fā)請(qǐng)求的用戶。
短連接:
概念:
HTTP/1.1 版本之后,采用的是短連接的方式:即套接字響應(yīng)完后,不會(huì)馬上關(guān)閉,而是等待幾秒鐘的時(shí)間(程序員可以自行設(shè)定),如果客戶端在這段時(shí)間內(nèi)沒有響應(yīng)的話,才會(huì)斷開。
目的
這樣做的主要目的還是為了節(jié)省時(shí)間,因?yàn)橹匦聞?chuàng)建套接字也是需要時(shí)間的,目前默認(rèn)3s左右。對(duì)于一個(gè)連續(xù)操作的客戶端來說,如果他在短時(shí)間內(nèi)點(diǎn)擊了html中的很多選項(xiàng),這樣每次服務(wù)器都需要?jiǎng)?chuàng)建一個(gè)套接字來接待他,僅創(chuàng)建套接字的時(shí)間就足以拖垮效率。
而對(duì)于一個(gè)操作間隔很長的客戶端來說,無連接很明顯是個(gè)足夠優(yōu)秀的選擇
短連接等待時(shí)間
網(wǎng)站根據(jù)自己網(wǎng)站用戶的行為來分析統(tǒng)計(jì)出一個(gè)最優(yōu)的等待時(shí)間。
優(yōu)勢(shì):
適用于強(qiáng)操作性網(wǎng)頁,可以防止單個(gè)用戶短時(shí)間就占用多個(gè)套接字(因?yàn)闊o連接的方式,套接字響應(yīng)完請(qǐng)求就自行關(guān)閉了,所以新的請(qǐng)求就要重新建立套接字)。
因此,無連接、短連接沒有絕對(duì)的優(yōu)劣,主要還是看客戶端需求。
HTTP請(qǐng)求方法
get 拿數(shù)據(jù)
post 發(fā)數(shù)據(jù)
報(bào)文格式
請(qǐng)求報(bào)文
響應(yīng)報(bào)文
通過GET方式提交數(shù)據(jù)時(shí),請(qǐng)求數(shù)據(jù)(頁面提交的信息)會(huì)放在原路徑后,并與原路徑組成一個(gè)新的路徑部分,因此get方式提交時(shí)路徑部分不止有路徑,且后面的請(qǐng)求數(shù)據(jù)部分一定為空。
這種形式還會(huì)出現(xiàn)一個(gè)問題就是:
客戶端第一次訪問服務(wù)器時(shí),通常是以域名的形式訪問的,之后就通過點(diǎn)擊超鏈接或敲回車自動(dòng)轉(zhuǎn)載網(wǎng)頁的形式訪問服務(wù)器的其他頁面。
上述后者是以URL{域名(或ip)+路徑}的形式訪問服務(wù)器的,這就意味著,頁面在訪問服務(wù)器時(shí),域名+路徑會(huì)直接顯示在瀏覽器網(wǎng)址欄,即用戶的請(qǐng)求數(shù)據(jù)會(huì)以明文形式顯示在網(wǎng)址欄,這對(duì)于用戶的個(gè)人數(shù)據(jù)等信息來說是不能接受的。
GET方式以?分割路徑和請(qǐng)求數(shù)據(jù),請(qǐng)求數(shù)據(jù)中的參數(shù)之間以&相連,如EditBook?name=test1&id=123456.(請(qǐng)求頭里面那個(gè)content-type做的這種參數(shù)形式,后面講) POST方法是把頁面提交的數(shù)據(jù)放在HTTP包的請(qǐng)求數(shù)據(jù)中。
GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長度有限制),而POST方法提交的數(shù)據(jù)沒有限制.
GET與POST請(qǐng)求在服務(wù)端獲取請(qǐng)求數(shù)據(jù)方式不同,就是我們自己在服務(wù)端取請(qǐng)求數(shù)據(jù)的時(shí)候的方式不同了,這句廢話昂。
HTTP狀態(tài)碼
所有HTTP響應(yīng)的第一行都是狀態(tài)行,依次是當(dāng)前HTTP版本號(hào),3位數(shù)字組成的狀態(tài)代碼,以及描述狀態(tài)的短語,彼此由空格分隔。比如"HTTP/1.1 200 OK"
狀態(tài)代碼的第一個(gè)數(shù)字代表當(dāng)前響應(yīng)的類型:
1xx消息——請(qǐng)求已被服務(wù)器接收,繼續(xù)處理
2xx成功——請(qǐng)求已成功被服務(wù)器接收、理解、并接受(沒問題)
3xx重定向——需要后續(xù)操作才能完成這一請(qǐng)求
4xx請(qǐng)求錯(cuò)誤——請(qǐng)求含有詞法錯(cuò)誤或者無法被執(zhí)行(客戶端請(qǐng)求出現(xiàn)問題)
5xx服務(wù)器錯(cuò)誤——服務(wù)器在處理某個(gè)正確請(qǐng)求時(shí)發(fā)生錯(cuò)誤(服務(wù)器出現(xiàn)問題)
URL
超文本傳輸協(xié)議(HTTP)的統(tǒng)一資源定位符將從因特網(wǎng)獲取信息的五個(gè)基本元素包括在一個(gè)簡(jiǎn)單的地址中(即一個(gè)完整的網(wǎng)頁):
傳送協(xié)議(http/https(http基礎(chǔ)上進(jìn)行加密,提升安全性))。
層級(jí)URL標(biāo)記符號(hào)(為[//],固定不變)
訪問資源需要的憑證信息(可省略)
服務(wù)器。(通常為域名,有時(shí)為IP地址)
端口號(hào)。(以數(shù)字方式表示,若為HTTP的默認(rèn)值“:80”可省略)
路徑。(以“/”字符區(qū)別路徑中的每一個(gè)目錄名稱,第一個(gè)/前就是域名(或IP)
查詢。(GET模式的窗體參數(shù),以“?”字符為起點(diǎn),每個(gè)參數(shù)以“&”隔開,再以“=”分開參數(shù)名稱與數(shù)據(jù),通常以UTF8的URL編碼,避開字符沖突的問題)
片段。以“#”字符為起點(diǎn)
以http://www.luffycity.com:80/news/index.html?id=250&page=1 為例,
其中:
http,是協(xié)議;
www.luffycity.com,是服務(wù)器;
80,是服務(wù)器上的默認(rèn)網(wǎng)絡(luò)端口號(hào),默認(rèn)不顯示;
/news/index.html,是路徑(URI:直接定位到對(duì)應(yīng)的資源);
?id=250&page=1,是查詢。
大多數(shù)網(wǎng)頁瀏覽器不要求用戶輸入網(wǎng)頁中“http://”的部分,因?yàn)榻^大多數(shù)網(wǎng)頁內(nèi)容是超文本傳輸協(xié)議文件。同樣,“80”是超文本傳輸協(xié)議文件的常用端口號(hào),因此一般也不必寫明。一般來說用戶只要鍵入統(tǒng)一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。
由于超文本傳輸協(xié)議允許服務(wù)器將瀏覽器重定向到另一個(gè)網(wǎng)頁地址,因此許多服務(wù)器允許用戶省略網(wǎng)頁地址中的部分,比如 www。從技術(shù)上來說這樣省略后的網(wǎng)頁地址實(shí)際上是一個(gè)不同的網(wǎng)頁地址,瀏覽器本身無法決定這個(gè)新地址是否通,服務(wù)器必須完成重定向的任務(wù)。
瀏覽器對(duì)頁面進(jìn)行渲染時(shí),需要html文件中通過各種方式引用的所有素材以及網(wǎng)頁的圖標(biāo),并且這個(gè)過程是以異步的形式向服務(wù)器發(fā)送請(qǐng)求的(遇到第一個(gè)需要的素材,就給服務(wù)器發(fā)請(qǐng)求說我要,然后html中的代碼繼續(xù)往下走)
rb形式發(fā)送文件數(shù)據(jù)時(shí),發(fā)送的只有文檔里的內(nèi)容,文件的外殼跟名字都沒有被發(fā)送
函數(shù)版web框架
from threading import Thread
import socket
server = socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
def html():
with open('home.html', 'rb') as f:
to_client_data = f.read()
return to_client_data
def css():
with open('home.css', 'rb') as f:
to_client_data = f.read()
return to_client_data
def js():
with open('home.js', 'rb') as f:
to_client_data = f.read()
return to_client_data
def jpg():
with open('1.jpg', 'rb') as f:
to_client_data = f.read()
return to_client_data
def ico():
with open('xx1.ico', 'rb') as f:
to_client_data = f.read()
return to_client_data
url_patterns = [
('/',html),
('/home.css',css),
('/home.js',js),
('/1.jpg',jpg),
('/favicon.ico',ico),
]
while 1:
conn,addr = server.accept()
from_client_msg = conn.recv(1024).decode('utf-8')
# print(from_client_msg)
# print(from_client_msg.decode('utf-8'))
request_path = from_client_msg.split(' ')[1]
# 拿到用戶的訪問路徑
print(request_path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for i in url_patterns:
if i[0] == request_path:
# 進(jìn)行信息比對(duì),你要訪問的路徑在我的url-func關(guān)系中,就調(diào)用對(duì)應(yīng)的函數(shù)給他返回對(duì)應(yīng)頁面。
to_client_data = i[1]()
conn.send(to_client_data)
conn.close()
server.close()
并發(fā)版web框架
from threading import Thread
import socket
server = socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
def html(conn):
with open('home.html', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
# return to_client_data
def css(conn):
with open('home.css', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
def js(conn):
with open('home.js', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
def jpg(conn):
with open('1.jpg', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
def ico(conn):
with open('xx1.ico', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
url_patterns = [
('/',html),
('/home.css',css),
('/home.js',js),
('/1.jpg',jpg),
('/favicon.ico',ico),
]
while 1:
conn,addr = server.accept()
from_client_msg = conn.recv(1024).decode('utf-8')
request_path = from_client_msg.split(' ')[1]
print(request_path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for i in url_patterns:
if i[0] == request_path:
target_thread = Thread(target=i[1],args=(conn,))
# to_client_data = i[1]()
target_thread.start()
server.close()
# 注意:這里不能跟函數(shù)web框架一樣在循環(huán)外關(guān)閉套接字、服務(wù)器
# 因?yàn)槲业拇a里只有一個(gè)變量名。通俗點(diǎn)形容:當(dāng)一個(gè)客戶來訪問服務(wù)器,我就創(chuàng)建一個(gè)線程給他個(gè)名字叫:conn,并讓她去服務(wù)這個(gè)客戶,他倆離開后,如果又來一個(gè)用戶,我就再創(chuàng)建一個(gè)線程,并且把之前那個(gè)線程的名字給拿走給這個(gè)新的線程,但是這樣并不影響之前的線程服務(wù)用戶,他倆玩他倆的。
# 但當(dāng)其中一個(gè)線程先運(yùn)行完后,他就會(huì)執(zhí)行循環(huán)外的conn.close(),這時(shí)如果正好創(chuàng)建了一個(gè)線程,把名字也給了,但是還沒來得及去服務(wù),他就被辭職了,這時(shí)沒人服務(wù)用戶了,程序就出錯(cuò)了!而且,在辭職完conn后,還要關(guān)門停止?fàn)I業(yè),這就不是我預(yù)期的效果了。
動(dòng)態(tài)頁面版web框架
動(dòng)態(tài)頁面的意思是:同一個(gè)url,我每次打開時(shí)都不同于之前。而非,帶閃圖、動(dòng)態(tài)等重復(fù)變化的頁面。
from threading import Thread
import socket
import time
server = socket.socket()
server.bind(('127.0.0.1',8001))
server.listen()
def html(conn):
current_time = time.time()
# import pymysql
with open('home.html', 'r',encoding='utf-8') as f:
to_client_data = f.read()
to_client_data = to_client_data.replace('%xxoo%',str(current_time))
conn.send(to_client_data.encode('utf-8'))
conn.close()
# return to_client_data
def css(conn):
with open('home.css', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
def js(conn):
with open('home.js', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
def jpg(conn):
with open('1.jpg', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
def ico(conn):
with open('xx1.ico', 'rb') as f:
to_client_data = f.read()
conn.send(to_client_data)
conn.close()
url_patterns = [
('/',html),
('/home.css',css),
('/home.js',js),
('/1.jpg',jpg),
('/favicon.ico',ico),
]
while 1:
conn,addr = server.accept()
from_client_msg = conn.recv(1024).decode('utf-8')
request_path = from_client_msg.split(' ')[1]
print(request_path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for i in url_patterns:
if i[0] == request_path:
target_thread = Thread(target=i[1],args=(conn,))
# to_client_data = i[1]()
target_thread.start()
server.close()
wsgiref版web框架
wsgiref模塊是對(duì)socket的封裝,其內(nèi)部的environ是對(duì)http信息進(jìn)行了切割,并整理成一個(gè)字典,想要用戶的什么數(shù)據(jù),只要知道這個(gè)數(shù)據(jù)對(duì)應(yīng)的鍵名就可以直接拿到了,而什么數(shù)據(jù)對(duì)應(yīng)什么鍵都是其內(nèi)部定義好了的,所以用起來很方便。
Django中也有可以實(shí)現(xiàn)wsgiref模塊功能的元素,也是通過某些功能直接將http信息做好了切割,保存,通過指定方式去拿指定信息就可以了。
from wsgiref.simple_server import make_server
url_patterns = [('/index',index),]
def index():
with open('html', 'rb') as f:
to_client_data = f.read()
return to_client_data
def application(environ, start_response):
"""
:param environ: 封裝了所有的http協(xié)議相關(guān)信息--一個(gè)字典{'path_info':'/'}
:param start_response:
:return:
"""
request_path = environ['PATH_INFO']
# 通過固定鍵名'PATH_INFO'直接拿到用戶的請(qǐng)求路徑
for i in url_patterns:
if i[0] == request_path:
ret = i[1]()
start_response('200 OK', [('k1','v1'),])
# print(environ)
# print(environ['PATH_INFO'])
return [ret]
httpd = make_server('127.0.0.1', 8080, application)
httpd.serve_forever()
B/S概念
隨著Internet和WWW的流行,以往的主機(jī)/終端和C/S都無法滿足當(dāng)前的全球網(wǎng)絡(luò)開放、互連、信息隨處可見和信息共享的新要求,于是就出現(xiàn)了B/S架構(gòu),即瀏覽器/服務(wù)器結(jié)構(gòu)。它是C/S架構(gòu)的一種改進(jìn),可以說屬于三層C/S架構(gòu)。主要是利用了不斷成熟的WWW瀏覽器技術(shù),用通用瀏覽器就實(shí)現(xiàn)了原來需要復(fù)雜專用軟件才能實(shí)現(xiàn)的強(qiáng)大功能,并節(jié)約了開發(fā)成本,是一種全新的軟件系統(tǒng)構(gòu)造技術(shù)。
結(jié)構(gòu):
第一層是瀏覽器,即客戶端,只有簡(jiǎn)單的輸入輸出功能,處理極少部分的事務(wù)邏輯。由于客戶不需要安裝客戶端,只要有瀏覽器就能上網(wǎng)瀏覽,所以它面向的是大范圍的用戶,所以界面設(shè)計(jì)得比較簡(jiǎn)單,通用。
第二層是WEB服務(wù)器,扮演著信息傳送的角色。當(dāng)用戶想要訪問數(shù)據(jù)庫時(shí),就會(huì)首先向WEB服務(wù)器發(fā)送請(qǐng)求,WEB服務(wù)器統(tǒng)一請(qǐng)求后會(huì)向數(shù)據(jù)庫服務(wù)器發(fā)送訪問數(shù)據(jù)庫的請(qǐng)求,這個(gè)請(qǐng)求是以 SQL 語句實(shí)現(xiàn)的。
第三層是數(shù)據(jù)庫服務(wù)器,他扮演著重要的角色,因?yàn)樗娣胖罅康臄?shù)據(jù)。當(dāng)數(shù)據(jù)庫服務(wù)器收到了WEB服務(wù)器的請(qǐng)求后,會(huì)對(duì) SQL 語句進(jìn)行處理,并將返回的結(jié)果發(fā)送給WEB服務(wù)器,接下來,WEB服務(wù)器將收到的數(shù)據(jù)結(jié)果轉(zhuǎn)換為HTML文本形式發(fā)送給瀏覽器,也就是我們打開瀏覽器看到的界面。
原理
B/S架構(gòu)采取瀏覽器請(qǐng)求,服務(wù)器響應(yīng)的工作模式。
用戶可以通過瀏覽器去訪問Internet上由Web服務(wù)器產(chǎn)生的文本、數(shù)據(jù)、圖片、動(dòng)畫、視頻點(diǎn)播和聲音等信息;
而每一個(gè)Web服務(wù)器又可以通過各種方式與數(shù)據(jù)庫服務(wù)器連接,大量的數(shù)據(jù)實(shí)際存放在數(shù)據(jù)庫服務(wù)器中;
從Web服務(wù)器上下載程序到本地來執(zhí)行,在下載過程中若遇到與數(shù)據(jù)庫有關(guān)的指令,由Web服務(wù)器交給數(shù)據(jù)庫服務(wù)器來解釋執(zhí)行,并返回給Web服務(wù)器,Web服務(wù)器又返回給用戶。在這種結(jié)構(gòu)中,將許許多多的網(wǎng)連接到一塊,形成一個(gè)巨大的網(wǎng),即全球網(wǎng)。而各個(gè)企業(yè)可以在此結(jié)構(gòu)的基礎(chǔ)上建立自己的Internet。
在 B/S 模式中,用戶是通過瀏覽器針對(duì)許多分布于網(wǎng)絡(luò)上的服務(wù)器進(jìn)行請(qǐng)求訪問的,瀏覽器的請(qǐng)求通過服務(wù)器進(jìn)行處理,并將處理結(jié)果以及相應(yīng)的信息返回給瀏覽器,其他的數(shù)據(jù)加工、請(qǐng)求全部都是由Web Server完成的。通過該框架結(jié)構(gòu)以及植入于操作系統(tǒng)內(nèi)部的瀏覽器,該結(jié)構(gòu)已經(jīng)成為了當(dāng)今軟件應(yīng)用的主流結(jié)構(gòu)模式。
B/S優(yōu)缺點(diǎn)
B/S架構(gòu)最大的優(yōu)點(diǎn)是總體擁有成本低、維護(hù)方便、 分布性強(qiáng)、開發(fā)簡(jiǎn)單,可以不用安裝任何專門的軟件就能 實(shí)現(xiàn)在任何地方進(jìn)行操作,客戶端零維護(hù),系統(tǒng)的擴(kuò)展非常容易,只要有一臺(tái)能上網(wǎng)的電腦就能使用。
最大的缺點(diǎn)就是通信開銷大、系統(tǒng)和數(shù)據(jù)的安全性較難保障。
C/S與B/S
在響應(yīng)速度,用戶界面,數(shù)據(jù)安全等方面,C/S強(qiáng)于B/S,但是在業(yè)務(wù)擴(kuò)展和適用 www 條件下,B/S明顯勝過C/S。可以這么說,B/S的強(qiáng)項(xiàng)就是C/S的弱項(xiàng),反之亦然。它們各有優(yōu)缺點(diǎn),相互無法取代。
C/S結(jié)構(gòu)與B/S結(jié)構(gòu)兩種模式各自擁有其特色優(yōu)勢(shì),在不同的系統(tǒng)環(huán)境與操作平臺(tái)下,選擇較為接近或交叉進(jìn) 行混合模式的使用,可以保證數(shù)據(jù)的敏感性、安全性和穩(wěn)定發(fā)展,還可以加強(qiáng)對(duì)數(shù)據(jù)庫的修改與新增記錄的操作。 對(duì)客戶端程序進(jìn)行保護(hù),提高資源數(shù)據(jù)的交互性能,實(shí)現(xiàn)系統(tǒng)維護(hù)成本較低、維護(hù)方式較簡(jiǎn)便、布局更合理、網(wǎng)絡(luò)數(shù)據(jù)使用效率較高的目的,采用C/S與B/S混合模式才是最佳方案。
C/S與B/S不同點(diǎn)
C/S
B/S
硬件環(huán)境
專用網(wǎng)絡(luò)
廣域網(wǎng)
安全要求
面向相對(duì)固定的用戶群信息安全的控制能力強(qiáng)
面向不可知的用戶群對(duì)安全的控制能力相對(duì)較弱
程序架構(gòu)
更加注重流程系統(tǒng)運(yùn)行速度可較少考慮
對(duì)安全以及訪問速度都要多重的考慮,是發(fā)展趨勢(shì)
軟件重用
差
好
系統(tǒng)維護(hù)
升級(jí)難
開銷小,方便升級(jí)
處理問題
集中
分散
用戶接口
與操作系統(tǒng)關(guān)系密切
跨平臺(tái),與瀏覽器相關(guān)
信息流
交互性低
交互密集
總結(jié)
以上是生活随笔為你收集整理的bs架构的系统能连接mysql吗_HTTP、BS架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实例62:python
- 下一篇: linux cmake编译源码,linu