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

Python 如何从UDP广播中读取JSON响应,python,json,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.S

我试图从下面的代码中读取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
if resp:
    print json.loads(resp)

您应该使用一个分隔符,例如换行符,这样您就可以得到一个数据流。然后可以在换行符上拆分并分别解析每个项目。当然,在发送数据包时,您必须自己添加换行符

JSON条目可能跨越多个数据包,您必须自己管理数据包分段。当您执行
s.recv(2048)
操作时,您将获得多达2048字节的数据,这些数据需要存储在缓冲区中:

buf = buf + s.recv(2048)
然后将此缓冲区拆分为完整响应和剩余响应:

resp = ''
if '\n' in buf:
    resp, buf = buf.split('\n', 1)
然后加载完整响应:

{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
if resp:
    print json.loads(resp)

您应该使用一个分隔符,例如换行符,这样您就可以得到一个数据流。然后可以在换行符上拆分并分别解析每个项目。当然,在发送数据包时,您必须自己添加换行符

JSON条目可能跨越多个数据包,您必须自己管理数据包分段。当您执行
s.recv(2048)
操作时,您将获得多达2048字节的数据,这些数据需要存储在缓冲区中:

buf = buf + s.recv(2048)
然后将此缓冲区拆分为完整响应和剩余响应:

resp = ''
if '\n' in buf:
    resp, buf = buf.split('\n', 1)
然后加载完整响应:

{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
if resp:
    print json.loads(resp)

你试过了吗?当我不确定你试过什么的时候,很难对我更有帮助。你试过了吗?当我不确定你尝试过什么时,很难提供更多帮助。这是我的问题,我看不出如何区分行。无论我尝试什么,这两个响应似乎都是一个响应。我已经编辑了以演示如何使用接收缓冲区。这对你有意义吗?非常感谢你的时间。是的,这很有意义,但我得到了一个“NameError:name'buf'未定义”,我将此作为后面的第一行,而True:
buf
是一个变量,您必须首先声明,是的。这是我的问题,我看不到如何分隔行。无论我尝试什么,这两个响应似乎都是一个响应。我已经编辑了以演示如何使用接收缓冲区。这对你有意义吗?非常感谢你的时间。是的,这很有意义,但我得到了一个“NameError:name'buf'未定义”,我将此作为后面的第一行,而True:
buf
是一个必须首先声明的变量,是的。