本文主要是介绍Python传输解析PB消息Client段程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考链接
- http://blog.csdn.net/huithe/article/details/5223785
程序中使用python直接通过protobuf协议访问服务器,当服务器返回的数据比较大的时候,client端在接收数据之前,需要sleep一段时间,否则接收到的数据会不完整,然后解析出错。
pb文件内容如下:
package bse.bsp.triggerserver;message TriggerRequest {required uint32 client_id = 1; /*请求id*/required uint64 idea_id = 2; /*idea_id*/required bytes title = 3; /*原始title字面*/
};message TriggerInfo {required uint64 query_sign = 1;required bytes relv_score = 2;required bytes query = 3;required uint64 wmatch = 4; /*一个query被多种方式挖掘到*/required uint64 fea_sign = 5; /*所有特征拼接在一起的签民*/
};message TriggerResponse {required uint64 idea_id = 1;required uint32 update_time = 2; /*更新时间*/repeated TriggerInfo trigger_info_list = 3; /*query信息*/
};
生成pb的python依赖包
protoc -I=. --python_out=../interface ./trigger_server.proto
client端代码如下:
# !/usr/bin/env python# -*- coding:gbk -*-import structimport socketimport timeimport syssys.path.append('./interface/')import trigger_server_pb2class TriggerClient(object):def __init__(self, ip, port):self.ip = ipself.port = portself.address = (ip, port)self.id = 0self.version = 0self.log_id = 0self.provider = "trigger_server"self.magic_num = int('949370fb', 16)self.reserverd = 0self.buf_size = 102400def talk(self, title):request = trigger_server_pb2.TriggerRequest()request.client_id = 1request.idea_id = 123456request.title = titletry:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect(self.address)msg = request.SerializeToString()body_len = struct.unpack('<I', struct.pack('>I', len(msg)))[0]nshead = struct.pack('!HHI16sIII',self.id,self.version,self.log_id,self.provider,self.magic_num,self.reserverd,body_len)packet = nshead + msgsock.send(packet)time.sleep(0.5)data = sock.recv(self.buf_size)response = trigger_server_pb2.TriggerResponse()body = data[len(nshead):]response.ParseFromString(body)for i in range(len(response.trigger_info_list)):query = response.trigger_info_list[i].queryprint queryexcept Exception, e:print eprint "exception occur"def main():relv_client = TriggerClient('10.95.22.53', 8757)input = sys.argv[1]output = sys.argv[2]with open(input, 'r') as fin, open(output, 'w') as fout:for line in fin:parts = line.rstrip().split('\\t')if len(parts) != 1:continuetitle = parts[0]relv_client.talk(title)if __name__ == "__main__":main()
这篇关于Python传输解析PB消息Client段程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!