Python 如何从UDP广播中读取JSON响应
我试图从下面的代码中读取UDP广播响应。找到两台服务器,并返回这两台服务器的信息。我想做的是为每个回答做一个记录,但我似乎无法区分每个回答。有谁能提出一些建议吗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
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
是一个必须首先声明的变量,是的。