服务端
import socket
import struct
import subprocess
phone
= socket
.socket
(socket
.AF_INET
, socket
.SOCK_STREAM
)
phone
.setsockopt
(socket
.SOL_SOCKET
, socket
.SO_REUSEADDR
, 1)
phone
.bind
(('127.0.0.1', 8080))
phone
.listen
(5)
while 1:
conn
, addr
= phone
.accept
()
while 1:
try:
data
= conn
.recv
(1024)
res
= subprocess
.Popen
(data
.decode
('utf-8'), shell
=True,
stdout
=subprocess
.PIPE
,
stderr
=subprocess
.PIPE
)
stdout
= res
.stdout
.read
()
stderr
= res
.stderr
.read
()
res
= struct
.pack
('i', len(stdout
) + len(stderr
))
conn
.send
(res
)
conn
.send
(stdout
)
conn
.send
(stderr
)
except Exception
:
break
conn
.close
()
phone
.close
()
客户端
from socket
import *
import subprocess
ip
= ''
port
= 8080
back_log
= 5
buffer_size
= 1024
tcp_server
= socket
(AF_INET
, SOCK_STREAM
)
tcp_server
.bind
((ip
, port
))
tcp_server
.listen
(back_log
)
while True:
conn
, addr
= tcp_server
.accept
()
print('新的连接是', conn
)
print('新链接抵值', addr
)
while True:
try:
cmd
= conn
.recv
(buffer_size
)
if not cmd
: break
res
= subprocess
.Popen
(cmd
.decode
('utf-8'), shell
=True,
stdout
=subprocess
.PIPE
,
stdin
=subprocess
.PIPE
,
stderr
=subprocess
.PIPE
)
err
= res
.stderr
.read
()
if err
:
cmd_res
= err
else:
cmd_res
= res
.stdout
.read
()
length
= len(cmd_res
)
conn
.send
(str(length
).encode
('gbk'))
ready
= conn
.recv
(buffer_size
)
if ready
== b
'ready':
conn
.send
(cmd_res
)
except Exception
as e
:
print(e
)
break
conn
.close
()
tcp_server
.close
()
参考文章:
Python3之socket粘包问题
转载请注明原文地址:https://tech.qufami.com/read-17055.html