1、什麼是socket:python
套接字socket: 在python中就是一個模塊, socket是在應用層與傳輸層中間的抽象層. socket就像是一個接口,經過這個接口能夠實現網絡通訊.
它把複雜的TCP/IP協議族隱藏在Socket接口後面,socket屏蔽了各個協議的通訊細節,使得程序員無需關注協議自己,直接使用socket提供的接口來進行互聯的不一樣主機間的進程的通訊。
socket根據用途,有兩種分類:ios
1)基於文件類型的套接字家族:AF_UNIX, 基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,能夠經過訪問同一個文件系統間接完成通訊 2)基於網絡類型的套接字家族(AF_INET):網絡編程就是用的 AF_INET
osi七層模型: 互聯網的核心就是由一堆協議組成,協議就是標準,標準就是你們都承認的,下面的圖是數據經過網絡溝通通過的底層細節.主要記住五層就夠了程序員
socket 在網絡流程中的位置:應用層與傳輸層之間編程
簡述訪問Jd網站流程瀏覽器
2、基於TCP和UDP兩個協議下的socket的通信流程緩存
什麼是TCP: 可靠的、面向鏈接的協議,傳輸效率低全雙工通訊(發送緩存&接收緩存)、面向字節流. 好比:Web瀏覽器,文件傳輸程序。服務器
什麼是UDP:不可靠的、面向無鏈接的服務,傳輸效率高(發送前時延小),既可多對多,也可一對多,無擁塞控制,面向報文(以包的形式發送). 好比:域名系統 (DNS),視頻流,IP語音(VoIP)。網絡
tcp的鏈接須要通過三次握手,斷開須要通過四次揮手:socket
UDp的鏈接和斷開不須要三握和四揮.tcp
網絡傳輸ios五層流程圖:
pycharm裏面默認用的是網絡家族的TCP(字節流\數字流)協議
3、基於UDP協議下的socket網絡通話.(type=cocket.SOCK_DGRAM)能夠多人鏈接通話 datagram(數據包)
UDP協議下不會產生粘包現象,由於有消息邊界,每次發送,都是以包的形式發送(有包頭和消息組成),對方取值是,若是取值的"勺子"(recvfrom(n)的參數)設置的過小,就會出異常; 當太大時,一次只會取一個包.因此不會出現粘包現象.
UDP服務端:這裏的recvfrom(1024)是UDP特有;TCP是recv(1024)設置從緩存取每次取值的大小,單位爲字節)
UDP客戶端:
4、TCP通話(容許多人通話,但須要排隊,跟一個客戶端了以後才能跟下一個客戶鏈接.),服務端:(addr是地址的縮寫)
import socket #創建網絡通訊的模塊 xiaoli = socket.socket() xiaoli.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) ip_xiaoli = ("127.0.0.1",8001) xiaoli.bind(ip_xiaoli) #偵聽ip地址和端口,簡稱開機 xiaoli.listen(3) #默認爲1,鏈接一個通道,能夠配置,表示鏈接一個通道後,容許其餘對象重用個人IP地址進行通話,但需排隊等待 while 1: # 等待創建鏈接, conn是鏈接通道,addr是客戶端的地址 conn,addr=xiaoli.accept() print(addr) #查看客戶端地址 while 1: # 服務端經過conn鏈接通道來收發消息,經過recv方法,recv裏面的參數是字節(B),1024的意思1024B=1KB kehu_xiaoxi = conn.recv(1024).decode("utf-8") print("客戶端告訴你>>>",kehu_xiaoxi) if kehu_xiaoxi=="byebye": break # 回覆消息:經過send方法,參數必須是字節類型的, tiwen = input("請輸入內容:").encode("utf-8") conn.send(tiwen) conn.close()
TCP多人通話,客戶端:(#客戶端的設置比服務端簡單,省去了:偵聽IP地址和設置消息通道,發送消息直接用實例對象.recv就行)
import socket xiaohei = socket.socket() #鏈接服務端的應用程序,經過connect方法,參數是服務端的ip地址和端口,打電話 xiaohei.connect(("127.0.0.1",8001)) while 1: tiwen1 = input("輸入你想說的話:") xiaohei.send(tiwen1.encode("utf-8")) if tiwen1=="byebye": break duixiang = xiaohei.recv(1024).decode("utf-8") print("服務端說>>>",duixiang) xiaohei.close()
5、小練習:TCP客戶端每一個2秒發送一條時間戳給TCP服務端,TCP服務端吧它轉換成格式化時間.
TCP服務端:
TCP客戶端(time sleep(t) 函數推遲調用線程的運行,可經過參數secs指秒數,表示進程掛起的時間,t -- 推遲執行的秒數)