Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2547650
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4191
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: Python/Ruby

2018-07-05 15:45:57

实现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数据类型转换实现网络传递,不知道是不是有更好的办法,希望留言讨论.

阅读(1331) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~