前提・実現したいこと
python3.8によるsocketを使ったserver-client通信をしようとしています.
具体的にはコネクションを張ったのち,以下のような流れで動作します.
- send.pyが送信データサイズと送信データを送信
- recv.pyが送信データサイズを受信し,サイズ分もう一度受信
- recv.pyが送信データをコピーして送信
- send.pyで送信データを受信して表示
その際,UnpicklingErrorが発生しプログラムが途中で終了してしまいます.
発生している問題・エラーメッセージ
Traceback (most recent call last): File "recv.py", line 25, in <module> d = pickle.loads(full_data) _pickle.UnpicklingError: unpickling stack underflow
該当のソースコード
python
1####send.py#### 2import sys 3import socket 4import pickle 5 6BUF_SIZE = 1024 7 8send_msg = [1,2,3,4] 9msg_len = sys.getsizeof(send_msg) 10 11with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 12 s.connect(('127.0.0.1', 50001)) 13 14 msg = pickle.dumps(msg_len) 15 s.send(msg) 16 msg = pickle.dumps(send_msg) 17 s.send(msg) 18 print("send msg") 19 20 full_msg = b'' 21 while True: 22 msg = s.recv(BUF_SIZE) 23 full_msg += msg 24 if len(msg) < BUF_SIZE: 25 break 26 print(pickle.loads(full_msg))
python
1####recv.py#### 2import socket 3import select 4import pickle 5 6with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 7 s.bind(('127.0.0.1', 50001)) 8 s.listen(1) 9 10clientsock, address = s.accept() 11 12 full_data = b'' 13 msg_len = clientsock.recv(28) # size of int 14 msg_len = pickle.loads(msg_len) 15 print(type(msg_len)) 16 print(msg_len) 17 18 while msg_len > 0: 19 data = clientsock.recv(1024) 20 print(data) 21 full_data += data 22 msg_len -= 1024 23 if msg_len <= 0: break 24 25 print(type(full_data)) 26 print(full_data) 27 d = pickle.loads(full_data) 28 print(d) 29 clientsock.send(pickle.dumps(d))
試したこと
数回に一度送受信が正常終了しましたが,ほとんどエラーが発生しました.
何か疑問点があればお聞きください.
よろしくお願い致しします.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/11 13:09