標籤:
網路編程概論
Socket是電腦之間進行網路通訊的一套程式介面.目前,Socket編程已經成為了網路編程的標準,電腦之間通訊都必須遵守Socket介面的相關要求.
Socket對象是網路通訊的基礎,字相當於一個管道串連了發送端和接收端,並在兩者之間互相傳遞資料.Python對Socket進行了二次封裝,簡化了程式開發步驟,大大提高了開發的效率.
在網路通訊模型中,需要兩個重要的資訊才能完成資料的傳輸:IP地址和連接埠號碼. 在接收端,主機負責接收所有發給自己的資料包,並將這些資料放到作業系統的資料轉送線上,再由相應的應用程式在傳輸線上根據連接埠號碼分別拿取各自所需要的資料. 這要求應用程式在資料到達之前就必須線上路上進行等待.
一旦傳輸匯流排上有資料到達,這些應用程式會按照資料包上的連接埠標示分別拿取自己的資料.但是如果資料到達傳輸匯流排時,相應的應用程式還沒有啟動,那麼該資料將被作業系統丟棄.
上面的內容說明:
①網路資料包中需要有接受者的資訊,即IP地址和連接埠號碼
②接收者必須在資料到達前,做好接收資料的準備
③不同的應用程式,依靠不同的連接埠號碼來識別自己的資料.
TCP/IP協議簇簡介
實際上,資料在Internet上傳輸時經過了很多的處理,這些處理包括在你發送的訊息填上對方的地址,打包和轉換為電訊號等一系列的過程. 接收方又將電訊號轉換為資料包,再拆包,最終看到發送的原始資訊.
這些複雜的過程是通過TCP/IP協議簇來完成的,它包含了一系列網路通訊的基礎協議.每個協議完成不同的功能.
在TCP/IP參考模型中總共分為5層:
應用程式層,傳輸層,網路層,資料連結層 和 物理層
在通訊時只有同一層的硬體或軟體才能互相識別資料,也就是說應用程式層只和應用程式層進行對話,不會發生一邊是應用程式層而另一邊是傳輸層的對話.
在TCP/IP參考模型中,IP地址是網路層的要素,連接埠是應用程式層的要素.
資料在經過每一層的時候,都會被加入一些額外的資訊.這些資訊被稱為頭部.加入頭部的過程被稱為資料的封裝.
傳輸層會加入一個TCP頭部(包含連接埠號碼)
網路層會加入IP頭部
資料連結層會加入幀頭部和尾部
資料連結層的作用就是負責將資料從鏈路的一端傳到鏈路的另一端.
UDP網路編程初步
在網路中有兩種傳輸資料的方式,不會出現資料丟失的是TCP傳輸,會發生資料丟失的是UDP傳輸.
大多數情況下,網路中使用可靠的TCP.
為了通訊,發送端和接收端都必須建立Socket對象.發送端利用Socket發送資料到網路上,接收端從Socket上讀取資料,然後用Print函數顯示在螢幕上.
接收端代碼
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(("",15001))data,addr = s.recvfrom(1024)print(data)s.close()
發送端代碼
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.sendto((‘Hello!!‘).encode(),(‘192.168.1.224‘,15001))s.close()
代碼解釋發送端
socket模組包含了進行網路通訊時所需要的各種功能函數,它把複雜的網路通訊過程進行了封裝,極大地簡化了開發的難度,提高了開發效率.
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
建立一個socket對象,兩個參數:
第一個表示協議族family.
第二個表示協議類型type.
函數的傳回值 是一個socket對象.若對象建立成功,則可以利用s來進行資料的發送和接收.
sendto()是發送資料的函數.第一個參數是需要發送的字串,第二個參數是一個元組,第一個元素是IP地址,第二個是連接埠.
接收端
調用socket時應該使用相同的參數.
bind()函數用來將socket綁定到指定的連接埠.bind()函數有兩個參數,第一個是IP地址,第二個是連接埠.第一個參數可以使用Null 字元串,表示使用原生任何可用IP.第二個參數使監聽連接埠.
在網路通訊中,電腦的一個連接埠只能被1個應用軟體使用,可用的連接埠範圍是1-65536.其中1-1024中的連接埠大多被作業系統和常用軟體使用.
recvfrom()函數用來接收網路中的資料.必須在bind()函數之後調用.兩者結合起來就是在指定的連接埠進行監聽.
recvfrom()的第一個傳回值是接收到的資料,第二個傳回值是發送方的IP地址.
recvfrom()有1個參數,用來指定接收緩衝區的大小.
發送端也稱為用戶端,接收端也稱為伺服器端.
UDP函數介紹socket
socket第一個參數:
socket.AF_INET IPv4
socket.AF_INET6 IPv6
socket第二個參數
SOCK_STREAM TCP協議
SOCK_DGRAM UDP協議
sendto
socket.sendto(string,address)
發送字串string到address指定的主機裡.
recvfrom
socket.recvfrom(bufsize)
從網路上接收UDP資料包,並將接收到的資料存放到bufsize定義的記憶體空間裡面.如果bufsize的值小於接收到的資料包的大小,那麼資料將會溢出.
【Python】 Python網路編程概論 + UDP初步