我在2台主机上具有udp侦听器功能。它的行为应该是这样的:每当host1接收到以“ 10.0.0”开头的udp消息时,它将把列表转换为字符串,并通过udp套接字发送它。如果到达host1的任何其他消息,它将把消息从字符串转换为列表。这是代码:
def read_udp(s):
data,addr = s.recvfrom(1024)
if data.startswith('10.0.0'):
data_split = data.split(" ")
num = int(data_split[1])
ipToTransfer = address
transferStart = start[-num:]
msg = pickle.dumps(transferStart)
udp_send(msg, ipToTransfer)
else:
recvStart = pickle.loads(data)
def udp_send(s, ip):
UDP_IP = ip
if(type(s) == str):
MESSAGE = s
else:
MESSAGE = pickle.dumps(s)
print ("UDP target IP & port:", UDP_IP, port)
#print ("message:", MESSAGE)
sock3 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock3.sendto(MESSAGE, (UDP_IP, port))
当列表的长度在60〜65之间时,此代码可以正常工作,但是当列表长度超过该值时,我会遇到一个错误:
File "process.py", line 273, in <module>
run
File "process.py", line 127, in read_udp
recvStart = pickle.loads(data)
File "/usr/lib/python2.7/pickle.py", line 1388, in loads
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 864, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 960, in load_float
self.append(float(self.readline()[:-1]))
ValueError: could not convert string to float
这是我的代码的第127行:recvStart = pickle.loads(data)
怎么了?我无法弄清楚这个问题,因为当我的列表长度小于60时,这个问题就起作用了。
我测试了2种情况。在前一个列表中,有8个元素,每个pickle.dumps的输出如下:
列表中的元素:1549286402.7232 pickle.dump输出: aF1549286402.7232
但是现在当我用列表中的60个元素进行测试时,列表中每个元素的输出都像以前一样,但是列表的字符串表示形式的末尾有一个a.
。这是什么,这是我出现问题的原因吗?