忙了兩天,繼續更文!希望多多支持。
套接字
套接字是一種具有之前所說的"通訊端點"概念的計算機網絡數據結構。網絡化的應用程序在開始任何通訊之前都必需要創建套接字。
套接字有三種:
1、 AF_UNIX(在 POSIX1.g 標準中也叫 AF_LOCAL),表示"地址家族:UNIX",是指在unix系統中使用的 套接字,這些套接字是基于文件的。所以,它們的底層結構是由文件系統來支持的。
2、 AF_INET或叫"地址家族:Internet"。它是基于網絡的,還有一種地址家族 AF_INET6 被用于網際協議第 6 版(IPv6)尋址上。
3、 AF_NETLINK:Python 2.5 中加入了一種 Linux 套接字的支持:AF_NETLINK(無連接)套接字家族讓用戶代碼與內核代碼之間的 IPC 可以使用標準 BSD 套接字接口。
Python 只支持 AF_UNIX,AF_NETLINK,和 AF_INET 家族。我們平時使用的大部分都是基于網絡的,所以,主要用AF_INET。
1、 面向連接與無連接
有過網絡基礎的人都會了解TCP協議和UDP協議,他倆是不同的。主要區別就是TCP是基于面向連接的,而UDP是無連接的。
面向連接
即在通訊之前一定要建立一條連接,就像跟朋友打電話時那樣。TCP協議在和別人通信的時候首先要進行三次握手和建立連接,才能繼續通信。
要創建 TCP 套接字就得在創建的時候,指定套接字的類型為 SOCK_STREAM。TCP 套接字采用 SOCK_STREAM 這個名字,表達了它做為流套接字的特點。由于這些套接字使用 Internet 協議(IP)來查找網絡中的主機,這樣形成的整個系統,一般會由這兩個協議(TCP 和 IP)來提及,即 TCP/IP。
無連接
無連接和面向連接正好相反,它不需要先和別人建立連接,而是直接和別人通訊,就像我直接對你喊話一樣。這樣不能保證通訊的可靠性和數據完整性。這種協議主要用在一些在線視頻傳輸方面,因為視頻中丟一點信息對觀看影響不大。
實現這種連接的主要協議就是用戶數據報協議(即 UDP)。要創建 UDP 套接字在創建的時候,指定套接字類型為 SOCK_DGRAM。S由于這些套接字使用 Internet 協議來查找網絡中的主機,這樣形成的整個系統,一般會由這兩個協議(UDP 和 IP)來提及,即 UDP/IP。
socket()模塊函數
在python中,我們主要調用socket()函數來進行 網絡編程。
socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。這幾個常量的意義可以參考之前的解釋。protocol 一般不填,默認值為 0。
創建一個 TCP/IP 的套接字,你要這樣調用 socket.socket():
同樣地,創建一個 UDP/IP 的套接字,你要這樣:
python套接字函數:
TCP編程:
客戶端和服務器建立連接流程圖如下:
TCP服務器編程步驟:
如果有多個客戶端要連接服務器,服務器端可以創建線程來與客戶端建立連接,下一節將會將。
示例代碼:
TCP客戶端編程
示例代碼:
運行結果:
UDP編程:
Udp相比TCP就簡單多了
UDP服務器編程:
示例代碼:
UDP客戶端編程:
運行結果:
下一篇介紹python服務器與客戶端多線程編程,歡迎關注。