server
![]()
import socket
import subprocess
ip_port = ('127.0.0.1',8879)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print ("服务端启动...")
while True:
conn,address = sk.accept()
while True:
try:
client_data=conn.recv(1024)
except Exception:
break
print (str(client_data,"utf8"))
print ("waiting...")
# server_response=input(">>>")
# conn.sendall(bytes(server_response,"utf8"))
cmd=str(client_data,"utf8").strip()
cmd_call=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
cmd_result=cmd_call.stdout.read()
if len(cmd_result)==0:
cmd_result=b"no output!"
result_len=bytes(str(len(cmd_result)),'utf8') #默认len是int类型。int无法直接转换成bytes类型
conn.sendall(result_len)#粘包现象。
conn.recv(1024) #解决粘包
conn.sendall(cmd_result)
print('send data size',len(cmd_result))
print('******************')
print('******************')
print('******************')
conn.close()
client端
import socket
ip_port = ('127.0.0.1',8879)
sk = socket.socket()
sk.connect(ip_port)
print ("客户端启动:")
while True:
inp = input('cdm:>>>').strip( )
if len(inp)==0:
continue
if inp=="q":
break
sk.sendall(bytes(inp,"utf8"))
result_len = int(str(sk.recv(1024),'utf8'))
sk.send('111') #做一个隔断,防止粘包
print(result_len)
data=bytes()
while len(data) != result_len:
server_response=sk.recv(1024) #这里接收server端cmd_result,windows shell 默认使用gbk,所以下班要用gbk解码
data+=server_response
print (str(data,"gbk")) #接收需要gbk解码
print('receive data size',len(server_response))
if inp == 'exit':
break
sk.close()