2017-11-28 5 views
-1

私は、サーバーのようなスクリプトからクライアントのようなスクリプトに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 

送信されたデータを再作成して残りのスクリプトで使用するには、どのように結合をフォーマットする必要がありますか?

+0

何かがサーバーのコード例では不足しているように見えるん:あなたは 'data'、まだ' data'を使用しません割り当てられる。 – Evert

+0

'test_data = pickle.loads(data_pack)'を使い、 'join'行を削除してください:' data_pack'はすでにリストではなくバイトオブジェクトです。ここでのように、 '+ ='でバイト文字列に追加することができます。 – Evert

答えて

0

私は、コミュニケーションプロトコルを処理するためにPickleとZeroMQの両方を使用しました。この方法の利点は、複数のデータパッケージを送信できることです。

ip = '127.0.0.1' 
port = '1234' 

# ZeroMQ context 
context = zmq.Context() 

# Setting up protocol (client) 
sock = context.socket(zmq.REQ) 
sock.bind('tcp://'+ip+':'+port) 
print('Waiting for connection at tcp://'+ip+':'+port+'...') 
sock.send(pickle.dumps(X_send)) 
X_answer = sock.recv() 
sock.send(pickle.dumps(y_send)) 
print('Data sent. Waiting for classification...') 
y_answer = sock.recv() 
print('Done.') 

とサーバ側で:クライアント側で

# ZeroMQ Context 
context = zmq.Context() 

# Setting up protocol (server) 
sock = context.socket(zmq.REP) 

ip = '127.0.0.1' 
port = '1234' 

sock.connect('tcp://'+ip+':'+port) 
print('Listening to tcp://'+ip+':'+port+'...') 

X_message = sock.recv() 
X_test = pickle.loads(X_message) 
sock.send(pickle.dumps(X_message)) 
y_message = sock.recv() 
y_test = pickle.loads(y_message) 
print('Data received. Starting classification...') 

# Classification process 

sock.send(pickle.dumps(y_message)) 
print('Done.') 
関連する問題