客户端代码:
1 import socket 2 sk = socket.socket() 3 address = ('127.0.0.1',8006) 4 sk.connect(address) 5 print('已连接') 6 7 while True: 8 inp = input('>>>') 9 if inp == 'exit': 10 break 11 elif inp == '': 12 print('不能输入空白字符') 13 continue 14 sk.send(bytes(inp,'utf8')) 15 result_len = int(str(sk.recv(1024),'utf8')) #接收结果的长度 16 print(result_len) 17 data = bytes() 18 while len(data) != result_len: 19 receive = sk.recv(1024) 20 data += receive 21 print(str(data,'gbk'))
1.当结果较大时,一次接收不完,需要循环接收
2.通过比较已接收内容的大小与完整结果的大小判断是否接收完毕
3.19行:我们收到的内容是Windows帮我们将读到的内容编码为bytes类型,而Windows默认是gbk
所以在21行,解码时要用gbk
服务端代码:
1 import subprocess #该模块用来执行cmd命令 2 import socket 3 sk = socket.socket() 4 address = ('127.0.0.1',8006) 5 sk.bind(address) 6 sk.listen(3) 7 8 while True: 9 print('waiting for connection..........') 10 conn,addr = sk.accept() 11 while True: 12 try: 13 data = str(conn.recv(1024),'utf8') 14 if data != '': 15 print(data) 16 else: 17 continue 18 except Exception as e: 19 print(e) 20 break 21 obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE) 22 cmd_result = obj.stdout.read() #读取cmd命令的结果,该结果就是bytes类型 23 result_len = str(len(cmd_result)) #计算结果的大小 24 conn.send(bytes(result_len,'utf8')) #先发送一个结果的大小 25 conn.sendall(cmd_result) #发送命令执行的内容 26 sk.close()
bytes类型与整型不能互转,必须用bytes与str的互转做过渡