如何在Python中通过套接字发送数组
我有一个数组,像这样 ([1,2,3,4,5,6],[1,2,3,4,5,6])
。我需要通过一个流(STREAM)或者TCP套接字在Python中发送这个数组。然后在接收端,我需要接收到同样的数组。
4 个回答
1
我解决这个问题的方法是,逐个查看数组里的每个项目,把它们加到一个字符串里,不过我用了一个特别的字符,比如希腊字母或者其他不常用的字符。然后把这个字符串通过网络发送过去,接收方再把收到的字符串拆分回数组,并把新数组里的所有“分隔符”项去掉。
比如,在客户端的代码是:
for item in myArray:
print("item: ", item)
myArrayString= myArrayString+ str(item) + "Δ"
print(myArrayString)
myServer.send((myArrayString).encode())
然后在服务器端的代码是:
files = myconnection.recv(50000)
files = files.decode()
myArray = files.split('Δ')
for myItem in myArray:
print(myItem)
print("End Of Items in Array")
希望这能帮到你!如果有任何不明白的地方,随时问我哦!: )
7
我用json解决了这个问题(因为我听说pickle不安全)
客户端:
import json
...
arr1 = [1,2,3]
arr2 = [4,5,6]
someVar = 7
data = json.dumps({"a": arr1, "b": arr2, "c": someVar})
socket.send(data.encode())
服务器:
import json
...
data = socket.recv(1024)
data = json.loads(data.decode())
arr = data.get("a")
var = data.get("c")
在这里,我们把json字符串转换回原来的数据格式,使用的是 data.get("a")
,你可以把它理解为 data.a
30
套接字(Sockets)是字节流,所以最好自己写一个协议(可以参考这篇文章)。
下面这个例子是一个没有协议的基本示范,你需要注意缓冲区和接收数据(recv())。如果缓冲区太小,你的数据就会被截断。所以,如果你发送的数据大小不确定,就应该实现一个协议。
客户端:
import socket, pickle
HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
arr = ([1,2,3,4,5,6],[1,2,3,4,5,6])
data_string = pickle.dumps(arr)
s.send(data_string)
data = s.recv(4096)
data_arr = pickle.loads(data)
s.close()
print 'Received', repr(data_arr)
服务器:
import socket
HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(4096)
if not data: break
conn.send(data)
conn.close()
7
在发送对象到网络 socket 之前,你可以先把它“序列化”,然后在接收端再把它“反序列化”。简单来说,序列化就是把一个对象转换成可以通过网络传输的格式,而反序列化则是把这个格式再转换回原来的对象。想了解更多,可以查看这个链接。