一 網絡的原理python
1 客戶端和服務端都是基於網路運行的。編程
2 互聯網協議:就是計算機界的英語設計模式
3 五層協議:應用層,傳輸層,網絡層,數據鏈路層,物理層這五層組成的緩存
物理層:internet:發送和接收電信號(高低電頻)服務器
數據鏈路層:ethernet:一組電信號叫作數據幀,也叫數據報,數據報分爲兩個部分:報頭(head)和數據(data)兩部分。網絡
head包含的有:發送者/源地址:6個字節架構
接收者/目標地址:6個字節socket
數據類型:6個字節tcp
mac地址:每個網卡在生產的時候就會產生一個mac地址。函數
計算機的通訊就是靠吼,也叫廣播包,只限於局域網的使用。世界上的全部網絡都是有不少的局域網組成的。
網絡層:ip地址:分爲ipv4和ipv6.
每個IP地址都是有四個十進制數字組成
ip協議:規定了網絡的地址協議叫作ip協議,它定義的地址也叫作ip地址。
子網地址:表示子網絡特徵的一個參數
網關地址:爲了跨子網的通訊,能和外網之間進行通訊。
網關與網關之間的通訊就叫作路由協議。
mac地址:爲了找到局域網絡的位置。
ip地址:爲了肯定子網的位置
ARP協議:將局域網內的mac地址轉成網關地址。
mac地址和ip地址能找到世界上獨一無二的一臺機器。
傳輸層:tcp協議和udp協議,每啓動一個軟件對應者一個端口。
端口:肯定軟件在計算機上面的位置。
ip地址加上端口:能夠肯定世界上一臺計算機上的一個軟件的位置。
應用層:產生一個數據。
發數據是一層一層的封包;收數據是一層一層的解包。
tcp協議:首先發生連接的請求,創建好雙向的連接,而後才能進行客戶端和服務器端的傳輸,接收到數據之後回覆肯定後丟掉原有的數據再關閉連接。稱爲可靠協議。
udp協議:不會創建鏈接,只有數據一發送出去,就會直接丟掉原有的數據。稱爲不可靠協議
二 socket模塊
1 socket模塊就是一個接口,也是套接字模塊。
2 socket抽象層:就是一個編程接口。
客戶端/服務器架構
即C/S架構
在互聯網中到處都是C/S架構,就至關咱們是客戶端,而服務端就是咱們想要在電腦上查詢的內容。
爲什麼學習socket必定要先學習互聯網協議:
1.首先:本節課程的目標就是教會你如何基於socket編程,來開發一款本身的C/S架構軟件
2.其次:C/S架構的軟件(軟件屬於應用層)是基於網絡進行通訊的
3.而後:網絡的核心即一堆協議,協議即標準,你想開發一款基於網絡通訊的軟件,就必須遵循這些標準。
4.最後:就讓咱們從這些標準開始研究,開啓咱們的socket編程之旅
socket層
3 socket模塊的經常使用方法:
AF_UNIX:一臺機器直接的通訊
AF_INET:基於網路的通訊
socket.socket():獲取套接字對象。
listen:監聽連接數量
accept:等待客戶端連接。
connect:連接服務端
socket.SOCK_STREAM:tcp協議,也是一個數據流
send:發送消息
recv:接收消息
decode:解碼
encode:編碼
SO_REUSEADDR:重用ip和端口
服務器端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8091)) phone.listen(5) while True: conn,addr=phone.accept() while True: try: print(conn.recv(1024).decode('utf-8')) msg=input('>>>:') if not msg:continue conn.send(msg.encode('utf-8')) except Exception: break conn.close() phone.close()
客戶端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8091)) while True: msg=input('>>>') phone.send(msg.encode('utf-8')) if not msg:continue print(phone.recv(1024).decode('utf-8')) phone.close()
服務端套接字函數 s.bind() 綁定(主機,端口號)到套接字 s.listen() 開始TCP監聽 s.accept() 被動接受TCP客戶的鏈接,(阻塞式)等待鏈接的到來 客戶端套接字函數 s.connect() 主動初始化TCP服務器鏈接 s.connect_ex() connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常 公共用途的套接字函數 s.recv() 接收TCP數據 s.send() 發送TCP數據(send在待發送數據量大於己端緩存區剩餘空間時,數據丟失,不會發完) s.sendall() 發送完整的TCP數據(本質就是循環調用send,sendall在待發送數據量大於己端緩存區剩餘空間時,數據不丟失,循環調用send直到發完) s.recvfrom() 接收UDP數據 s.sendto() 發送UDP數據 s.getpeername() 鏈接到當前套接字的遠端的地址 s.getsockname() 當前套接字的地址 s.getsockopt() 返回指定套接字的參數 s.setsockopt() 設置指定套接字的參數 s.close() 關閉套接字 面向鎖的套接字方法 s.setblocking() 設置套接字的阻塞與非阻塞模式 s.settimeout() 設置阻塞套接字操做的超時時間 s.gettimeout() 獲得阻塞套接字操做的超時時間 面向文件的套接字的函數 s.fileno() 套接字的文件描述符 s.makefile() 建立一個與該套接字相關的文件
socket是什麼
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在
Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。
因此,咱們無需深刻理解tcp/udp協議,socket已經爲咱們封裝好了,咱們只須要遵循socket的規定去編程,寫出的程序天然就是遵循tcp/udp標準的。