python—day26

远程执行命令程序:

服务端:

 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))

猜你喜欢

转载自www.cnblogs.com/kermitjam/p/8919724.html