Python網路編程之socket模組

來源:互聯網
上載者:User

標籤:部分   inet6   遠端連線   本機   ipv4   作用   oca   最小值   col   

1.網路通訊協定

  網路通訊協定是網路中進行資料交換與傳輸所需的規則、標準或約定,得到實用主要由文法(資料與資訊的結構形式)、語義和同步(事件的實現順序)三個要素組成。

  世界上最先提出的協議理論模型是由國際標準組織(ISO)提出的開放系統互聯基本參考模型(OSI),它採用的是七層協議的體繫結構。雖然OSI清晰完整,但終因複雜又不實用而沒有得到實用。另一方面,使用了簡化的OSI的TCP/IP協議卻得到了非常廣泛的應用,它是一個四層的體繫結構,包括應用程式層、運(傳)輸層、網際(絡)層和網路介面層。

應用程式層

(FTP、SMTP、HTTP等)

傳輸層

(TCP、UDP)

網路層

(IP)

網路介面層

 

TCP/IP協議圖

   TCP/IP協議其實是一個協議簇,不僅包括TCP和IP協議,還包括UDP、FTP、HTTP、SMTP等,此外還包括一些圖中沒顯示的ICMP、ARP、RARP等協議。

  這種分成的協議結構還表示出,上層協議需要傳輸的資料,應該交給它緊鄰的下層。而應用程式層和傳輸分別有兩個以上的協議,所以對於應用程式層來說,不同的協議資料可以通過傳輸層的不同協議來傳輸。

2、socket 模組

  TCP/IP 協議中的 TCP 和 UDP 協議都通一種名為通訊端(socket)來實現網路功能。通訊端是一種類檔案對象,它使程式能夠接受用戶端的串連或建立對用戶端的串連,用以發送和接收資料。無論是用戶端程式還是伺服器端程式,為了進行網路通訊,都要建立通訊端對象。

  在 Python 標準庫中,使用 socket 模組中提供的 socket 對象,可以在電腦網路中建立伺服器與用戶端,並且能夠進行通訊。伺服器端需要建立一個 socket 對象,並等待用戶端的串連。用戶端使用 socket 對象與伺服器端進行串連,一旦串連成功,用戶端和服務端就可以進行通訊了。

  socket 模組中的 socket 對象是 socket 網路編程的基礎對象,其初始化原型

  socket(family,type,proto)

  其參數含義:

  family:地址族,選擇性參數。預設AF_INET(IPv4),也可以是AF_INET6 或者是 AF_UNIX;

  type:socket 類型,選擇性參數。預設SOCK_STREAM(TCP協議),可用SOCKET_DGRAM(UDP協議);

  proto:協議類型,選擇性參數。預設為0。

  作為伺服器端的 socket 對象主要應用以下常用方法:

  1.bind(address)

  其參數 address 是由IP地址和連接埠組成的元組,如‘(‘127.0.0.1‘, 1051)’ 。如果IP地址為空白,則表示本機。它的作用是使用socket和伺服器位址相關聯。

  2.listen(backlog)

  參數backlog指定在拒接串連之前,作業系統允許它的最大掛起串連數量。最小值為0(如果使用者使用了更小的值,則會自動被置為0),大部分程式最多設定為5就足夠了。

  該方法將socket設定為伺服器模式,之後就可以電泳一下的accept()方法等待用戶端的串連。

  3.accept()

  它會等待進入的串連,並返回一個由建立的與用戶端的socket串連和用戶端地址組成的元組,而客戶的地址也是一個由用戶端IP地址和連接埠組成的元組。

  4.close()

  這個方法的作用就是關閉該socket。停止本程式與伺服器或用戶端的串連。

  5.recv(buffersize[,flag])

  用於接受遠端連線發來的資訊,並返回該資訊,其類型為bytes。buffersize可以設定緩衝區的大小。

  6.send(data[,flags])

  用於向串連的遠端發送資訊,data應該是bytes類型的資料。其傳回值為一已傳送的位元組數。其傳輸的資料長度有一定的限度。

  7.sendall(data[,flags])

  這個方法與send()方法相似,但是有時候在傳輸資料時,由於資料過多,用send()方法無法一次性傳輸,用sendall()方法可以解決這一問題,而sendall()也是通過迴圈運行send()方法來進行傳輸。

  而建立伺服器端的socket就要依次使用這幾個方法,其基本順序為:

 

3.建立一個伺服器端  
 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 import socket 4  5 sk = socket.socket() #建立socket對象 6 address = (‘127.0.0.1‘, 8001)  7 sk.bind(address) #綁定本機地址 8 sk.listen(5) #監聽 9 print(‘waiting...‘)10 conn,addr = sk.accept() #等待用戶端串連11 12 while True:13     #防止用戶端異常關閉,導致伺服器端程式出錯14     try: 15         data = conn.recv(1024)16     except Exception:17         data = None18     #當用戶端傳送的資料為空白時,關閉伺服器端與用戶端之間的串連,等待其他用戶端串連19     if not data: 20         conn.close()21         conn,addr = sk.accept()22         continue23     print(str(data,  ‘utf8‘)) # 因為接收的資料類型為bytes,所以轉換成字串再列印24      inp = input(‘>>>‘)25     conn.send(bytes(inp, ‘utf8‘)) #傳送的資料類型應為bytes26 27 sk.close()

 

4.建立一個用戶端

  相比用socket建立伺服器端而言,建立用戶端程式簡單多了。當然還是需要建立一個socket的執行個體,而後調這個socket執行個體的connect()方法來串連伺服器端即可。這個方法原型為:

  connect(address)

  參數address 通常也是一個元組(由一個主機名稱/IP地址,連接埠構成),當然要串連本機電腦的話,主機可直接使用‘localhost‘,它用於將socket串連到遠程以address為地址的電腦。

  用socket 建立用戶端的基本流程:

  

代碼實現:

 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 import socket 4  5 sk = socket.socket() #建立通訊端 6 address = (‘127.0.0.1‘, 8001) 7 sk.connect(address) # 與伺服器端串連 8 while True: 9     inp = input(‘>>>‘)10     if inp == ‘exit‘:11         break12     sk.send(bytes(inp, ‘utf8‘))13     data = sk.recv(1024)14     print(str(data, ‘utf8‘))15 16 sk.close()

 

 

 

  

Python網路編程之socket模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.