2016-11-20 91 views
0

据我所知,我现在总是解码用户输入到我的脚本(Python网络服务器)。
而且我总是对输出进行编码,例如当我通过websocket连接将数据从服务器发送到客户端时。我应该在json.dumps(...)之后编码吗?

我应该做的:

ws.send(json.dumps({'message' : message, 'id': i})) 

ws.send(json.dumps({'message' : message, 'id': i}).encode('utf8')) 

第一似乎确定在Python 2.7,因为它似乎的json.dumps(...)结果已被编码:

print type(json.dumps({'message' : message, 'id': i})) 
# <type 'str'> 

问:

我们是否应该.encode('utf8')或不经过json.dumps()

回答

1

通常,通过套接字连接发送和接收的数据是客户端和服务器之间的握手。客户端应该发送服务器可以接受的数据,不管它是utf-8还是latin

总之,做任何你喜欢的编码,但要记住,你的服务器预计相同。

关于你的问题:

我们应该.encode( 'utf-8')或不json.dumps后()?

下面是一个例子:

>>> a = {'a': 'Hello'} 
>>> str_a = json.dumps(a) # type(str_a) --> <class 'str'> 
>>> bytes_a = json.dumps(a).encode('utf8') # type(bytes_a) --> <class 'bytes'> 

允许检查两者的存储器大小:

>>> import sys 
>>> sys.getsizeof(str_a) 
63 
>>> sys.getsizeof(bytes_a) 
47 

克利字节串消耗比正常的字符串存储器更少。发送编码数据以减少网络使用是更好的选择。对于通过套接字进行的数据传输,这是一个需要考虑的主要因素。