web-dev-qa-db-ja.com

pythonでソケットを介して配列を送信する方法

配列の種類は([1,2,3,4,5,6],[1,2,3,4,5,6]) この。 PythonのSTREAM/TCPソケットで送信する必要があります。次に、受信側で同じ配列を受信する必要があります。

10
user3774358

ソケットに送信する前にオブジェクトをシリアル化し、受信側でオブジェクトをシリアル化解除することができます。チェック これ

4
hashbrown

ソケットはバイトストリームなので、プロトコルを記述するのが理想的です(読み取り 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()
27
danielpopa

私は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")
_

ここでは、_data.a_として解釈できるdata.get("a")を使用して、json文字列をデシリアライズします。

3
Leo103