1.軟件開發架構:
開發軟件,必需要開發一套 客戶端 與 服務端。
客戶端與服務端的做用
服務端: 24小時不間斷提供服務
客戶端: 若是想要找服務,就去尋找服務並享受
軟件開發架構分爲兩種:
C/S架構:
Client: 客戶端
Server: 服務端
優勢:
軟件的使用穩定,而且能夠節省網絡資源。
缺點:
1.若用戶想在同一個設備上使用多個軟件,必須下載多個客戶端。
2.軟件的每一次更新,客戶端也必須跟着從新下載更新。
C/S架構的軟件:
例如: 電腦上的QQ、Pycharm等...手機端(移動端)的微信、王者榮耀等...
B/S架構:
Browser: 瀏覽器(客戶端)
Server: 服務端
優勢:
以瀏覽器充當客戶端,無需用戶下載多個軟件,也無需用戶下載更新軟件版本,
直接在瀏覽器上訪問須要使用的軟件。
缺點:
消耗網絡資源過大,當網絡不穩定時,軟件的使用也會不穩定。
B/S架構的軟件:
例如: 在瀏覽器(客戶端)上輸入某個軟件的域名(http://oldboyedu.com/)。
2.後期學習
網絡編程、併發編程、數據庫開發 能夠開發一套C/S架構的軟件(防優酷系統)。
前端html、css、js,web框架(網絡編程、併發編程) 能夠開發一套B/S架構的軟件(bbs系統)。
3.網絡編程
- 網絡編程發展歷史
全部先進的技術都源自於軍事,但願經過遠程獲取數據,因此出現了"網絡編程"。
早期如何實現遠程通訊:
- 打電話 ---> 電話線
- 純平電腦(大屁股電腦) ---> 網線,有線網卡
- 筆記本電腦 ---> 有線網卡、無線網卡
要實現遠程通訊必須具有:
1.物理鏈接介質 ---> 網卡....
2.互聯網協議
- 人與人之間溝通的介質: 中文、英語
- 計算機之間溝通的介質: "互聯網協議"
4.互聯網協議
互聯網協議又稱爲網絡七層協議,OSI七層協議,OSI是一個世界標準組織。
OSI七層協議:
- 應用層
- 表示層
- 會話層
- 傳輸層
- 網絡層
- 數據鏈路層
- 物理鏈接層
學習由下到上:
須要優先了解的協議一共5層:
- 物理鏈接層
基於電信號發送二進制的數據0101010111。
010: 你 you
101: 我 I
- 數據鏈路層
數據鏈路層的 "以太網協議",專門用於處理基於電信號發送二進制的數據。
以太網協議:
1.規定好電信號數據的分組方式。
2.每一臺鏈接網線的電腦都必需要由一塊 "網卡"。
- 網卡由不一樣廠商生產的
- 每塊網卡都會有世界上獨一無二12位的編號 "mac"地址。
- 前6位: 廠商號
- 後6位: 流水號
- 交換機:
可讓多臺電腦鏈接到一塊兒。
基於以太網協議發送數據:
特色:
廣播、單播
弊端:
廣播風暴、不能跨局域網通訊。
- 互聯網:
讓局域網之間進行通訊。
- 網絡層
IP地址: 用於標識惟一的一臺計算機(局域網)的地址。
IP: 點分十進制
最小值: 0.0.0.0
最大值: 255.255.255.255
IPV4(瞭解):
一開始用電腦的人很少,因此出現IPV4的協議版本。
IPV6(瞭解):
括號IP。
本機IP: 迴環地址 127.0.0.1 ---> localhost
- 傳輸層
TCP/UDP協議,他們都是基於端口工做的。
- 端口號: 標識電腦上某個一個軟件。
- 端口號範圍: 0-65535
注意:
1.操做系統中,通常0-1024的端口都被默認使用了(0-1024不要動)
2.儘可能使用8000以後的端口號 8001
開發中經常使用軟件的默認端口號 (默寫) :
mysql: 3306
mongodb: 27017
Django: 8000
Tomcat: 8080
Flask: 5000
Redis: 6379
若想服務端與客戶端進行通訊,必需要創建鏈接,產生雙向通道。
一條是客戶端往服務端發送消息的。
另外一條是服務端往客戶端發送消息的。
- 應用層
http
ftp
總結:
ip:用於惟一標識某一臺計算機的位置。
port: 端口用於確認計算機上的一個應用軟件。
ip + port: 世界上某一臺電腦上的一個應用軟件。
- TCP協議的工做原理:
- TCP是一個流式協議
- 三次握手,四次揮手(*******):
- 三次握手建鏈接:
創建雙向通道,創建好鏈接。
- listen: 監聽
- established: 確認請求創建鏈接
- 發送數據:
write
read
客戶端往服務端發送數據,數據存放在內存中,須要服務端確認收到,數據纔會在內存中釋放掉。
不然,會隔一段時間發送一次,讓服務端返回確認收到。
在一段時間內,若服務端仍是不返回確認收到,則取消發送。並釋放內存中的數據。
- 四次揮手斷鏈接:
- TIME_WAIT: 時間等待
5.Socket:
1.什麼是Socket?
socket是一個模塊,能夠寫一套C/S架構的套接字。
2.爲何要使用Socket?
socket套接字會封裝好各層協議的工做。
好處:
能夠節省開發成本。
3.如何使用
import socket
注意: 客戶端與服務端必須尊循:
一端send,另外一端recv
不一樣兩端同時send或recv
6.初始socket套接字
1.客戶端
#客戶端 import socket # 買手機 client = socket.socket() # 往服務端撥號 # client: 至關於客戶端往服務端挖的管道 client.connect( # ip + port: 尋找服務端 ('127.0.0.1', 9527) ) # 客戶端向服務端說話 client.send('你好 小賤賤'.encode('utf-8')) data = client.recv(1024) print(data) # 關閉鏈接 client.close()
1.客戶端
#服務端 import socket # 默認指定TCP協議 # 買手機 server = socket.socket() # 插卡 server.bind( # ip + port ('127.0.0.1', 9527) ) # 開機,等待接聽 server.listen(5) # listen(5) 半鏈接池 # 監聽是否有消息 # conn: 至關於服務端往客戶端挖的管道 conn, addr = server.accept() print(addr) # 聽客戶端給我說話 data = conn.recv(1024).decode('utf-8') # 能夠接收1024字節數據 print(data) conn.send(b'hello xiao tank') # 掛電話 conn.close() # 關機 server.close()
7.循環通訊套接字
1.客戶端css
import socket client = socket.socket() client.connect( ('127.0.0.1', 9527) ) while True: send_msg = input('client---> server:') # 服務端往客戶端發送的數據 client.send(send_msg.encode('utf-8')) if send_msg == 'q': break # 服務端返回的數據 data = client.recv(1024).decode('utf-8') print(data) client.close()
2.服務端
import socket server = socket.socket() server.bind( ('127.0.0.1', 9527) ) server.listen(5) # listen(5) 半鏈接池 conn, addr = server.accept() print(addr) while True: # 接收客戶端發送過來的消息 data = conn.recv(1024).decode('utf-8') # 能夠接收1024字節數據 print(data) if data == 'q': break # 讓服務端數據發送給客戶端的消息 send_msg = input('server--->client: ').encode('utf-8') conn.send(send_msg) conn.close()
8.服務端多個客戶端html
1.客戶端前端
import socket client = socket.socket() client.connect( ('127.0.0.1', 8888) ) while True: send_msg = input('client---》server:') client.send(send_msg.encode('utf-8')) if send_msg == 'q': break data = client.recv(1024).decode('utf-8') print(data) client.close()
2.服務端mysql
import socket server = socket.socket() server.bind( ('127.0.0.1', 8888) ) server.listen(5) # 半鏈接池,能夠「等待5個用戶接受服務」 while True: # 等待客戶端鏈接過來 conn, addr = server.accept() print(addr) # 循環接收客戶端數據 while True: try: data = conn.recv(1024).decode('utf-8') print(data) # mac和linux系統bug: b'' if len(data) == 0: continue if data == 'q': break conn.send(data.encode('utf-8')) except Exception as e: print(e) break conn.close()