我正在尝试从下面的代码中读取UDP广播响应。找到两个服务器,并为它们返回信息。我想做的是为每个回复制作一个词典,但我似乎无法将个别回答分开。请问有人可以提出一些建议吗?
import socket
import json
socket.setdefaulttimeout(.5)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
s.sendto("D", ('255.255.255.255', 30303))
while True:
response = s.recv(2048)
response = json.loads(response)
print response
这是回复:
{u'Product': u'OWServer_v2-Enet', u'Name': u'OWServer_v2-Enet_19', u'IP': u'10.0.1.19', u'TCPIntfPort': u'0', u'HTTPPort': u'80', u'MAC': u'00-04-A3-B1-F1-86', u'Bootloader': u'POST', u'FWVer': u'1.44', u'NETBios': u'EDSOWSERVER19 '}
{u'Product': u'OWServer_v2-Enet', u'Name': u'OWServer_v2-Enet_20', u'IP': u'10.0.1.20', u'TCPIntfPort': u'0', u'HTTPPort': u'80', u'MAC': u'00-04-A3-C1-43-86', u'Bootloader': u'POST', u'FWVer': u'1.44', u'NETBios': u'EDSOWSERVER20 '}
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
socket.timeout: timed out
使用您的建议,如果我已正确完成,则会给我ValueErrors。
buf = ""
while True:
buf = buf + s.recv(2048)
resp = ''
if "\n" in buf:
resp, buf = buf.split("\n", 1)
if resp:
print json.loads(resp)
raise ValueError(errmsg("Expecting property name", s, end - 1))
ValueError: Expecting property name: line 1 column 32 (char 32)
答案 0 :(得分:2)
您应该使用分隔符,例如换行符,以便获得JSON-lines的流。然后,您可以拆分换行符并分别解析每个项目。但是,当然,您必须在发送数据包时自行添加换行符。
JSON条目可能跨越多个数据包,您必须自己管理数据包分段。当您执行s.recv(2048)
时,您需要获得最多2048个字节的数据,您需要将其存储在缓冲区中:
buf = buf + s.recv(2048)
然后将此缓冲区拆分为完整响应,其余部分:
resp = ''
if '\n' in buf:
resp, buf = buf.split('\n', 1)
然后加载完整的回复:
if resp:
print json.loads(resp)