1. 程式人生 > >python學習第33天網絡編程part3

python學習第33天網絡編程part3

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=bdir
            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