私は、サーバーのようなスクリプトからクライアントのようなスクリプトにTCP経由で配列を送信しようとしています。配列は可変であるため、データはパケットを使用して送信され、クライアントで結合されます。Python3 TypeError:シーケンス項目0:バイトのようなオブジェクトがあると予想されます。intが見つかりました。
送信しようとしているデータは、Deep LearningのMNIST手書き数字データセットからのものです。サーバー側コードは次のとおりです。
tcp = '127.0.0.1'
port = 1234
buffer_size = 4096
(X_train, y_train), (X_test, y_test) = mnist.load_data()
test_data = (X_test, y_test)
# Client-side Deep Learning stuff
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((tcp, port))
x = pickle.dumps(test_data)
s.sendall(x)
s.close()
クライアント側スクリプトは、テストデータを使用してクラスを予測するニューラルネットワークを読み込みます。次のエラーで(my_pickle = ...)クライアントが受信したパケットに参加しようとしたとき
tcp = '127.0.0.1'
port = 1234
buffer_size = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((tcp, port))
print ('Listening...')
s.listen(1)
conn, addr = s.accept()
data_arr = []
while True:
data_pack = conn.recv(buffer_size)
if not data: break
data_pack += data
my_pickle = b"".join(data_pack)
test_data = pickle.loads(my_pickle)
print ("Received: " + test_data)
conn.close()
# Irrelevant Deep Learning stuff...
サーバが滞りなくデータを送信しますが、クライアントがクラッシュ:を聴くためのスクリプトは、データがあると述べました:
TypeError: sequence item 0: expected a bytes-like object, int found
送信されたデータを再作成して残りのスクリプトで使用するには、どのように結合をフォーマットする必要がありますか?
何かがサーバーのコード例では不足しているように見えるん:あなたは 'data'、まだ' data'を使用しません割り当てられる。 – Evert
'test_data = pickle.loads(data_pack)'を使い、 'join'行を削除してください:' data_pack'はすでにリストではなくバイトオブジェクトです。ここでのように、 '+ ='でバイト文字列に追加することができます。 – Evert