87-python-解决黏包( struct 模块 )
输入 dos 命令即可执行代码中的input
server
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input('>>>')
if cmd == 'q':
break
conn.send(cmd.encode('gbk'))
# num = conn.recv(1024).decode('gbk')
# conn.send(b'ok')
# ret = conn.recv(int(num)).decode('gbk')
num = conn.recv(4)
num = struct.unpack('i',num)[0]
res = conn.recv(int(num)).decode('gbk')
print(res)
conn.close()
sk.close()
client
import struct
import socket
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
cmd = sk.recv(1024).decode('gbk')
if cmd == 'q':
break
ret = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout_r = ret.stdout.read()
stderr_r = ret.stderr.read()
# sk.send(str(len(stdout_r) + len(stderr_r)).encode('gbk'))
len_num = len(stdout_r) + len(stderr_r)
num_by = struct.pack('i',len_num)
sk.send(num_by)
sk.send(stdout_r)
sk.send(stderr_r)
sk.close()

浙公网安备 33010602011771号