执行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()

 

posted @ 2016-12-18 22:22  Vincen_shen  阅读(405)  评论(0)    收藏  举报