服務端
# 服務端應該滿足兩個特點:
# 1、一直對外提供服務
# 2绎狭、并發(fā)地服務多個客戶端
import subprocess
import struct
import json
from socket import *
server=socket(AF_INET,SOCK_STREAM)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它治专,在bind前加
server.bind(('127.0.0.1',8089))
server.listen(5)
# 服務端應該做兩件事
# 第一件事:循環(huán)地從板連接池中取出鏈接請求與其建立雙向鏈接,拿到鏈接對象
while True:
conn,client_addr=server.accept()
# 第二件事:拿到鏈接對象故痊,與其進行通信循環(huán)
while True:
try:
cmd=conn.recv(1024)
if len(cmd) == 0:break
obj=subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
stdout_res=obj.stdout.read()
stderr_res=obj.stderr.read()
total_size=len(stdout_res)+len(stderr_res)
# 1顶瞳、制作頭
header_dic={
"filename":"a.txt",
"total_size":total_size,
"md5":"123123xi12ix12"
}
# 字典轉字符
json_str = json.dumps(header_dic)
json_str_bytes = json_str.encode('utf-8')
# 2、先把頭的長度發(fā)過去
x=struct.pack('i',len(json_str_bytes))
conn.send(x)
# 3愕秫、發(fā)頭信息
conn.send(json_str_bytes)
# 4慨菱、再發(fā)真實的數據
conn.send(stdout_res)
conn.send(stderr_res)
except Exception:
break
conn.close()
客戶端
import struct
import json
from socket import *
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8089))
while True:
cmd=input('請輸入命令>>:').strip()
if len(cmd) == 0:continue
client.send(cmd.encode('utf-8'))
# 接收端
# 1、先手4個字節(jié)戴甩,從中提取接下來要收的頭的長度
x=client.recv(4)
header_len=struct.unpack('i',x)[0]
# 2符喝、接收頭,并解析
json_str_bytes=client.recv(header_len)
json_str=json_str_bytes.decode('utf-8') # 轉為json
header_dic=json.loads(json_str) # 轉為字典
print(header_dic)
total_size=header_dic["total_size"]
# 3甜孤、接收真實的數據
recv_size = 0
while recv_size < total_size:
recv_data=client.recv(1024)
recv_size+=len(recv_data) # 真實數據為协饲,每次現有的數據加上沒有傳輸過來的字節(jié)長度(不難直接+1024,可能網絡延遲一次只收到2個bytes)
print(recv_data.decode('utf-8'),end='')
else:
print()
# 粘包問題出現的原因
# 1缴川、tcp是流式協議茉稠,數據像水流一樣粘在一起,沒有任何邊界區(qū)分
# 2把夸、收數據沒收干凈而线,有殘留,就會下一次結果混淆在一起
# 解決的核心法門就是:每次都收干凈,不要任何殘留
執(zhí)行
/usr/local/bin/python3 "/Users/客戶端.py"
請輸入命令>>:ls
{'filename': 'a.txt', 'total_size': 34, 'md5': '123123xi12ix12'}
test.py
客戶端.py
服務端.py
轉自egon大佬博客膀篮!
https://www.cnblogs.com/linhaifeng/articles/6129246.html