python - 下面的代码通过客户端服务器网络发送字符串和列表

标签 python

我的代码没有将下面的列表发送到服务器端。如何将列表序列化为要通过 Clint 服务器网络发送的字节?

错误消息:info=pickle.loads(buf) _pickle.UnpicklingError:无效的加载键,'H'。

import socket
import sys
from io import BytesIO 
import struct
import pickle
portnum = 5000
hostname = 'localhost'

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_addr = (hostname,portnum)
sock.connect(server_addr)
msg = "Hello There!"
numbers = [1,2,3,4,5]

sock.send(str.encode(msg)) 
serial_grades = pickle.dumps(numbers)
sock.send(serial_grades)

print("Message sent")
sock.close()
print ("Sending message: ", msg)
print ("done.")
sock.close()

import struct
import socket
import sys
from io import BytesIO 
import pickle

port = 5000
hostname = 'localhost'

def byte_to_string(bytes_):
    bytes_ = str(bytes_)
    return bytes_[2:len(bytes_) - 1] 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((hostname, port))
sock.listen(2)
print ("Ready. Listening to socket...")

conn,addr = sock.accept()
buf = conn.recv(8092)
buf_2 = conn.recv(8092)

response = byte_to_string(buf)
info=pickle.loads(buf)

print(info)
print ("We've got a message "+str(response))
sock.close()

最佳答案

我可以建议您通过网络发送列表对象的最简单方法之一。让我们定义两个函数。第一个是:

def list_to_bytes(lst): return lst.__repr__().encode('utf-8')

它获取列表实例并将其转换为字节字符串。您应该在客户端使用它。第二个函数是:

def bytes_to_list(bts): 返回 eval(bts.decode('utf-8'))

上面的函数接受字节字符串并通过内置的eval函数将其转换为列表实例。在服务器端使用所描述的功能。

关于python - 下面的代码通过客户端服务器网络发送字符串和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150577/

相关文章:

python - 在 AWS lambda 和 API 网关中部署 Flask sqlalchemy 应用程序

python - 在内存高效生成器中使用 PyMySql 的正确方法

Python 在 python 中实现 protobuf --decode-raw

python - 如何使用tcpdump和c++重新创建文件?

python - 在我的听众中如何检查是否设置了 dryrun 标志

python - libhdf5_serial.so.100 上的 h5py 导入错误

python - 为什么 Python 的 max() 函数会对带有前导空格的字符串设置较低的值?

python - 每次运行时清除小部件以前的输出

python - 如何以最 pythonic 的方式使用 Python 转换元组列表(可能使用 zip)

python - "for/range"range 大的时候会不会很耗内存?