通过套接字发送数据后,它不会被转换回列表

时间:2016-10-25 17:35:45

标签: python sockets pickle

所以我可以发送字符串就好了。我想要做的是或多或少地发送列表的字符串表示。我知道很多将列表转换为应该能够作为字符串发送然后转换回来的内容。

#on sending
l = [1,2,3,4]
l_str = str(l)

#on receiving 
l = ast.literal_eval(received_data)

## or pickle
l = pickle.dumps([1,2,3,4])

##then
l = pick.loads(received_data)
然而,我的问题似乎是接收和发送之间发生了奇怪的事情。

现在我有了这个

msg = pickle.dumps([sys.stdin.readline(), person])
s.send(msg)

其中sys.stdin.readline()是键入控制台的行,person是包含某人姓名的变量。

然后我就这样收到它。

d1 = sock.recv(4096)
pickles = False                
try:
    d1 = pickle.loads(d1)
    pickles = True

如果我只是通过我的第一个方法创建列表字符串,然后使用ast.literal_eval或使用pickle,它实际上从未转换回我想要的列表,这无关紧要。

我目前有一个try语句,因为我知道有时候我实际上不会找回使用pickle倾倒的东西或者什么不是,所以我的想法是它应该失败的那些和在除外只需继续,就像收到的数据格式正确一样。

我尝试取消它们时产生的错误是

 Traceback (most recent call last):
  File "telnet.py", line 75, in <module>
    d1 = pickle.loads(d1)
  File "/usr/local/lib/python2.7/pickle.py", line 1382, in loads
    return Unpickler(file).load()
  File "/usr/local/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
KeyError: '\r'

pickle.loads永远不会成功,因为泡菜永远不会是真的......任何想法?

编辑:我有整体解决方案。对我来说问题实际上不在你在错误中看到的文件中,即telnet.py,而是在另一个文件中。我没有意识到中间服务器正在接收输入并进行更改。然而,经过一些建议,我意识到这正是发生了什么。

1 个答案:

答案 0 :(得分:0)

我的问题实际上来自另一个文件。当时我没有意识到这是一个聊天服务器/客户端很重要。然而,聊天服务器实际上是将数据发送回它格式化的客户端。老实说,我不知道那是怎么回事,但那就是发生了什么。