這篇文章主要為大家詳細介紹了Python網路編程的相關資料,Python通訊端編程,具有一定的參考價值,感興趣的小夥伴們可以參考一下
Python 提供了兩個層級訪問的網路服務。
低層級的網路服務支援基本的 Socket,它提供了標準的 BSD Sockets API,可以訪問底層作業系統Socket介面的全部方法。
進階別的網路服務模組 SocketServer, 它提供了伺服器中心類,可以簡化網路伺服器的開發。
什麼是 Socket?
Socket又稱”通訊端”,應用程式通常通過”通訊端”向網路發出請求或者應答網路請求,使主機間或者一台電腦上的進程間可以通訊。
socket()函數
Python 中,我們用 socket()函數來建立通訊端,文法格式如下:
socket.socket([family[, type[, proto]]])
參數
family: 通訊端家族可以使AF_UNIX或者AF_INET
type: 通訊端類型可以根據是連線導向的還是非串連分為SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填預設為0.
socket實現服務端與用戶端的簡單通訊(類比ssh的部分功能以及自動應答)
server端的簡單程式樣本:
#!/usr/bin/env python#coding:utf-8'''file:server.pydate:9/8/17 3:43 PMauthor:lockeyemail:lockey@123.comdesc:socket編程伺服器端,python3.6.2'''import reimport socket,time,oss = socket.socket() # 建立 socket 對象host = '127.0.0.1'#socket.gethostname() # 擷取本地主機名稱port = 9999 # 設定連接埠s.bind((host, port)) # 綁定連接埠s.listen(5) # 等待用戶端串連while True: conn, addr = s.accept() # 建立用戶端串連。 print('conneted address:'.decode('utf-8'), addr)#顯示串連到伺服器的用戶端的地址 while True: data = conn.recv(1024) #接收到的用戶端的請求或者返回 if not data: #當返回資訊為空白或者請求為空白時斷開用戶端串連 print('Connection closed!') break; data = data.decode('utf-8') #以下前三個條件都是設定的自動檢測應答,最後一個是根據輸入的內容進行的命令執行,並將結果返回給用戶端 if re.findall(r'who',data): reply = 'I am lockey'.encode('utf-8') elif re.findall(r'gender',data): reply = 'A boy'.encode('utf-8') elif re.findall(r'age',data): reply = '23'.encode('utf-8') else: print('execute com:',data) cmd_res = os.popen(data).read() if not cmd_res: #對於命令的執行如果沒有傳回值的話就給用戶端發送一條資訊 conn.send('No response'.encode('utf-8')) continue reply = cmd_res.encode('utf-8') conn.send(reply) #將結果發送給用戶端
client端的簡單實現:
#!/usr/bin/env python#coding:utf-8'''file:client.pydate:9/8/17 3:43 PMauthor:lockeyemail:lockey@123.comdesc:socket編程用戶端,python3.6.2'''import socket,time # 匯入 socket 模組s = socket.socket() # 建立 socket 對象host = '127.0.0.1'#socket.gethostname() # 擷取本地主機名稱port = 9999 # 設定連接埠好s.connect((host, port))while True: cmd = input("lockey#") #使用者輸入 if len(cmd) == 0:continue #如果使用者未輸入內容則繼續下一次輸入 s.send(cmd.encode('utf-8')) #將使用者輸入的內容發送給用戶端等待結果 result = s.recv(1024) if not result: #如果服務端沒有返回結果則繼續下一次輸入 continue print(result.decode('utf-8')) #如果服務端有返回則列印結果s.close()#使用者終止程式時關閉串連
伺服器端運行結果
用戶端運行