[英]Send list over TCP socket in Python
我想通過 python 中的 TCP 套接字發送一個列表。 然后我必須在接收端收到相同的列表。 我目前在發送列表的方式方面遇到錯誤。 我也嘗試將列表轉換為 str() 格式並在發送前對其進行編碼,但它也沒有工作。
這是我的客戶端:
import socket
import pickle
HEADER = 40
IP = '127.0.0.1'
PORT = 9669
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP, PORT))
package = [1, 5, 0, 0, 0, 'u', 's', 'e', 'r', '1', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send_package = pickle.dumps(send_package)
client_socket.send(send_package)
這是我的服務器端
import socket
import pickle
HEADER = 40
IP = '127.0.0.1'
PORT = 9669
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((IP,PORT))
server_socket.listen()
client_socket, client_address = server_socket.accept()
receive_message = client_socket.recv(HEADER)
message = pickle.loads(receive_message)
print(type(message))
print(message)
並且服務器端的終端返回這個:
Traceback (most recent call last):
File "c:/Users/Duong Dang/Desktop/authen/server.py", line 17, in <module>
message = pickle.loads(receive_message)
_pickle.UnpicklingError: pickle data was truncated
您的代碼有兩個問題。 第一個是您客戶端的一個簡單的錯字。 您應該將send_package = pickle.dumps(send_package)
更改為send_package = pickle.dumps(package)
。 您這樣做是因為您試圖將package
變量腌制到新的send_package
變量中,並且您不能將新變量定義為 function 本身。
您的代碼的主要問題是 header。 您定義的HEADER
變量是指您願意發送的數據量。 在您的情況下,您選擇了 40 個再見。 問題是您的列表超出了您分配的大小。 因此,您只能發送其中的一小部分。
這是一個簡單的修復,只需將HEADER
更改為更大的數字,如4096
,一切都會正常工作。 這是文檔中的描述: socket.recv
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.