import socket import subprocess import json import struct server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #socket.AF_INET 基于网络的 socket.SOCK_STREAM server.bind((‘127.0.0.1‘,8848)) #绑定ip和端口时要用元祖的形式 server.listen(5) while True: conn,addr = server.accept() #等待客户端的接入 while True: try: cmd = conn.recv(1024).decode(‘utf-8‘) #接收的命令必须是解码后的命令 不然会报错 obj = subprocess.Popen( #crm的命令加载框架 cmd, shell= True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) right_msg = obj.stdout.read() error_msg = obj.stderr.read() file = {‘file_name‘:‘aaa‘, #关于文件的必须要有文件名,文件路径,文件大小 ‘file_path‘:‘‘, ‘file_size‘:len(right_msg + error_msg) } dic_json = json.dumps(file) #将字典序列化为字符串 dic_json_bytes = dic_json.encode(‘utf-8‘) #将字典的字符串转化为字节 dic_json_bytes_len = struct.pack(‘i‘,len(dic_json_bytes)) #将字典的字节数转化为固定的四个字节 conn.send(dic_json_bytes_len) conn.send(dic_json_bytes) conn.send(right_msg+error_msg) except Exception: break conn.close() server.close()
以上是服务端的代码:注意点 编程中接收和发送的都是字节
数据的发送都是字节的形式:通过三次发送报头,字典的字节,以及数据的字节
报头和字典都是辅助数据 都只是为了解决接收数据时可能会产生粘包问题做的铺垫
客户端的代码:
import socket import struct import json client = socket.socket() client.connect((‘127.0.0.1‘,8848)) #ip和端口用的是元祖的形式 cmd = input(‘>>>‘) client.send(cmd.encode(‘utf-8‘)) dic_json_bytes_len = client.recv(4) #接收报头 固定四个字节 dic_json_bytes = struct.unpack(‘i‘,dic_json_bytes_len)[0] #struct.unpack解包后的数据为元祖 dic_json_encode = client.recv(dic_json_bytes) #接收字典的字节数 根据报头解包出字典的字节数 判断接收字典的字节 dic_json = dic_json_encode.decode(‘utf-8‘) #字符串 dic = json.loads(dic_json) #得到字典的原型 total_data = b‘‘ while len(total_data) < dic[‘file_size‘]:#接收的字节数小于数据的字节数式,以每次接收1024的数量进行循环,直至接收完毕 data = client.recv(1024) total_data += data print(total_data.decode(‘gbk‘))
原文:https://www.cnblogs.com/shicongcong0910/p/10421963.html