1 import socket
2 import struct
3 import json
4 import subprocess
5 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
6 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
7 phone.bind(('127.0.0.1',8080)) #插入卡
8 phone.listen(5) #开机
9 while True: #链接循环
10 conn,addr=phone.accept()
11 print('client :',addr)
12 while True: #通讯循环
13 try:
14 cmd=conn.recv(1024)
15 if not cmd:break #针对linux,客户端断开链接的异常处理
16 print('from client msg :%s' %cmd)
17
18 res=subprocess.Popen(cmd.decode('utf-8'),
19 shell=True,
20 stdout=subprocess.PIPE,
21 stderr=subprocess.PIPE)
22
23 err=res.stderr.read()
24 if err:
25 back_msg=err
26 else:
27 back_msg=res.stdout.read()
28 #第一阶段:制作报头
29 head_dic={
30 'data_size':len(back_msg)
31 }
32 head_json=json.dumps(head_dic)
33 head_bytes=head_json.encode('utf-8')
34
35 #第二阶段:发送报头的长度
36 conn.send(struct.pack('i',len(head_bytes)))
37
38 #第三阶段:发报头
39 conn.send(head_bytes)
40 #第四阶段:发真实数据
41 conn.sendall(back_msg)
42
43
44 except Exception:
45 break
46 conn.close()
47 phone.close()