zoukankan      html  css  js  c++  java
  • python client端收不到server端构造的结构体数据

    python thrift server开发中发现thrift结构体中存在中文字符的时候client端收不到,后来发现是本身数据是unicode编码,在经过./python2.7/site-packages/thrift/protocol/TBinaryProtocol.py 这个文件的121行处理字符串的地方需要改一下,对于unicode编码的地方应该强转一下utf8,因为默认走的是utf8

    find -name TBinaryProtocol.py

    找到/python2.7/site-packages/thrift/protocol/TBinaryProtocol.py 

    def writeString(self, str):
      if type(str) is unicode:#
        str = str.encode('utf-8')#
      self.writeI32(len(str))
      self.trans.write(str)

    之后在运行的时候client端对于中文编码问题完美解决~

    对于非中文的地方不需要修改

    #!/usr/bin/env python
    #coding:utf-8

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    _author_ = 'liqianqian@didichuxing.com'
    import socket
    from thrift.transport import TSocket
    from thrift.transport import TTransport
    from thrift.protocol import TBinaryProtocol
    from thrift import TSerialization
    from thrift import Thrift
    from thrift.server import TServer

    sys.path.append("../data/datalib/gen-py")
    import logging#这两行必须要添加,否则会报thrift找不到handler绑定错误
    logging.basicConfig(level=logging.DEBUG)#这两行必须要添加,否则会报thrift找不到handler绑定错误
    from data_connect import DataConnect
    from data_connect.ttypes import *
    from utils.es_data import *
    from order.ttypes import *
    from price.ttypes import *
    from route.ttypes import *
    from user_profile.ttypes import *

    class DataConnectHandler:
      def GetObject(self,struct_name, product_id, objid):
        fieldname = fetchunikey(struct_name, product_id)
        data_id = fetchdataid(fieldname, objid, struct_name, product_id)
        data_obj = construct_data(data_id, product_id)
        return data_obj

    handler = DataConnectHandler()
    processor = DataConnect.Processor(handler)
    transport = TSocket.TServerSocket("localhost", 9090)
    #tfactory = TTransport.TBufferedTransportFactory()
    tfactory = TTransport.TFramedTransportFactory()
    pfactory = TBinaryProtocol.TBinaryProtocolFactory()
    server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

    #用下面这两个函数可以查看未经过网络的时候在协议层编码是不是改变了

    def serialize(obj):
      trans = TTransport.TMemoryBuffer()
      prot = pfactory.getProtocol(trans)
      obj.write(prot)
      return trans.getvalue()

    def deserialize(data):
      prot = pfactory.getProtocol(TTransport.TMemoryBuffer(data))
      ret = Route()
      ret.read(prot)
      return ret

    obj = Route(route_setuptime=None, to_address=None, from_address=None, dest_poi_id=None, county=None, seat_count=None, create_time=1542012692, navi_distance=7, business_area=None, user_id=2001, setup_upper=None, to_county=None, county_name=None, total_passenger_count=None, channel=1, starting_poi_id=None, from_name=u'u5317u4eac', to_county_name=None, setup_type=None, from_lat=39.97, routeid=4014, to_name=None, from_business_area=None, to_lng=116.41, departure_time=u'17:21', to_lat=40.02, auto_striv_settings=None, navi_dis_type=0, route_name=None, setup_lower=None, from_lng=116.36, coord_type=None, from_city_id=1, to_city_id=1, route_eta_time=-1)
    data = serialize(obj)
    print deserialize(data)

  • 相关阅读:
    (转)AJAX开发中常用的Firefox Plugins
    几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比
    Excel Oledb设置
    统计数据库中所有表的基本信息
    sql 分页加排序等写法
    sql 创建索引
    SQL Server复制需要有实际的服务器名称才能连接到服务器 错误解决方案
    转转:解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系。"
    Reflector7.5.2.1的Bug
    查询数据库所有依赖
  • 原文地址:https://www.cnblogs.com/qianqian-li/p/9957807.html
Copyright © 2011-2022 走看看