I am very new with asyncio, I am trying to setup a server on remote mashine (win) which asynchronously receives string commands and executes them in cmd.
I have a simple client side:
import asyncio
import socket
async def send_task(skt: socket.socket, msg):
skt.send(str.encode(msg))
print('task sent')
await asyncio.sleep(0.5)
async def main(skt: socket.socket, myloop):
tasks = [
myloop.create_task(send_task(skt, r'dir D:Userssandbox')),
myloop.create_task(send_task(skt, r'D: && cd D:Userssandbox && run.bat')),
myloop.create_task(send_task(skt, r'copy D:Userssandboxmodel1.mesh D:UsersZharovSPLAVcopied_model1.mesh'))
]
await asyncio.wait(tasks)
sock = socket.socket()
sock.connect(('192.168.7.42', 50182))
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main(sock, loop))
And a simple server side:
import asyncio
import subprocess as sb
import socket
import time
async def executor(cmd):
print('start executing job %s' % cmd.decode('cp1251'))
proc = sb.Popen(cmd.decode('cp1251'), shell=True, stdout=sb.PIPE)
stdout, stderr = proc.communicate()
print(stdout.decode('cp1251'))
if stderr:
print(stderr.decode('cp1251'))
print('------------------------------------------')
async def main():
sock = socket.socket()
sock.bind(('', 0))
print('port: %d' % sock.getsockname()[1])
sock.listen(1)
conn, addr = sock.accept()
print('connected:', addr)
start = time.time()
while time.time() - start < 100:
data = conn.recv(1024)
if data:
await executor(data)
conn.close()
asyncio.run(main())
The ‘dir’ command gets executed fine, but the second and the third command strings received concatenated by server, thats piece of stdout of executor() coroutine:
start executing job D: && cd D:Userssandbox && run.batcopy D:Userssandboxmodel1.mesh D:UsersSPLAVcopied_model1.mesh
It happens in 100% of times.
2