socket_server服务端
import socket,os
server = socket.socket()
server.bind(('localhost',9999))
# 监听socket
server.listen()
while True:
# 接收客户端消息
conn,addr = server.accept()
print('new conn:',addr)
while True:
data = conn.recv(1024)
# 判断数据是否为空
if not data:
print('客户端已断开!')
break
print('执行指令:',data)
# 调用os的popen方法
cmd_res = os.popen(data.decode()).read()
print('before send',len(cmd_res))
# 判断指令是否为空或者指令是否有效
if len(cmd_res)==0:
cmd_res = 'cmd has nor output'
conn.send(cmd_res.encode('utf-8'))
print('===========send done============')
server.close()
socket_client服务端
import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
cmd = input('>>:').strip()
# 不允许指令为空
if len(cmd)==0:continue
# 发送指令
client.send(cmd.encode('utf-8'))
# 接收服务端发送的数据
cmd_res = client.recv(1024)
print(cmd_res.decode('utf-8'))
client.close()
执行结果
服务端
客户端
BUG:
当执行ipconfig指令时,可以看到并没有返回完整的数据,这是因为指令结果数据大小超出了1024,(例如总数据为2024,第一次只发送了1024到client,剩下的保存到了缓冲区中,这样的话,在执行下一条数据的时候,会先把缓冲区的数据传送过去。)当缓冲区满了或者超时的时候会自动发到客户端
修改版
socket_server服务端
# -*- coding: utf-8 -*-
__author__ = 'leeho'
import socket,os
server = socket.socket()
server.bind(('localhost',9999))
# 监听socket
server.listen()
while True:
# 接收客户端消息
conn,addr = server.accept()
print('new conn:',addr)
while True:
print('等待新指令')
data = conn.recv(1024)
# 判断数据是否为空
if not data:
print('客户端已断开!')
break
print('执行指令:',data)
# 调用os的popen方法
cmd_res = os.popen(data.decode()).read()
print('before send',len(cmd_res))
# 判断指令是否为空或者指令是否有效
if len(cmd_res)==0:
cmd_res = 'cmd has nor output'
conn.send(str(len(cmd_res.encode())).encode('utf-8')) #先发送大小给客户端
conn.send(cmd_res.encode('utf-8'))
print('===========send done============')
server.close()
socket_client客户端
# -*- coding: utf-8 -*-
__author__ = 'leeho'
import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
cmd = input('>>:').strip()
# 不允许指令为空
if len(cmd)==0:continue
# 发送指令
client.send(cmd.encode('utf-8'))
# 接收服务端发送的数据
cmd_re_size = client.recv(1024)
print('命令结果大小:',cmd_re_size)
received_size = 0
received_data = b''
while received_size < int(cmd_re_size.decode('utf-8')):
data = client.recv(1024)
received_size+=len(data) #每次收到的有可能小于1024,必须用len判断
# print(data.decode('utf-8'))
received_data+=data
else:
print('cmd res received done ...',received_size)
print(received_data.decode('utf-8'))
client.close()
解决数据大小问题。