如何将一个namedtuples或只是一个namedTuple的dict发送到客户端(套接字)?

时间:2014-07-12 17:40:06

标签: python sockets python-3.x

简单地说,我在服务器上有一个namedTuples(记录)字典(dictData[name]=namedTuple)。

目标:我希望通过SOCKET连接将整个事物(dictData)或单个实例(dictData[key])发送到客户端,以便打印(显示在屏幕上)。

要发送单个记录,我尝试执行以下操作:

response = dictData["John"]
print (response) #ensure it is the correct record
s.send(response)

然而,这会产生以下错误:

"TypeError: 'record' does not support the buffer interface"

我曾尝试对其进行编码并将其转换,但我所做的一切似乎都有效。我甚至愿意将它转换为STRING并发送字符串,但我似乎无法找到如何将namedTuple转换为字符串。

然后,不知道从哪里开始将整个字典发送到客户端以便他们可以打印整个字典?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

套接字只能发送和接收字节,因此您需要将命名元组和字典序列化为其他内容。

例如,您可以使用JSON生成元组和字典的字符串表示形式。 json library在编码时生成(unicode)字符串,您需要将其编码为UTF-8(或类似)以生成字节:

import json

# sending one tuple
response = json.dumps(dictData["John"])
s.send(response.encode('utf8'))

# sending all of the dictionary
response = json.dumps(dictData)
s.send(response.encode('utf8'))

这将保留命名的元组属性名称;这些值将作为JSON数组发送(因此是有序列表)。

另一种选择是使用pickle module;这将要求另一方的侦听器也在Python 中编码,以便从完全相同的位置导入相同的record命名元组类型。

当Pickle加载数据时,会包含namedtuple类型的完全限定名称的名称,您必须能够在套接字的两端导入该类型。如果您在全局级别的模块中有一行:

record = namedtuple('record', 'field1 field2 field3')

然后from yourmodule import record是可能的,但完全相同的导入也应该在另一边工作。

pickle.dumps()生成一个bytes对象,可以在不进行编码的情况下写入套接字。