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

时间:2014-06-26 05:43:31

标签: python arrays sockets

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

4 个答案:

答案 0 :(得分:26)

套接字是字节流,所以理想的是编写协议(阅读this

这是没有协议的基本示例,你应该关心缓冲区 - >的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()

答案 1 :(得分:4)

您可以在发送到套接字之前和接收端序列化对象反序列化它。查看this

答案 2 :(得分:2)

我使用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字符串,您可以将其解释为data.a

答案 3 :(得分:0)

我通过遍历数组中的每个项目,将其添加到单个字符串中解决了这个问题,但有一个重要字符,例如希腊字母或其他一些不常见的字符,然后通过套接字发送该字符串,然后拆分将收到的字符串重新放入另一侧的数组中,并删除新数组中的所有“分隔符”项。

例如,客户端

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

希望这有帮助!随时问您是否需要澄清! :)