PythonはTCPの粘着問題を解決する


制御コマンドの動作例structモジュールは、任意のタイプを固定長bytesサーバ端子に変換できます.
import socket
import struct
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()
conn, addr = sk.accept()
while True:
   cmd = input('>>>')
   if cmd == 'q'
      conn.send(b'q')
      break
   conn.send(cmd.encode('gbk'))
   num = connrecv(4)
   num = struct.unpack('i',num)[0]
   res = conn.recv(int(num)).decode('gbk')
   print(res)
conn.close()
sk.close()

Clientエンド
import socket
import struct
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1', 8080))
while True:
   cmd = sk.recv(1024).decode('gbk')
   if cmd == 'q'
      break
   res = subprocess.Popen(cmd, shell = True,
                          stdout = subprocess.PIPE
                          stderr = subprocess.PIPE)
   std_out = res.stdout.read()
   std_err = res.stderr.read()
   len_num = len(std_out) + len(std_err)
   num_by = struct.pack('i', len_num)
   sk.send(num_by)
   sk.send(std_out)
   sk.send(std_err)
sk.close()