服务端
#coding:utf-8
#!/usr/bin/env python3
import socket
import subprocess
import struct
import threading
import time
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('',8888))
phone.listen(5)
def func1(conn,client_addr):
try:
while True:
cmd = conn.recv(1024)
if cmd.decode('utf-8') == 'exit':
phone.close()
break
ret = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
correct_msg=ret.stdout.read()
error_msg=ret.stderr.read()
total_size= len(correct_msg) +len(error_msg)
ret = struct.pack('i',total_size)
conn.send(ret)
conn.send(correct_msg + error_msg)
except ConnectionResetError as e:
return e
while True:
conn, client_addr = phone.accept() #如果未收到会处于hold状态
th_client=threading.Thread(target=func1,args=(conn,client_addr))
print(th_client.name)
print(len(threading.enumerate()))
th_client.start()
客户端
import socket
import struct
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('xx.xx.xx.xx',8888))
recvsize=1024
while 1:
cmd = input('>>>')
if len(cmd) == 0:
continue
phone.send(cmd.encode('utf-8'))
data_head= phone.recv(4)
total_size=struct.unpack('i',data_head)[0]
total_data=b''
#防止粘包
while len(total_data) < total_size:
remainder=(total_size - len(total_data)) % recvsize
if remainder == 0:
total_data += phone.recv(recvsize)
else:
total_data += phone.recv(remainder)
print(total_data.decode('gbk'))
phone.close()