標籤:部分 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模組