执行shell命令的多线程多连接Socket
Server端:
1 import socket 2 import subprocess 3 import multiprocessing,threading 4 host = '' 5 port = 8000 6 buffersize = 1024 # 方便今后扩展 7 address = (host,port) # 方便今后扩展 8 9 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 10 s.bind(address) 11 12 def cmd(conn,addr): 13 while True: 14 data = bytes.decode(conn.recv(buffersize)) 15 result = subprocess.check_output(data,shell=True) 16 count = len(result) 17 print('count:',count) 18 conn.send(bytes(str(count),encoding='utf8')) 19 while count > 0 : 20 count2 = conn.send(result) 21 count = count - count2 22 conn.close() 23 24 while True: 25 s.listen(10) 26 conn,addr = s.accept() 27 print('Connect by:',addr) 28 process = threading.Thread(target=cmd,args=(conn,addr)) # 启动多线程来实现多个客户端同时连接,否则只能同时一个客户端连接。 29 process.start() 30 s.close()
Client端:
1 import socket 2 ''' 3 数据发送和接收要注意 encoding 和 decode 4 ''' 5 host = '127.0.0.1' 6 port = 8000 7 address = (host,port) # 方便今后扩展 8 buffersize = 1024 9 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 10 s.connect(address) 11 12 while True: 13 data = bytes(input('Please input cmd:'),encoding='utf8') 14 if len(data.strip()) == 0: 15 continue 16 s.send(data) 17 data_size = s.recv(buffersize) 18 print('data_size',data_size) 19 data2 = b'' 20 while True: 21 if int(data_size) == 0: 22 print('Done!') 23 break 24 data3 = s.recv(buffersize) 25 # print('data3',len(data3)) # 调试代码 26 data2 = data2 + data3 27 # print('data3',data3) # 调试代码 28 # print('len data3',len(data3)) # 调试代码 29 if len(data2) >= int(data_size): 30 break 31 print(data2.decode()) 32 33 s.close()