標籤:介紹 str 位元組 服務端 執行 col 超過 output import
一、什麼是網路編程
網路編程簡單來說就是對資訊的發送到接收,中間傳輸為物理線路的作用。
在我們沒有學過網路編程之前,在應用上寫的代碼都是只能自己提供自己使用,不能與其他人互動。那麼如何?相互連信呢?
二、資料之間的相互連信
1 服務端 2 import socket #匯入socket通訊端模組 3 server = socket.socket() #建立一個socket對象 4 server.bind(("192.168.13.132",8000)) #綁定IP與連接埠 5 server.listen(3) #規定只允許不超過三人連結服務端 6 conn,addr = server.accept() #建立媒介與用戶端地址 7 data = conn.recv(1024) #建立一個變數,通過媒介接收用戶端傳輸過來的位元組並限制不超過1024 8 print(data) #列印用戶端傳來的訊息 9 conn.send(b"123456") #返回給用戶端的位元組10 conn.close() #與伺服器取消連結11 server.close() # 關閉伺服器的服務
1 # 用戶端2 import socket #匯入socket模組3 client = socket.socket() #建立一個socket對象4 client.connect(("192.168.13.132",8000)) #與服務端建立連結5 client.send(b"456789") #向服務斷傳輸訊息(位元組型)6 data =client.recv(1024) #接服務端傳來的訊息 不超過1024位元組7 print(data) # 列印8 client.close() #關閉用戶端
三、網路編程的簡單應用
類比ssh
在沒有介紹代碼之前需要引入subprocess模組,subprocess是Python 2.4中新增的一個模組,它允許你產生新的進程,串連到它們的 input/output/error 管道,並擷取它們的返回(狀態)碼
我們需要學會一下代碼就足夠了
1 import subprocess2 res = subprocess.Popen("ipconfig",3 shell= True,4 stderr=subprocess.PIPE,5 stdout=subprocess.PIPE6 7 )8 print(res.stdout.read().decode("gbk"))
建立服務端
1 # 服務端 2 import socket 3 import subprocess 4 server = socket.socket() 5 server.bind(("192.168.13.132",8000)) 6 server.listen(3) 7 print("建立連結中。。。") 8 conn,addr = server.accept() 9 print("等待響應中。。。")10 while True:11 cmd = conn.recv(1024).decode("utf-8")12 res = subprocess.Popen(cmd,13 shell= True,14 stderr=subprocess.PIPE,15 stdout=subprocess.PIPE16 )17 result = res.stdout.read()18 print("響應長度為%s" % len(result))19 conn.send(result.decode("gbk").encode("utf-8"))
建立用戶端
# 用戶端import socketclient =socket.socket()client.connect(("192.168.13.132",8000))while True: user_input = input("請輸入dose命令") client.send(user_input.encode("utf-8")) result = client.recv(1024).decode("utf-8") print(result)
四、黏包現象
黏包現象就是同時執行多條命令之後,得到的結果很可能只有一部分,在執行其他命令的時候又接收到之前執行的另外一部分結果,這種顯現就稱之為黏包。
只有tcp協議會出現黏包現象,dcp協議不會出現。
解決黏包的理想方案:
1 # 服務端 2 import socket #通訊端模組 3 import subprocess 4 import struct 5 server = socket.socket() 6 server.bind(("192.168.13.132",8000)) 7 server.listen(3) 8 print("建立連結中。。。") 9 conn,addr = server.accept()10 print("等待響應中。。。")11 while True:12 cmd = conn.recv(1024).decode("utf-8")13 res = subprocess.Popen(cmd,14 shell= True,15 stderr=subprocess.PIPE,16 stdout=subprocess.PIPE17 )18 result = res.stdout.read()19 error = res.stderr.read()20 print("響應長度為%s" % len(result))21 print("錯誤資訊為%s" % error.decode("gbk"))22 if error:23 back_message = error24 else:25 back_message = result26 conn.send(struct.pack("i", len(back_message))) # 構建前序27 conn.send(back_message) # 發送資料
1 # 用戶端 2 import socket 3 import struct 4 client =socket.socket() 5 client.connect(("192.168.13.132",8000)) 6 while True: 7 user_input = input("請輸入dose命令") 8 client.send(user_input.encode("utf-8")) 9 maxbytes = client.recv(4)10 long = struct.unpack("i",maxbytes)[0]11 num = 012 data = b""13 while num < long:14 receive = client.recv(1024)15 data +=receive16 num +=len(receive)17 print(data.decode("gbk"))
python之網路編程