1. 程式人生 > 實用技巧 >python 標準庫模組socket(五-網路)

python 標準庫模組socket(五-網路)

Python 標準庫

Python語言參考描述了 Python 語言的具體語法和語義,這份庫參考則介紹了與 Python 一同發行的標準庫。它還描述了通常包含在 Python 發行版中的一些可選元件。

Python 標準庫非常龐大,所提供的元件涉及範圍十分廣泛,正如以下內容目錄所顯示的。這個庫包含了多個內建模組 (以 C 編寫),Python 程式設計師必須依靠它們來實現系統級功能,

例如檔案 I/O,此外還有大量以 Python 編寫的模組,提供了日常程式設計中許多問題的標準解決方案。其中有些模組經過專門設計,通過將特定平臺功能抽象化為平臺中立的 API 來鼓勵和加強 Python 程式的可移植性。

Windows 版本的 Python 安裝程式通常包含整個標準庫,往往還包含許多額外元件。對於類 Unix 作業系統,Python 通常會分成一系列的軟體包,因此可能需要使用作業系統所提供的包管理工具來獲取部分或全部可選元件。

在這個標準庫以外還存在成千上萬並且不斷增加的其他元件 (從單獨的程式、模組、軟體包直到完整的應用開發框架),訪問Python 包索引即可獲取這些第三方包。

官方文件(標準庫)https://docs.python.org/zh-cn/3.7/library/index.html

socket模組

  網路和程序間通訊--底層網路介面

  https://docs.python.org/zh-cn/3/library/socket.html#module-socket

In [2]: import socket  #

In [4]: socket.gethostname()  #獲取當前主機名稱
Out[4]: 'DESKTOP-SPLE7HF'

In [5]: socket.gethostbyname("localhost")  #
Out[5]: '127.0.0.1'

In [6]: socket.gethostbyname("DESKTOP-SPLE7HF") # 通過主機名稱獲取對應的IP地址
Out[6]: '192.168.22.1'

socket物件的方法

一、用於TCP

  1、socket()

    作用:建立套接字物件

    返回值:返回建立的套接字物件

from socket import *
# 1、建立套接字物件
sock = socket(family = AF_INET,type = SOCK_STREAM,proto = 0)

  2、bind(address)

    引數:address,本地地址,(IP,PORT)

    作用:將套接字繫結到本地address

# 2、繫結地址
sock.bind(("127.0.0.1",8989))

  3、listen()

    引數:允許伺服器連線的客戶端的數量

# 3、設定監聽
sock.listen(5)

  4、accept()

    引數:對IP套接字,是一個元組(IP,PORT)# 遠端IP和其埠

    作用:等待傳入連線

    返回值:返回一個元組,(套接字,地址)# 已連線物件的套接字,已連線物件的地址 

#4、等待連線
print("等待客戶端連線...")
connd,addr = sock.accept()
print("已有客戶端連線:",addr)

  5、recv(buffersize)

    引數:buffersize ,必選,一次最多從套接字接收buffersize個位元組的資料

    特徵

      【1】 如何連線的另一端斷開連線,則recv立即返回空子串

      【2】 recv是從接受緩衝區取出內容,當緩衝區為空則阻塞

      【3】 recv如果一次接受不完緩衝區內容,下次會繼續接收

    返回值:返回接收到的資料,位元組串格式

data = sock.recv(1024)
print("收到伺服器回覆的訊息:",data.decode())

  6、send(data)

    引數:data,必須為位元組串,兩種選擇方式

       ① 位元組串格式,eg: data=b"hello world" # 此時,只能為ASCII編碼

       ② 字串格式,再進行編碼轉換為位元組串,eg:data=“北京歡迎你”.encode()

    特徵

      【1】 如果傳送的另外一段不存在則會產生Pipe Broken

      【2】recv是向傳送緩衝區傳送內容,當緩衝區為滿阻塞  

    返回值:返回已傳送的位元組數

# sed = connd.send("The server accepted your msg.".encode()) # 【1】
sed = connd.send(b"The server accepted your msg.") #【2】

  7、sendall(data)

    引數 : 同send

    功能 : tcp套接字傳送訊息

    返回值:如果傳送成功返回None

------------------------------------------

  8、connect(address)

    引數:address,是一個元組。(ip,埠)

    作用:將套接字連線到遠端地址   

#2 、發起連線
sock.connect(("127.0.0.1",8989))

  9、close()

    關閉套接字物件

二、用於UDP

  1、socket()

    sock = socket(AF_INET,SOCK_DGRAM)

  2、bind()

  3、recvfrom()

    data,addr = sockfd.recvfrom(buffersize)

    引數: 每次最多接受訊息的大小 ,位元組

    功能: 接受UDP訊息

    返回值:一個元組(data,addr)

        data 接收到的內容 ,

        addr 訊息傳送方的地址

    recvfrom每次接收一個報文,如果沒有接收完全則丟棄沒有收到的內容

  4、sendto()

    sockfd.sendto(data,addr)

    引數: data 要傳送的內容 ,bytes

    功能: UDP訊息傳送 。 addr ,目標地址

    返回:已傳送的位元組數

  5、close()

三、套接字的其它屬性和方法

  s表示套接字物件

  【1】屬性

      ① s.type

        返回表示套接字型別

      ②s.family

        返回地址型別

  【2】方法

      ① s.fileno()

        功能 : 獲取套接字的檔案描述符

        檔案描述符 : 每一個IO事件作業系統都會分配一個不同的正整數與之匹配,

              該整數即為此IO的檔案描述符

      ②s.getsockname()

        功能 : 獲取套接字繫結的地址

      ③s.getpeername()

        功能 : 獲取連線套接字客戶端的地址

      ④s.setsockopt(level,optname,value)

        引數 : level ,設定選項的型別 SOL_SOCKET。 optname 子類選項 。value 要設定的值

        功能 : 設定套接字選項

      ⑤s.getsockopt(level,optname)

        引數 : level ,要獲取選項的型別 SOL_SOCKET。 optname 子類選項

        功能 : 獲取套接字選項值

        返回值 : 獲取的值