一 客戶端/服務器架構python
一、硬件C/S架構(打印機)編程
二、軟件C/S架構設計模式
互聯網中到處是C/S架構 如視頻網站是服務端,你的瀏覽器是客戶端(B/S架構也是C/S架構的一種) 騰訊做爲服務端爲你提供視頻,你得下個騰訊視頻客戶端才能看它的視頻)
二 osi七層瀏覽器
引子:服務器
須知一個完整的計算機系統是由硬件、操做系統、應用軟件三者組成,具有了這三個條件,一臺計算機系統就能夠本身跟本身玩了(打個單機遊戲,玩個掃雷啥的)網絡
若是你要跟別人一塊兒玩,那你就須要上網了,什麼是互聯網?架構
互聯網的核心就是由一堆協議組成,協議就是標準,好比全世界人通訊的標準是英語socket
若是把計算機比做人,互聯網協議就是計算機界的英語。全部的計算機都學會了互聯網協議,那全部的計算機都就能夠按照統一的標準去收發信息從而完成通訊了。tcp
人們按照分工不一樣把互聯網協議從邏輯上劃分了層級,oop
爲什麼學習socket必定要先學習互聯網協議:
1.首先:本節課程的目標就是教會你如何基於socket編程,來開發一款本身的C/S架構軟件
2.其次:C/S架構的軟件(軟件屬於應用層)是基於網絡進行通訊的
3.而後:網絡的核心即一堆協議,協議即標準,你想開發一款基於網絡通訊的軟件,就必須遵循這些標準。
4.最後:就讓咱們從這些標準開始研究,開啓咱們的socket編程之旅
三socket層
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。
因此,咱們無需深刻理解tcp/udp協議,socket已經爲咱們封裝好了,咱們只須要遵循socket的規定去編程,寫出的程序天然就是遵循tcp/udp標準的。
四socket是什麼
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。
因此,咱們無需深刻理解tcp/udp協議,socket已經爲咱們封裝好了,咱們只須要遵循socket的規定去編程,寫出的程序天然就是遵循tcp/udp標準的。
五套接字發展史及分類
套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 Unix,即人們所說的 BSD Unix。 所以,有時人們也把套接字稱爲「伯克利套接字」或「BSD 套接字」。一開始,套接字被設計用在同 一臺主機上多個應用程序之間的通信。這也被稱進程間通信,或 IPC。套接字有兩種(或者稱爲有兩個種族),分別是基於文件型的和基於網絡型的。
基於文件類型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,能夠經過訪問同一個文件系統間接完成通訊
基於網絡類型的套接字家族
套接字家族的名字:AF_INET
(還有AF_INET6被用於ipv6,還有一些其餘的地址家族,不過,他們要麼是隻用於某個平臺,要麼就是已經被廢棄,或者是不多被使用,或者是根本沒有實現,全部地址家族中,AF_INET是使用最普遍的一個,python支持不少種地址家族,可是因爲咱們只關心網絡編程,因此大部分時候我麼只使用AF_INET)
六 套接字工做流程
一個生活中的場景。你要打電話給一個朋友,先撥號,朋友聽到電話鈴聲後提起電話,這時你和你的朋友就創建起了鏈接,就能夠講話了。等交流結束,掛斷電話結束這次交談。 生活中的場景就解釋了這工做原理。
先從服務器端提及。服務器端先初始化Socket,而後與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端鏈接。在這時若是有個客戶端初始化一個Socket,而後鏈接服務器(connect),若是鏈接成功,這時客戶端與服務器端的鏈接就創建了。客戶端發送數據請求,服務器端接收請求並處理請求,而後把迴應數據發送給客戶端,客戶端讀取數據,最後關閉鏈接,一次交互結束
七 簡單的交互
基於TCP協議的套接字
#服務端 import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8001)) phone.listen(5) print('start...') while True: conn,client_addr=phone.accept() print('客戶端',client_addr) while True: #通信循環 try: msg=conn.recv(1024) print('客戶端的消息',msg) conn.send(msg+b'SB') except ConnectionAbortedError: break conn.close() phone.close()
#客戶端 import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#買電話 phone.connect(('127.0.0.1',8001))#撥電話,地址爲服務端的ip和端口 while True: msg=input('>>>>:').strip() phone.send(msg.encode('utf-8'))#發消息b"hello" data=phone.recv(1024)#收消息 print(data.decode('utf-8')) phone.close()
基於UDP的套接字
udp是無連接的,先啓動哪一端都不會報錯
udp服務端
1 ss = socket() #建立一個服務器的套接字 2 ss.bind() #綁定服務器套接字 3 inf_loop: #服務器無限循環 4 cs = ss.recvfrom()/ss.sendto() # 對話(接收與發送) 5 ss.close() # 關閉服務器套接字
UPD客戶端
cs = socket() # 建立客戶套接字 comm_loop: # 通信循環 cs.sendto()/cs.recvfrom() # 對話(發送/接收) cs.close() # 關閉客戶套接字