如何在Python中通过套接字发送数组

18 投票
4 回答
77682 浏览
提问于 2025-04-18 11:08

我有一个数组,像这样 ([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 之前,你可以先把它“序列化”,然后在接收端再把它“反序列化”。简单来说,序列化就是把一个对象转换成可以通过网络传输的格式,而反序列化则是把这个格式再转换回原来的对象。想了解更多,可以查看这个链接

撰写回答