一、粘包现象
让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig)
注意注意:
res=subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码
且只能从管道里读一次结果
1 #_*_coding:utf-8_*_ 2 __author__ = 'Linhaifeng' 3 from socket import * 4 import subprocess 5 6 ip_port=('127.0.0.1',8080) 7 BUFSIZE=1024 8 9 tcp_socket_server=socket(AF_INET,SOCK_STREAM) 10 tcp_socket_server.bind(ip_port) 11 tcp_socket_server.listen(5) 12 13 while True: 14 conn,addr=tcp_socket_server.accept() 15 print('客户端',addr) 16 17 while True: 18 cmd=conn.recv(BUFSIZE) 19 if len(cmd) == 0:break 20 21 act_res=subprocess.Popen(cmd.decode('utf-8'),shell=True, 22 stdout=subprocess.PIPE, 23 stdin=subprocess.PIPE, 24 stderr=subprocess.PIPE) 25 26 act_err=act_res.stderr.read() 27 if act_err: 28 ret=act_err 29 else: 30 ret=act_res.stdout.read() 31 32 conn.sendall(ret) 33 34 服务端