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

18

我有一个数组,像这样 ([1,2,3,4,5,6],[1,2,3,4,5,6]) ,我需要在Python中通过STREAM/TCP套接字发送它,然后在接收端接收相同的数组。


找到一种将其编码为字节的方法。最好的方式可能取决于您的数据。您是否总是想发送小数字数组? - Ry-
顺便提一下...看起来那是由数组(列表)组成的元组,而不是一个真正的数组。另外...pickle 可能会对你有所帮助: https://docs.python.org/3.2/library/pickle.html?highlight=pickle#pickle - omu_negru
实际上我想发送一个5x5的矩阵,其中包含浮点值。请告诉我最好的方法来完成这个任务,如果可能的话,请提供代码。谢谢。 - sg.dev
Pickle 可以为您服务,但请记住,反序列化外部 Pickle 不安全(即如果您无法保证 Pickle 的来源,则应该使用其他序列化格式,如 json)。 - thebjorn
3
抱歉,我们不会为您完成工作。请告诉我们您尝试过哪些方法没有成功。 - thebjorn
你之前问过这个问题。http://stackoverflow.com/questions/24407767/how-to-send-a-large-array-over-tcp-socket-in-python-is-it-possible-to-send - thebjorn
4个回答

30

套接字是字节流,因此最好编写您自己的协议(请阅读这篇文章)。

以下是一个简单的例子,没有协议,您应该关注缓冲区大小 -> 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()

我该如何打印数组在特定索引处的值? - Anurag Singh
@AnuragSingh 给出一个数据示例和你需要的结果。 - danielpopa

7
您可以在将对象发送到套接字之前对其进行序列化,并在接收端进行反序列化。请参考此链接了解更多信息。

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


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")

希望这有所帮助!如果您需要澄清任何内容,请随时提问!: )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接