2014-07-12 22 views
1

简而言之,我在服务器上有一个名为Tuples(记录)的字典(dictData[name]=namedTuple)。如何发送namedtuples字典或只是一个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转换为字符串。

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

任何帮助将不胜感激。

回答

3

套接字只能发送和接收字节,所以你需要将你命名的元组和字典序列化到别的东西上。

例如,您可以使用JSON生成元组和字典的字符串表示形式。该json library产生编码时,你需要编码成UTF-8(或类似)一个(Unicode)的字符串产生字节:

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对象,它可以在不编码的情况下写入套接字。

+0

实际上,在这种情况下更好的编码是[pickle](https://docs.python.org/2/library/pickle.html)。 – whereswalden

+2

@ whereswalden:这取决于在另一边正在倾听的内容。 –

+0

@Martijn你提到的命令,可以按名称排序吗? – JSchwartz

相关问题