web-dev-qa-db-fra.com

comment envoyer un tableau sur un socket dans python

J'ai une sorte de tableau de ([1,2,3,4,5,6],[1,2,3,4,5,6]) ce. Je dois l'envoyer sur un socket STREAM/TCP en python. Ensuite, je dois recevoir le même tableau à la réception.

10
user3774358

Vous pouvez sérialiser l'objet avant de l'envoyer vers le socket et à la fin de la désérialiser. Vérifiez ceci

4
hashbrown

Les sockets sont des flux d'octets, donc l'idéal est d'écrire votre protocole (lire this )

Ceci est un exemple de base sans protocole et vous devez vous soucier de buffer -> recv (). S'il est trop petit, vos données seront coupées. C'est pourquoi vous devez implémenter un protocole si vous envoyez des données de taille inconnue.

Client:

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)

Serveur:

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()
27
danielpopa

J'ai résolu ce problème en utilisant json (car j'ai entendu que le cornichon n'est pas sûr)

client:

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

serveur:

import json
...
data = socket.recv(1024)
data = json.loads(data.decode())
arr = data.get("a")
var = data.get("c")

Ici, nous désérialisons la chaîne json, en utilisant data.get("a") que vous pouvez interpréter comme data.a

3
Leo103