標籤:war 資料報 排隊 用戶端串連 發送資料 編輯 改變 允許 長度
1、測試環境:
宿主機系統:win10、python 3.5
虛擬機器系統:win7 64位、python 3.6、Vmware WorkStation 12
2、在【虛擬網路編輯器】中不需要做任何改變,既不需要勾選【橋接模式】也不需要勾選【NAT模式】,也不需要設定【DHCP】,即可實現宿主機和虛擬機器的區域網路組建;
3、使宿主機作為服務端,代碼如下:
import sockets = socket.socket()s.bind((‘192.168.136.1‘, 1234))s.listen(5)while True: c,addr = s.accept() c.send(b‘Thank you for connecting‘) c.close()
注意:
1)s.accept() 返回一個元組 (c, addr),c是一個用戶端通訊端,addr是一個地址,使用 c 發送資料和關閉 socket;
2)在 c.send 中使用首碼 b 將字串轉換為byte類型
4、使虛擬機器作為用戶端,代碼如下:
import sockets = socket.socket()s.connect((‘192.168.136.1‘,1234))print(s.recv(1024))
執行用戶端代碼後,擷取字串 b‘Thank you for connecting‘
附:python 中的 socket 原理。在 python 中的大多數網路編程都隱藏了socket模組的基本細節,不直接和通訊端互動。通訊端包括兩個:服務端和用戶端。在建立一個服務端通訊端後,讓它等待串連。這樣它就在某個網路地址處(IP地址和一個連接埠號碼的組合)監聽,直到用戶端通訊端串連。串連完成後,兩者就可以互動了。
處理用戶端通訊端通常比處理伺服器端通訊端容易,因為服務端必須準備隨時處理用戶端的串連,同時還要處理多個串連,而用戶端只是簡單地串連,完成事務,中斷連線。(為了簡便,使用 socketServer 類族和 Twisted 架構來處理服務端編程)
一個通訊端就是 socket 模組中的socket類的一個執行個體。它的執行個體化需要3個參數:第1個參數是地址族(預設是socket.AF_INET);第2個參數是流(socket.SOCK_STREAM,預設值)或資料報(socket.SOCK_DGRAM)通訊端;第3個參數是使用的協議(預設是0,使用預設值即可)。對於一個普通的通訊端,不需要提供任何參數。
服務端通訊端使用 bind 方法後,再調用 listen 方法去監聽某個特定地址。用戶端通訊端使用 connect 方法串連到服務端,在 connect 方法中使用的地址與服務端在 bind 方法中的地址相同(在服務端,能實現很多功能,比如使用函數 socket.gethostname 得到當前主機名稱)。在這種情況下,一個地址就是一個格式為 (host, port) 的元組,其中 host 是主機名稱(比如 ‘192.168.136.1‘ ),port 是連接埠號碼(一個整數)。listen 方法就是一個參數,即服務端未處理的串連長度(即允許排隊等待的串連數目,這些串連在禁用之前等待)。
服務端通訊端開始監聽後,它就可以接受用戶端的串連。這個步驟使用 accept 方法來完成。這個方法會阻塞(等待)直到用戶端串連,然後就返回一個格式為 (client, address) 的元組,client 是一個用戶端通訊端, address 是一個地址。服務端在處理完與該用戶端的串連後,再次調用 accept 方法開始等待下一個串連。這個過程通常都是在一個無限迴圈中實現的。
通訊端有兩個方法:send 和 recv ,用於傳輸和接收資料。可以使用字串參數調用 send 以發送資料,用一個所需的最大位元組數做參數調用 recv 來接收資料。如果不能確定使用哪個數字,那麼 1024 是個很好的選擇。
使用 python 3.6 和 Vmware WorkStation 構建一個小型虛擬區域網路通訊程式