python - 下面的代码通过客户端服务器网络发送一个字符串和列表
问题描述
我的代码没有将下面的列表发送到服务器端。如何将列表序列化为要通过 Clint 服务器网络发送的字节?
错误信息:info=pickle.loads(buf) _pickle.UnpicklingError: invalid load key,'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):
return eval(bts.decode('utf-8'))
上面的函数接受字节字符串并通过内置eval
函数将其转换为列表实例。在服务器端使用描述的功能。
推荐阅读
- json - 无法使用 rapidjson 处理浮点数数组
- c++ - How do I read this small program?
- java - 如何通过嵌套数据删除firebase中的父母?
- css - Css-grid:如何添加块并使其他元素向上移动?
- vue.js - 如何在嵌套的 v-for vuejs 中访问 id 并使用 axios 发布
- html - “了解更多”按钮在我的 html 代码中不起作用
- azure-devops - 通过管道部署 Azure App Service Canary
- reactjs - 使用有区别吗
和 在 NativeBase ui 库中? - hdf5 - 使用 HDFql 的 HDF5 文件比预期大
- vue.js - 如何通过 Axios 将文件和数据一起发布?