python學習第33天網絡編程part3
阿新 • • 發佈:2018-11-06
upper cmd serve 解決 true 針對 解決方法 執行 多個
之前簡單介紹了tcp和udp的服務端和客戶端,但一個完整的服務端必須至少滿足三個功能
(1)綁定一個固定的ip和port
(2)一直對外提供服務,穩定運行
(3)能夠支持並發
一、通信循環
對於客戶端與服務端,不單單只能交流一次,正常需要交流多次,這時候需要支持通信循環,用while循環實現多次交流
服務端:
from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind((‘127.0.0.1‘, 8080)) server.listen(5) conn, client_addr = server.accept() # 通信循環while True: data = conn.recv(1024) conn.send(data.upper()) conn.close() server.close()
客戶端:
from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect((‘127.0.0.1‘, 8080)) # 通信循環 while True: msg=input(‘>>: ‘).strip() client.send(msg.encode(‘utf-8‘)) data=client.recv(1024) print(data) client.close()
二、鏈接循環
單單一個服務端和客戶端交流是不夠的,需要多個客戶端可以與鏈接循環
三、bug處理
(1)起因:當客戶端非正常的斷開,服務端就會報錯,可預知但無法準確知道。
(2)起因:客戶端輸入了空,服務端不會收到空數據;如果服務端收到了空數據,肯定是客戶端單方面的把鏈接異常中斷掉,而在在windows系統上服務端就會拋出異常,在Linux系統上服務端recv一直收空,無法預知異常發生的條件
解決方法:異常處理try...except
from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind((‘127.0.0.1‘, 8080)) server.listen(5) conn, client_addr = server.accept() print(client_addr) # 通信循環 while True: try: data = conn.recv(1024) if len(data) == 0:break # 針對linux系統 print(‘-->收到客戶端的消息: ‘,data) conn.send(data.upper()) except ConnectionResetError: break conn.close() server.close()
為了執行系統命名,服務端需要導入subprocess模塊
server = socket(AF_INET, SOCK_STREAM) server.bind((‘127.0.0.1‘, 8081)) server.listen(5) # 鏈接循環 while True: conn, client_addr = server.accept() print(client_addr) # 通信循環 while True: try: cmd = conn.recv(1024) #cmd=b‘dir‘ if len(cmd) == 0: break # 針對linux系統 obj=subprocess.Popen(cmd.decode(‘utf-8‘), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout=obj.stdout.read() stderr=obj.stderr.read() print(len(stdout) + len(stderr)) conn.send(stdout+stderr) except ConnectionResetError: break conn.close() server.close()
python學習第33天網絡編程part3