1.C/S架構 C/S架構:Client與Server ,中文意思:客戶端與伺服器端架構,這種架構也是從用戶層面(也可是物理層面)來劃分的。這裡客戶端一般指需先安裝再執行的應用程式,對操作系統依賴性較大;服務端即是這類程式對應的伺服器。 B/S架構:browser/server,瀏覽器端與伺服器端架 ...
1.C/S架構
C/S架構:Client與Server ,中文意思:客戶端與伺服器端架構,這種架構也是從用戶層面(也可是物理層面)來劃分的。這裡客戶端一般指需先安裝再執行的應用程式,對操作系統依賴性較大;服務端即是這類程式對應的伺服器。
B/S架構:browser/server,瀏覽器端與伺服器端架構,也是C/S架構的一種,只是這個客戶端不需要大家去安裝什麼應用程式,只需在瀏覽器上通過HTTP請求伺服器端相關的資源(網頁資源),客戶端Browser瀏覽器就能進行增刪改查。
2.通信流程
以京東為例:
第一步:打開瀏覽器,想要請求訪問京東,在地址欄輸入了網址:www.jd.com。(www.jd.com是功能變數名稱就是一個IP地址的名稱,IP地址不好記,所有有了功能變數名稱。)
第二步:先將請求信息發給了交換機,然後交給了路由器,路由發給DNS伺服器,通過DNS協議去找我們要訪問的京東的IP地址
第三步:查到的京東伺服器對應的IP地址之後,路由器通過路由協議找到一個路由轉發的最優路徑,將你的請求信息還送給這個IP地址的京東的路由器
第四步:京東的路由器發給了京東網站的伺服器上
第五步:京東網站伺服器按照來的時候的路徑,在返回給你他自己的網站
第六步:當你打開瀏覽器時,系統自動給它一個編號,叫做埠號,當你電腦收到京東發的消息時,你的電腦通過埠號找瀏覽器,瀏覽器拿到京東的網站信息,然後將網站呈現在了自己的瀏覽器上
參考圖:
補充:埠+IP能夠確定一臺電腦上的某一個應用程式
3.初識socket
socket 又稱為套接字,看看基本格式:
server端:
1 import socket 2 sk = socket.socket() 3 sk.bind(('127.0.0.1',8898)) #把地址綁定到套接字 4 sk.listen() #監聽鏈接 5 conn,addr = sk.accept() #接受客戶端鏈接 6 ret = conn.recv(1024) #接收客戶端信息 7 print(ret) #列印客戶端信息 8 conn.send(b'hi') #向客戶端發送信息 9 conn.close() #關閉客戶端套接字 10 sk.close() #關閉伺服器套接字(可選)
client端
1 import socket 2 sk = socket.socket() # 創建客戶套接字 3 sk.connect(('127.0.0.1',8898)) # 嘗試連接伺服器 4 sk.send(b'hello!') 5 ret = sk.recv(1024) # 對話(發送/接收) 6 print(ret) 7 sk.close() # 關閉客戶套接字
4.相關練習
# 1.
# server端:接收時間戳時間,轉換成格式化時間
# client端:每隔10秒中把時間戳發給server端,time.time()
1 # server端 2 3 import socket 4 import time 5 6 server = socket.socket() # 創建socket對象 7 # ip_port = ('192.168.15.84',8001) # 創建ip+埠 8 ip_port = ('127.0.0.1',8001) 9 server.bind(ip_port) # 綁定埠 10 server.listen() # 開啟監聽 11 # 等待對方連接... 12 conn, addr = server.accept() # 拿到連接通道conn和通信地址addr(ip+埠) 13 14 while 1: 15 # 收消息 限制大小1024b 16 from_client_msg = conn.recv(1024) # 服務端(必須)通過conn通道接收消息 17 18 res_msg = time.gmtime(float(from_client_msg.decode('utf-8'))) # 還原成float後 再把時間戳結構化 19 print(time.strftime("%Y-%m-%d %H:%M:%S",res_msg)) # 格式化時間
# client
1 import socket 2 import time 3 4 5 client = socket.socket() 6 server_ip_port = ('127.0.0.1',8001) # 指定要連接到的地址 7 client.connect(server_ip_port) # 連接地址 8 9 while 1: 10 msg = time.time() 11 res_msg = str(msg).encode('utf-8') # 註意:直接float會報錯 先轉成字元串再編碼!! 12 client.send(res_msg) # 給服務端發送消息 13 time.sleep(5)
# 2. 一直對話的程式
# server收一個發一個
# client發一個收一個
#server
1 import socket 2 3 server = socket.socket() 4 5 ip = ('127.0.0.1',8002) # IP隨網路更換而改變 6 server.bind(ip) 7 server.listen() # 開啟監聽 8 conn,addr = server.accept() # 阻塞,等待連接,再解包(元祖)獲得;連接通道conn和對方通信地址addr(ip+埠) 9 10 while 1: 11 from_client_msg = conn.recv(1024) # 接收消息 12 from_client_msg = from_client_msg.decode('utf-8') 13 print('來自忽悠的消息',from_client_msg) 14 if from_client_msg == 'bye': 15 break 16 17 msg = input(">>>>> ") 18 conn.send(msg.encode('utf-8')) 19 if msg == 'bye': 20 break 21 22 conn.close() 23 server.close()
# client
1 import socket 2 client = socket.socket() 3 4 server_ip = ('127.0.0.1',8002) 5 client.connect(server_ip) # 連接目標 6 7 while 1: 8 # 發消息 9 msg = input('>>>>> ') 10 client.send(msg.encode('utf-8')) # 發送內容必須是bytes 11 if msg == 'bye': 12 break 13 14 # 接消息 15 from_server_msg = client.recv(1024) # 通過client接收,限制1024b 16 from_server_msg = from_server_msg.decode('utf-8') 17 print('來自少北的消息:',from_server_msg) 18 if from_server_msg == 'bye': 19 break 20 21 client.close()