実現したいこと・質問
-
socket通信で2Dのnumpy配列を汎用的に(サイズやデータ型もふくめて)通信したい。
-
以下に示すようにクライアント側とサーバ側それぞれにサイズやデータ型を予め設定したり、サイズやデータ型を改めてクライアント側からサーバー側へ通信することで実装できますが、このような暫定的な方法ではなく、2Dのnumpy配列を転送する推奨された方法はありますか?
以下、前提
- 現在、2Dのnumpy通信を受信側、送信側に予めサイズやデータ型を設定することで通信できている。
クライアント側
python
1import socket 2import numpy as np 3 4PORT = 11113 5BUFFER_SIZE = 1024 6 7with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 8 s.connect(('server_container', PORT)) 9 data = np.arange(30) 10 data = np.reshape(data,(5,6)) 11 print(data) 12 data = data.tostring() 13 s.send(data) 14 data2 = s.recv(BUFFER_SIZE) 15 data2 = np.fromstring(data2,dtype=np.int64) 16 data2 = np.reshape(data2,(5,6)) 17 print(data2)
サーバー側
python
1import socket 2import numpy as np 3 4PORT = 11113 5BUFFER_SIZE = 1024 6 7with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 8 s.bind(('0.0.0.0', PORT)) 9 s.listen() 10 while True: 11 (connection, client) = s.accept() 12 try: 13 print('Client connected', client) 14 data = connection.recv(BUFFER_SIZE) 15 data = np.fromstring(data,dtype=np.int64) 16 data = np.reshape(data,(5,6)) 17 print(data) 18 data = data.tostring() 19 connection.send(data) 20 finally: 21 connection.close()
試したこと(追記)
np.saveとnp.loadを用いコードを書き直しし、互いに通信しようとしたところ、
サーバ側のnp.loadでデシリアライズできませんでした。
- サーバー側19行目「print(data2)」のブレークポイントでデバッグ
debug
1data2 2array(<function save at 0x7fd590150f28>, dtype=object)
以下、修正コード
- クライアント側
python
1from io import BytesIO 2 3import socket 4import numpy as np 5 6PORT = 11113 7BUFFER_SIZE = 2048 8out = BytesIO() 9 10with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 11 s.connect(('server_container', PORT)) 12 data = np.arange(30) 13 data = np.reshape(data,(5,6)) 14 print(data) 15 np.save(out, np.save) 16 binary = out.getvalue() 17 s.send(binary) 18 data2 = s.recv(BUFFER_SIZE) 19 data2 = np.load(BytesIO(data2), allow_pickle=True) 20 print(data2)
- サーバー側
python
1from io import BytesIO 2 3import socket 4import numpy as np 5 6PORT = 11113 7BUFFER_SIZE = 2048 8out = BytesIO() 9 10with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 11 s.bind(('0.0.0.0', PORT)) 12 s.listen() 13 while True: 14 (connection, client) = s.accept() 15 try: 16 print('Client connected', client) 17 data = connection.recv(BUFFER_SIZE) 18 data2 = np.load(BytesIO(data), allow_pickle=True) 19 print(data2) 20 np.save(out, data2) 21 binary = out.getvalue() 22 connection.send(binary) 23 finally: 24 connection.close()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/06 04:35
2020/04/06 05:44
2020/04/06 05:51
2020/04/06 05:57