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

如何在python中通过套接字发送数组,python,arrays,sockets,Python,Arrays,Sockets,我有一个数组类型的([1,2,3,4,5,6],[1,2,3,4,5,6])。我必须在python中通过流/TCP套接字发送它。然后我必须在接收端接收相同的数组。您可以在发送到套接字之前序列化对象,并在接收端对其进行反序列化。检查套接字是字节流,因此理想的方法是编写协议(读取) 这是一个没有协议的基本示例,您应该关注buffer->recv()。如果太小,您的数据将被切断。这就是为什么如果发送未知大小的数据,就应该实现一个协议 客户: import socket, pickle HOST =

我有一个数组类型的
([1,2,3,4,5,6],[1,2,3,4,5,6])
。我必须在python中通过流/TCP套接字发送它。然后我必须在接收端接收相同的数组。

您可以在发送到套接字之前序列化对象,并在接收端对其进行反序列化。检查

套接字是字节流,因此理想的方法是编写协议(读取)

这是一个没有协议的基本示例,您应该关注buffer->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()

我使用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")

在这里,我们使用
data.get(“a”)
反序列化json字符串,您可以将其解释为
数据。a

我通过检查数组中的每个项,将其添加到单个字符串中,但使用一个有效字符,例如希腊字母或其他一些不常见的字符,然后通过套接字发送该字符串来解决此问题,然后将接收到的字符串拆分回另一侧的数组中,并删除新数组中的所有“分隔符”项

例如,客户端

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

希望这有帮助!请随时询问您是否需要澄清任何事情!:)

找到将其编码为字节的方法。最好的方法可能取决于您的数据。您是否总是希望发送小数量的数组?作为旁注…它看起来像数组的元组(列表),而不是实际的数组。另外…pickle可能对你很有用:实际上我想发送一个5x5矩阵,包含浮点值。请告诉我实现这一点的最佳方法。如果可能,请使用代码。谢谢pickle可以很好地为您服务,但是请记住,取消pickle是不安全的(即,如果您不能保证pickle的来源,那么您可能应该使用其他序列化格式,如json)。很抱歉,我们不为您做工作。。。告诉我们您尝试了哪些不起作用的方法…如何打印特定索引处的数组值?@AnuragSingh给出了一个数据示例和您需要的结果。