实现python与java之间socket通信,其中数据带Decimal数据类型.
Decimal数据类型在网络传输中用的是可转换成string的bytes,因此
编码过程:Decimal->String->bytes->网络
解码过程:网络->bytes->String->Decimal
通信协议:类型+长度+数据

A: 从java到python传递时,需要将接收到的bytes转换成字符串:
    def recvString(self):
        nret = int.from_bytes(self.sock.recv(4), byteorder = 'big')
        if nret>0:
            rv=self.sock.recv(nret*2)
            sret = str(rv,encoding="utf-16be")
            return sret
        else:
            return ""

        def recvData():
                nval = self.recvString()
                #判断是否带小数部分
                p = re.search("(\d+)\.(\d+)", nval)
                if p:
                    #将小数部分最后是0的字符串去掉(若都是0,则.也要去掉)
                    ret = Decimal(re.sub(r'\.?(0+)$', "", nval))
                else:
                    ret = Decimal(nval) #只是整数部分.

B. pythonjava传递时,需要将Decimal转换成bytes
          def convertData(ntype, data):
                 .............................................
                #其中Decimal序列化部分
                sval = str(Decimal(data))
                dataLen = len(sval)
                fmt="!BI{}s".format(dataLen*2)
                #fmt为数据类型+数据长度+数据.
                ret = struct.pack(fmt, ntype, dataLen, sval.encode(encoding='utf_16be'))

python结合正则表达式,实现字符串的判断与替换还是比较灵活、强大。
python下的Decimal数据类型转换实现网络传递,不知道是不是有更好的办法,希望留言讨论.

10-18 06:28