本節主要内容:
1.客戶短\服務端架構
2.網絡通信的流程
3.初識socket
一.用戶端\服務端架構
用戶端\服務端架構:
即Client/Server (C/S) 結構,是大家熟知的軟體系統體系結構,通過将任務合理配置設定到Client端和Server端,降低了系統的通訊開銷,需要安裝用戶端才可進行管理操作。
用戶端和伺服器端的程式不同,使用者的程式主要在用戶端,伺服器端主要提供資料管理、資料共享、資料及系統維護和并發控制等,用戶端程式主要完成使用者的具體的業務。
B\S架構:
即Browser/Server (浏覽器/伺服器) 結構,是随着Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種結構下,使用者界面完全通過WWW浏覽器實作。
用戶端基本上沒有專門的應用程式,應用程式基本上都在伺服器端。由于用戶端沒有程式,應用程式的更新和維護都可以在伺服器端完成,更新維護友善。由于用戶端使用
浏覽器,使得使用者界面“豐富多彩”,但資料的列印輸出等功能受到了限制。為了克服這個缺點,一般把利用浏覽器方式實作困難的功能,單獨開發成可以釋出的控件,在用戶端利用程式調用來完成.
軟體C\S架構:用戶端\服務端架構:京東,淘寶,今日頭條,qq,微信.....
B\S架構:浏覽器(browser)\服務端>>>統一接口,例: 微信上的小程式
硬體C\S架構: 列印機.
二.網絡通信的流程
網絡通信中的一些基本概念:
網線:傳送電信号
網卡: 提供網絡接口,接收電信号
MAC位址: 長度為48位二進制, 通常由12位16進制數表示(前六位是廠商編号, 後六位是流水線号), 每塊網卡出廠時都被燒制了全球唯一的mac位址.
Ethernet規定接入Internet的裝置都必須具備網卡, 發送端和接收端的位址便是網卡的位址.
檢視mac位址的方法:windows下在cmd視窗輸入ipconfig -all指令:下面顯示的這個實體位址就是mac位址。
集線器:将所有連接配接到集線器的網絡裝置連通起來
交換機: 更新版的集線器
路由器:用來轉發消息
路由協定:用來計算轉發消息的最優路徑
IP位址: 網際網路協定位址, 它是IP協定提供的一種統一的位址格式, 它為網際網路上的每一個網格和每一台主機配置設定一個邏輯位址,以此來屏蔽實體位址的差異.在IPv4裡有32位二進制數組成, 通常被分割為4個8位二進制數, 由四個點分十進制數表示.
DHCP服務: 是一個區域網路的網絡協定, 使用UDP協定工作, 用于内部網絡自動配置設定IP位址
子網路遮罩: 格式與IP位址一樣, 将某個IP位址劃分成網絡位址和主機位址兩部分, 用來判斷兩個IP位址是否在一個網段.1表示網絡位址, 0表示主機位址.
網關: 一個網絡通向其他網絡的IP位址, 即路由器的IP位址
DNS: 進行域名(domain name)和與之相對應的IP位址 (IP address)轉換的伺服器
廣播: 将源MAC位址,目标MAC位址及資訊通過交換機和路由器發送給區域網路内的所有其他裝置
ARP協定: 位址解析協定,主機發送資訊時将包含目标IP位址的ARP請求廣播到網絡上的所有主機,并接收傳回消息,以此确定目标的實體位址.
網絡通信的流程:
關于網絡通信的整個流程請點選連結檢視.
三.初識socket
socket是實作網絡程式設計的工具, 以下是兩段簡單的代碼.
import socket
#建立一個socket對象
server = socket.socket() #相當于建立了一部電話
ip_port = ('192.168.111.1',8001) #建立一個電話卡
server.bind(ip_port) #插上電話卡
server.listen(5) #監聽着電話,我能監聽5個,接到一個電話之後,後面還能有四個人給我打電話,
但是後面這四個人都要排隊等着,等着我第一個電話挂掉,再來第6個的時候,第六個人的手機會報錯
print('11111')
#等着别人給我打電話,打來電話的時候,我就拿到了和對方的這個連線通道conn和對方的電話号碼addr
conn,addr = server.accept() #阻塞住,一直等到有人連接配接我,連接配接之後得到一個元祖,裡面是連線通道conn和對方的位址(ip+端口)
print('22222')
print(conn)
print('>>>>>>>>>',addr)
while True:
from_client_data = conn.recv(1024) #服務端必須通過兩者之間的連接配接通道來收消息
from_client_data = from_client_data.decode('utf-8')
print(from_client_data)
if from_client_data == 'bye':
break
server_input = input('明威說>>>>:')
conn.send(server_input.encode('utf-8'))
if server_input == 'bye':
break
conn.close() #挂電話
server.close() #關手機
複制
import socket
import time
client = socket.socket()
server_ip_port = ('192.168.111.1',8001)
client.connect(server_ip_port)
while True:
client_input = input('小文說>>>>:')
client.send(client_input.encode('utf-8')) #給服務端發送消息
if client_input == 'bye':
break
from_server_data = client.recv(1024)
print('來自服務端的消息:',from_server_data.decode('utf-8'))
if from_server_data.decode('utf-8') == 'bye':
break
client.close() #用戶端挂電話
複制
注意: 先運作server,然後再運作client,然後你會發現client這個檔案再輸出台的地方讓你輸入内容,你輸入一個内容然後回車,你會發現server那邊的控制台就輸出了以client發送的内容
通過上面兩段代碼,我們隊網絡程式設計有了一個大概的認識。