远程执行命令程序:
服务端:
1 from socket import * 2 import subprocess 3 4 server=socket(AF_INET,SOCK_STREAM) 5 server.bind(('127.0.0.1',8080)) 6 server.listen(5) 7 8 while True: 9 conn,client_addr=server.accept() #(连接对象,客户端的ip和端口) 10 print(client_addr) 11 while True: 12 try: 13 cmd=conn.recv(1024) 14 obj=subprocess.Popen(cmd.decode('utf-8'), 15 shell=True, 16 stdout=subprocess.PIPE, 17 stderr=subprocess.PIPE 18 ) 19 stdout=obj.stdout.read() 20 stderr=obj.stderr.read() 21 22 # 先发送数据的长度 23 total_size=len(stdout) + len(stderr) 24 conn.send(total_size) 25 26 # 发送真实的数据 27 conn.send(stdout) 28 conn.send(stderr) 29 except ConnectionResetError: 30 break 31 32 conn.close() 33 server.close()
客户端:
1 from socket import * 2 3 client=socket(AF_INET,SOCK_STREAM) 4 client.connect(('127.0.0.1',8080)) 5 # print(client) 6 7 while True: 8 cmd=input('>>>: ').strip() 9 if not cmd:continue 10 client.send(cmd.encode('utf-8')) 11 # print('has send') 12 res=client.recv(14744) 13 # print('has recv') 14 print(len(res)) 15 print(res.decode('gbk')) 16 17 client.close()
粘包问题:
解决粘包问题:
服务端:
1 from socket import * 2 import subprocess 3 import struct 4 import json 5 6 server=socket(AF_INET,SOCK_STREAM) 7 server.bind(('127.0.0.1',8080)) 8 server.listen(5) 9 10 while True: 11 conn,client_addr=server.accept() #(连接对象,客户端的ip和端口) 12 print(client_addr) 13 while True: 14 try: 15 cmd=conn.recv(1024) 16 obj=subprocess.Popen(cmd.decode('utf-8'), 17 shell=True, 18 stdout=subprocess.PIPE, 19 stderr=subprocess.PIPE 20 ) 21 stdout=obj.stdout.read() 22 stderr=obj.stderr.read() 23 24 # 1、制作报头 25 header_dic={ 26 'total_size':len(stdout) + len(stderr), 27 'md5':'123svsaef123sdfasdf', 28 'filename':'a.txt' 29 } 30 header_json = json.dumps(header_dic) 31 header_bytes = header_json.encode('utf-8') 32 33 # 2、先发送报头的长度 34 header_size=len(header_bytes) 35 conn.send(struct.pack('i',header_size)) 36 37 # 3、发送报头 38 conn.send(header_bytes) 39 40 # 4、发送真实的数据 41 conn.send(stdout) 42 conn.send(stderr) 43 except ConnectionResetError: 44 break 45 46 conn.close() 47 server.close()
客户端:
1 from socket import * 2 import struct 3 import json 4 5 client=socket(AF_INET,SOCK_STREAM) 6 client.connect(('127.0.0.1',8080)) 7 # print(client) 8 9 while True: 10 cmd=input('>>>: ').strip() 11 if not cmd:continue 12 client.send(cmd.encode('utf-8')) 13 #1、先收报头的长度 14 header_size=struct.unpack('i',client.recv(4))[0] 15 16 #2、接收报头 17 header_bytes=client.recv(header_size) 18 19 #3、解析报头 20 header_json=header_bytes.decode('utf-8') 21 header_dic=json.loads(header_json) 22 print(header_dic) 23 24 total_size=header_dic[ 'total_size'] 25 # print(total_size) #1025 26 #4、根据报头内的信息,收取真实的数据 27 28 recv_size=0 29 res=b'' 30 while recv_size < total_size: 31 recv_data=client.recv(1024) 32 res+=recv_data 33 recv_size+=len(recv_data) 34 35 print(res.decode('gbk')) 36 client.close()
struct模块:
1 #1、把整型数字转成bytes类型 2 #2、转成的bytes是固定长度的 3 4 import struct 5 import json 6 7 header_dic = { 8 'total_size': 3122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222121, 9 'md5': '123svsaef123sdfasdf', 10 'filename': 'a.txt' 11 } 12 13 header_json=json.dumps(header_dic) 14 # print(header_json,type(header_json)) 15 header_bytes=header_json.encode('utf-8') 16 header_size=len(header_bytes) 17 18 print(header_size) 19 obj=struct.pack('i',header_size) 20 print(obj,len(obj))