cmd_server
import socket import subprocess#可执行shell命令 sk=socket.socket() address=(\'127.0.0.1\',8000) sk.bind(address) sk.listen(3) print(\'waiting...\') while 1: conn,addr=sk.accept() while 1: try: data=conn.recv(1024)#数据过大 会导致接收不完全 except Exception as e: print(\'客户已离开\') break if not data:break print(str(data,\'utf-8\')) obj=subprocess.Popen(str(data,\'utf-8\'),shell=True,stdout=subprocess.PIPE) #stdout为标准输出 PIPE为管道 作用为将进程转为主进程 (封装了) #若不加最后一句 无法将其取到 赋值在变量上 cmd_result=obj.stdout.read() result_len=bytes(str(len(cmd_result)),\'utf-8\') # int类型不能直接转为bytes 需要通过str来中间过渡 conn.sendall(result_len) conn.recv(1024)#用于隔断 conn.sendall(cmd_result) sk.close() """"" client端发送一个指令 然后server端将结果进行返回 解决问题:若传输的命令结果过大,要多次接收,导致下一个命令无法执行 解决方法:利用len函数对传输的结果进行长度判断,之后传输给client端 再由client进行while循环判断 需要注意的:1.传输只会传bytes类,同时int无法直接转为bytes 所以需要用str进行过度 2.两个send在一起有可能会粘包,所以需要一个隔断 若用time模块 time.sleep()进行休眠的话 会拖延进程 所以再加任意\' 收与发\'就好 """
cmd_clinet:
import socket address=(\'127.0.0.1\',8000) sk=socket.socket() sk.connect(address) while True: a=input(">>>") if a==\'exit\': break sk.send(bytes(a,\'utf-8\')) recv_len=int(str(sk.recv(1024),\'utf-8\')) sk.send(\'ok\')#用于隔断 print(recv_len) data=bytes() while len(data)!=recv_len: recv=sk.recv(1024) data+=recv print(str(data,\'gbk\')) sk.close() """"" """