как отправить массив через сокет в Python

У меня есть массив вида ([1,2,3,4,5,6],[1,2,3,4,5,6]) этого. Я должен отправить его через сокет STREAM / TCP в python. Затем я должен получить тот же массив на принимающем конце.

3 ответов


вы можете сериализовать объект перед отправкой в сокет и десериализовать его на приемном конце. Проверка этой


сокеты-это потоки байтов, поэтому идеально подходит для записи вашего протокола (read этой)

это основной пример без протокола, и вы должны заботиться о 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 (так как я слышал, что рассол небезопасен)

клиент:

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