如何从UDP广播中读取JSON响应

时间:2016-02-26 16:17:33

标签: python json

我正在尝试从下面的代码中读取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)

1 个答案:

答案 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)