1. 程式人生 > >Python的socket模組

Python的socket模組

前言

在網路程式設計中的一個基本元件就是套接字(socket)。套接字主要是兩個程式之間的資訊通道。程式可能分佈在不同的計算機上通過套接字互相傳送資訊。在Python中的大多數的網路程式設計都隱藏了socket模組的基本細節,並且不直接和套接字互動。

套接字


套接字包括兩個:伺服器套接字客戶機套接字
建立一個伺服器套接字後,讓它等待連線。這樣它就在某個網路地址處監聽。
處理客戶端套接字比處理伺服器套接字簡單,因為伺服器套接字必須準備隨時處理客戶端的連線,同時還要處理多個連線,而客戶機只是地連線,完成事務,斷開連線。

套接字格式


一個套接字就是一個socket模組中的socket類例項。它例項化需要三個引數:第一個引數是地址族

(預設是socket.AF_INET);第二個引數是流(socket.SOCK_STREAM,預設值,for TCP)或者資料報(socket.SOCK_DGRAM,for UDP)套接字;第三個引數是使用的協議(預設是0)

伺服器套接字&客戶機套接字


  • 伺服器套接字使用bind(繫結伺服器主機ip,如果有多個網絡卡,就可以繫結多個ip)方法後,再呼叫listen方法去監聽這個給定的地址。
  • 客戶端套接字使用connect方法連線伺服器,在connect方法中使用的地址與bind方法中的地址相同(在伺服器,能實現很多功能,比如使用socket.gethostname得到當前的主機名)。
  • 伺服器套接字開始監聽後,它就可以接受客戶端的連線。這個步驟用accept方法來完成,這個方法會阻塞執行緒直到客戶端連線,然後該方法就返回一個格式為(client,address)的元組,client是一個客戶機套接字,address是一個前面解釋過的地址。伺服器能處理客戶端到它滿意的程度,然後呼叫另一個accept方法開始等待下一個連線。這個過程通常是在無線迴圈中使用。

套接字方法(send&recv)


套接字方法send和recv方法的狀態有阻塞與非阻塞兩種狀態。預設狀態是阻塞模式

  • 阻塞模式
    在阻塞模式下send操作將會等待所有資料均被拷貝到傳送緩衝區後才會返回,等待!
    在阻塞模式下,recv會一直阻塞到接收緩衝區裡有一個位元組或一個完整的UDP資料報為止,然後再返回,等待!
  • 非阻塞模式
    在非阻塞模式下send操作會立即返回,不等待!
    在非阻塞模式下,recv會立即返回,不等待!