socket模塊--TCP和UDP協議下的基礎網絡通話

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網站流程瀏覽器

個人計算機首先提交訪問某域名的請求,經過dns服務器(有一個字典,域名對應着IP)它將域名轉化成ip地址返回給個人計算機
個人計算機經過ip協議和子網掩碼判斷出不在一個局域網後,提交給交換機,而後交換機提交給路由器,路由器帶着的源ip地址和源mac地址以及目標的源ip地址和端口,經過nat技術將個人計算機虛擬IP(局域網IP)轉換成公網IP,在通過路由協議,優化出最短的訪問路徑,訪問到對應的路由器上的,而後對應的路由器經過端口映射技術訪問到目標IP的端口上.(內網的IP,由於是虛擬的,因此外部是訪問不到的,只能訪問到公網IP,像Jd類的大公司,都會買一個公網IP,因此咱們才能直接訪問到)

 

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 -- 推遲執行的秒數)

 

相關文章
相關標籤/搜索